目录
文件属性
chown更改所有者
chgrp更改所属组
文件权限rwx
chmod修改权限
默认权限umask
权限判定的顺序
特殊权限SUID,SGID,sticky
隐藏权限chattr,lstattr
ACL
在说权限之前,我们应该简单的了解文件的属性,和如何更改文件属性:
通过我们上面的图片我们可以看出来文件的一些基本属性,有权限,链接数,所有者和所属组,文件大小,修改时间,文件名等,我们先来介绍两个用来更改所有者和所属组的命令,然后对权限的管理展开讨论。
修改文件所有者
命令:chown
格式:chown [option] newuser filename
选项:
-R 递归更改
--reference source target 参照source修改target
对于chown来说,既可以更改所有者其实也可以更改所属组,我们可以利用chown user:group filename直接更改所有者和所属组,或者chown :group filename来更改所属组,只不过,前者只能由root来完成,后者可以是普通用户,但是用户必须是文件的所有者,并且还要是已经加入了目标组才可以。我们做一个简单的演示:
接下来是chgrp用来修改所属组的,这个命令是所有用户都可以使用的,但是,用户必须是文件的所有者,并且属于目标组才可以,否者不能更改,基本和上图一样,不在做演示。
修改所属组
命令:chgrp
格式:chgrp [option] group filename
选项:
-R 递归更改
--reference source target 参照source修改target
接下来才是最重要的,权限!我们知道每个文件都有所有者,所属组和其他人,而每一位都是有对应的权限的,这样的设计目的试问了保证隐私和文件的安全,所有者对应的是u,所属组对应的是g,其他人对应的是o,而每个文件针对每一类访问者都有三种基本权限:r:Readable;w:Writable;x:eXcutable,我们通过对三类访问者设定不同的rwx值就可以控制访问者对文件的权限。
无论是对于文件还是目录,都是有rwx权限,但是,目录的rwx权限却和文件的rwx权限是不一样的,此外对于目录的设置还有一个X权限,我们会在后面说到。我们先说一下,rwx权限所对应的数字意义:
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
在一般情况下,我们会选择使用数字来更改权限,例如742 = -rwxr--w-;621 = -rw--w---x
有权限,自然可以修改权限,下面我们来说一个更改文件权限的命令chmod。
修改文件权限
命令:chmod
格式:chmod [option] mode[,mode] filename
格式:
mode:修改一类权限
u= g= o= ug= uo= go= ugo=
mode:修改一些用户的某个权限
u+ u- g+ g- o+ o-
--reference source target参照source修改target
-R递归修改权限
我们可以通过上面的方式对文件权限进行修改,为了方便,我们也可以通过使用数字来对权限进行修改,比如:chmod 744 test1.txt。
我们刚才说,还有一个针对于目录的大X权限,这是啥嘞,这是由于我们我们会修改目录权限至少为x,但是,我们如果进行递归修改的话,会把文件也设置成x权限,由于x对于文件来说是可执行权限,很不安全,所以我们在递归修改目录权限时,可以使用X权限,这样就不会将目录下面的文件加上x权限了,可是如果我们目录下的某一个文件无论所有者所属组还是其他人只有有一个用于x权限,使用X修改目录权限时依然会将此文件所有者所属组和其他人都加上x权限。但是一般情况下我们可以不用X权限的,因为给目录的默认权限是有x权限的,什么是默认权限,我们在下面来讲。
我们无论是新建文件还是目录,当我们建好后都会有一些默认的权限,(root的默认权限和普通用户的不同),这些默认权限是哪里来的呢,为什么要这样设定默认权限?首先我们先说哪里来的,我们可以使用umask查看当前用户的默认权限,如果你是一般用户,你会发现默认权限是0002 root用户是0022,后三位是普通权限位,第一位是特殊权限位,我们先来说普通权限位。当umask中全部是偶数时,可以直接减,当umask中包含奇数时,对于目录直接减,对于文件,在奇数所在的位减完后加一。默认全局配置文件在/etc/bashrc中:(个人配置在~/.bashrc)
这时候我们会感觉很奇怪,为啥呢,以root用户来说,我们默认的权限是022,但是我们的创建的目录权限是755:rwxr-xr-x,这是为啥嘞,我们先说一下,文件的最高权限是666,即:rw-rw-rw-,目录的最高权限是777即:rwxrwxrwx,当我们用777-755 我们发现正好是022,正好是默认权限,默认权限正是最高权限-实际权限的。
接下来,我们来说作用于目录和文件的权限都有什么作用:
普通文件
r: 可以读取文件的内容
cat less more nano vim 执行脚本
w: 可以修改文件的内容
nano vim > >> tee gedit
x: 可以执行该文件
执行脚本
目录文件
r: 用户可以列出目录下有哪些文件(不能查看文件的详细信息)
w: 只有w无意义。
x: 用户可以进入该目录(如果知道文件名,且有相对应的文件权限 ,可以执行对应的操作)
rx: 用户可以进入目录,且可以长列出。
rw:等于只有r
wx: 能进入,能创建能删除,不能列出。故用户能否删除文件与文件自身权限无关。
rwx: 全部权限。
---:null
我们可以看出,文件和目录的权限的作用是有很大区别的,我们即便对文件有全权限,如果对它的目录没有足够的权限的话,我们还是无法对文件进行增删查改,更何况他们还是有所有者,所属组和其他人的区别。比如:当我们想查看一个目录下的某一个文件内容时,我们至少要对目录有什么权限,对文件有什么权限?由我们上面的总结我们知道,我们对目录至少有一个x权限,对文件至少有r权限,这样虽然我们无法看到目录下有什么文件,但是我们知道有一个我们知道的文件就在该目录下,我们依旧可以使用工具查看:
权限判断的顺序
先判断是否是文件的所有人,如果是,则执行所属人的权限后结束,如果不是所有人,则判断是否所属组(可以是主组也可以是辅助组),如果是,则执行所属组的权限后结束,如果不是则执行其他人的权限后结束。
所有人->所有组->其他人
特殊权限
除了普通权限外,我们的文件还是有特殊权限的,比如我们常见的文件/etc/shadow文件,我们发现它的权限是---------,可是我们作为普通用户还是可以进行修改自己的密码,这就意味着我们修改了shadow的内容,这是为什么呢,我们知道root这个大变态即便对文件没有任何权限,依旧可以修改查看它,所以,这会不会和root有关呢?我们在修改密码时不是直接对文件修改,而是使用命令passwd对shadow进行修改的,而passwd这个程序所属组和所有者都是root,这是意味着我们可能是临时借用了root这个上帝之手对我们的密码进行修改的,我们在看看passwd的权限:
我们看到了什么东西?在root所有者的x位居然变成了s,这是什么呢,这就是特殊权限之一SUID权限。suid 当对一个可执行的二进制文件作用了SUID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属人的权限。这下我们就该知道为什么我们可以用passwd命令修改对于我们没有任何权限的shadow了吧。因为我们临时获取了passwd的root所有者的权限,我们是在以root的身份在修改我们的密码呀!!!
除了SUID还有SGID。sgid 当对一个可执行的二进制文件作用了SGID权限之后,任何拥有执行该文件权限的人,在执行的过程时都临时拥有该文件所属组的权限。 当对一个目录作用了SGID权限之后,任何对该目录有wx权限的用户在该目录下创建的文件及目录的所有属均为该目录的所有组。对于第二个作用,我们做一个测试:
Html目录属于HTML组,而redhat用户也有HTML附加组,然后我们在HTML中创建文件:
此时我们发现如果仅作为一个组用户进入改组,创建的文件所属组依然是自己的,作为同组的其他用户还是无法修改,接下来我们加上SGID权限chmod 2770 html:
这时候我们发现,Redhat用户创建的文件所属组变成了HTML,这就是SGID的作用之一,作为同组的人员,我们可以对此文件进行修改,团队合作起来更方便。
接下来我们看特殊权限的最后一个sticky,它的作用是当对一个目录使用了sticky之后(只限制组用户,目录的owner不受影响),该目录下的文件仅其所属人才能删除。属于这个组的其他成员可以对目录下的文件查看,修改,就是无法删除。
我们之前说默认权限有4位比如root的默认权限是0022,最前面的那个是特殊权限,由于特殊权限默认是什么都没有,所以是0,我们刚刚的演示其实也可以看出,设置特殊权限是SUID对应的是4,SGID对应的2,sticky对应的是1,还有就是我们发现特殊权限居然有大写的,这是为什么呢,我们可以看到,三个特殊权限都是在x位上,为了区分权限,如果在某一位有x权限,对应的特殊权限就是小写的,如果没有x权限,对应的特殊权限就是大写的,三个权限分别是sS,sS,tT。
隐藏权限
对于隐藏权限,我们不会说太多,说两个我们平时最常用的选项:
设置:
命令:chattr
格式:chattr [option] filename
格式:
+i 不能删除不能改
+a 不能删除,只能追加
这设置就厉害了,就连我们的root也无法改变,其实他就是为了防止root误操作而删除文件的,我们还可以利用lsattr进行查看:
ACL权限管理
为了满足我们对细化权限的设置,在linux系统中添加了ACL权限,用于对单个用户或者单个组进行经典的rwx权限设置,在centOS6中创建了新的分区后需要我们单独进行ACL功能的添加才可以使用,我们也不能将一个具有ACL权限的文件或目录拷贝到还没有使用ACL的分区上面,centOS7的xfs文件系统时自动启动ACL功能的。
ACL权限的设置与取消
如何设置ACL权限,我们需要知道ACL是针对于用户和组进行设置的,对其他人无效,并且ACL目标是文件或目录。
对于用户设置,我们使用的命令是:setfacl –m u:username:rwx /path/filename,在我们针对目录或文件设置完ACL权限以后,我们可以通过getfacl命令查看我们设置的ACL权限。
我们可由上图看到,在设置完ACL权限时,其他人的权限位后多了有个“+”,这就是ACL权限的标志。在我们显示出的tty.txt的ACL权限里,我们看到#号后面的是我们本文件的原本信息,并且,设置完ACL权限以后,mask就会占领g位,所以我们要是直接设置
setfacl –m g::rw filename的话其实就是在设置mask,所以,当我们在设置完ACL权限后,除非我们删除全部的ACL权限,否则,无法在对用户的g位设置任何权限。
我们在针对某一目录设置完ACL权限之后,能不能在目录下创建文件让它也具有相同的ACL权限呢?我们看一下:
我们以实际行动说明了使用setfacl –m u:username:rwx /path/filename设置完权限后,我们对其目录一下的文件都不能继承父目录的ACL权限,咋办?好办,我们可以使用setfacl –mR d:u:username:rw /path/filename来对目录设置这个权限,这样的话,目录下面的文件和新目录也能继承父目录的ACL权限了,但是有一点需要注意,我们使用setfacl –m u:username:rwx /path/filename和设置它下面的文件的ACL权限是有一点不一样的,因为我们需要进入目录后查看修改子文件,所有我们在设置目录的ACL权限时,一定要注意,如果需要进入目录的话ACL权限应该加上x;
对用户的ACL权限设置我们已经看到了,对组的ACL设置同样是如此:
setfacl –m g:username:rwx /path/filename
setfacl –mR g:u:username:rw /path/filename
ACL权限判断的顺序
先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER, 则判断是否属于GROUP或ACL GROUP,如果是,则取最大权限。如果不属于任何GROUP,则执行OTHER。
所有人->所有组->其他人
还有刚才那个mask,他是对最大权限的设置,我们一般不会管他,我们在设定ACL权限时,它是默认随着我们ACL权限的设置而变化的,保证我们设置的每个权限都能生效,如果我们想限定最大权限,我们可以在设置完所有ACL权限时,对它进行设置。
设置命令:setfacl -m mask:rwx f1
ACL权限的其他参数和取消设置
base ACL 不能删除
setfacl -k dir 删除默认ACL权限
setfacl --set u::rw,u:wang:rw,g::r,o::- file1
setfacl -M acl.txt f1[dir1]
acl.txt 内容来自getfacl f1 > acl.txt,如下
# file: fstab
# owner: root
# group: root
user::rw-
user:zhangfei:rwx
group::r--
mask::rwx
other::r—
setfacl -x u:liubei f1 单独去除一条ACL权限
setfacl -X aclrm.txt f1[ f2 f3 *]
aclrm.txt 内容如下
u:liubei
g:shuguo
setfacl -b f1 去除该文件上ACL属性。
备份和恢复ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
备份ACL权限信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1(删除ACL权限)
还原ACL权限信息
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt