什么是Linux文件系统权限?

在Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。

8.3_Linux文件系统权限和特殊权限浅析_第1张图片


Linux文件系统权限的分类

Linux中的权限分为:read(读)、write(写)、execut(执行)三种权限

文件和目录表示的权限也各有不同


权限对于文件的意义:

r: 可使用文件查看类工具获取其内容

w: 可修改内容,可破坏内容,但不能删除文件本身

x: 针对二进制可执行的程序或脚本,可以把此文件提请内核启动为一个进程,普通文件不需要执行权限


权限对于目录的意义:

r: 可以使用ls命令查看目录内容的文件信息

w: 可以创建、删除文件

x: 可以使用ls -l命令来查看目录内容的文件信息,并且可以使用cd命令切换此目录为工作目录


特别符号大写X

假如设置权限的时候,类似于 chmod -R a=rwX DIR/ 中大X的意义


于文件的意义:

大X执行权限,如果像例子那样子递归增加所有目录和文件的权限,因为本来文件之间并不需要增加小x的权限,用X的话,本来没有x权限的文件在增加权限以后也不会有x权限,只有那些本来就已经有x权限的文件,在用大X以后依然会给文件加上x权限。


于目录的意义:

对于目录来说,X和x的意义是一样的,目录需要x权限当然用大X的时候也会把权限一并加上。


注意:

X:只是给目录x权限,不给文件x权限,不给文件x权限,是因为对于安全角度的考虑!



权限的八进制数字意义


用户的不拥有某位权限,则使用-占位

    ---   000   0    没有任何权限

  --x   001   1    只有执行权限

  -w-   010   2    只有写权限

  -wx   011   3    写和执行权限

  r--   100   4    只读权限

  r-x   101   5    读和执行权限

 rw-   110   6    读写权限

  rwx   111   7    读写执行权限(所有权限)

这些权限,是保存在文件的元数据当中


控制文件的权限



当我们创建一个文件的时候,假如我们要修改该文件的权限,那么,此时我们将会用到chmod的命令·


chmod:修改文件权限

8.3_Linux文件系统权限和特殊权限浅析_第2张图片


操作三类用户的权限:使用8进制形式

      chmod [-R] OCTAL-MODE(8进制)file ...

      对链接文件无效,左侧以0补齐

EX.修改属主为读写,属组为只读,其他没有权限


操作指定类别用户的权限:使用u,g,o,a来赋权,用 = 或者 +/- 来进行

     u:属主

     g:属组

     o:其他

     a:所有


EX.使用 = 控制权限,修改权限为属主读写,属组读写,其他只读。


EX.使用 +/- 控制权限,修改权限为属组去掉写权限,其他去掉读权限。


chmod 命令还能参照其他文件的权限来进行设置权限

EX.参考文件b的权限来修改文件a的权限


umask值


在上面的实验,我们发现,我们创建一个文件的时候是有对应的默认的权限的

要注意的是管理员的默认权限和普通用户的默认权限是不同的


那么默认权限是哪里控制的?

答:这个是由umask来控制的


直接输入umask可以查看到用户的umask值

我们可以看到,管理员和普通用户的umask的默认值是不同,这个就是为什么管理员创建文件和普通用户创建文件的权限不同的原因。


umask的这些数值的作用:通过umask值和用文件(目录)默认值的计算,可以得出用户的文件(目录)初始的权限制。


关于默认权限值,这里有一个计算的小公式

umask+默认权限值

默认权限值 = 文件权限 666 / 目录权限 777

文件:666-umask=有奇数+1,偶数保留

目录:777-umask


新建FILE权限: 666-umask

如果所得结果某位存在执行(奇数)权限,则将其权限+1

为什么文件的权限是666而不是777?rwx加起来应该是7,这个是由于安全考虑,因为到某些文件默认就有执行权限的话,意味着如果有心的人随便去执行某些文件话,会引起系统出问题。而计算的时候,遇到奇数位置就需要+1,就是因为有的情况下计算出来的结果,会使权限带有x的执行权限,为了避免这个情况,所以+1以后得出来的结果永远是偶数,就可以避免这个情况了。

所以上图,root的umask是022,用666-022=644=rw-r--r--,所以默认创建的文件就是这个权限

新建DIR权限: 777-umask

以此图为例,777-022=755=rwxrw-rw- ,所以目录的文件的情况也是用777-umask值可以计算促回来


umask 本质:屏蔽掉最大权限相应的位,从而得出默认的权限


如果需要临时设置umask值,可以输出 umask=xxx


如果需要设置永久的umask值可以进入家目录下 ~/.bashrc 或者.bash_profile 里面添加 umask xxx


如果需要设置全局的umask值,可以进入/etc/profile或者/ete/brshrc里面设置,但是并不建议这样做

8.3_Linux文件系统权限和特殊权限浅析_第3张图片

从这个图我们也可以了解到,为什么root账号的umask值是022,而普通账号的umask是022


设置umask值表示的方式可以有以下两种


(1)umask数值设置只能是八进制的数字,即0-7

(2)可以使用 umask u=rw,g=r,o=r 这样方式来设置


其他umask的使用小技巧


[root@centos ~]# umask -S #显示对应权限,如果是文件的话,则减去x的权限即可

u=rwx,g=rx,o=rx


umask -p >> .bashrc 或者 .bash_profile #此命令输出直接追加到环境变量文件里面就可以偷懒进去修改了,即输出就可以直接被调用


Linux文件系统的特殊权限


三种特殊的权限:SUID SGID STICKY


执行特殊的权限前提:进程有属主和属组;文件有属主和属组

(1) 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

(2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组

(3) 进程访问文件时的权限,取决于进程的发起者

(a) 进程的发起者,同文件的属主:则应用文件属主权限

(b) 进程的发起者,属于文件属组;则应用文件属组权限

(c) 应用文件“其它”权限


这三个特殊权限也是能用八进制来表示的,并且作用在不同的位上,如下:

SUID 4 SGID 2 STICKY 1   4+2+1=7

user   group  other    


SUID(s):当一个用户去运行该程序的时候,该用户继承所有者的权限。

可以看见一个程序有的user位有一个s,替代原来的x,代表SUID的权限已经添加进去,且一般情况下我们看到的是红底白字的文件的信息


SUID权限设定


chmod  4XXX FILE, 4表示SUID

chmodu+sFILE...

chmodu-s FILE...


注意:SUID: user,占据属主的执行权限位

         s: 属主拥有x权限

          S:属主没有x权限


注意:SUID只能应用在二进制程序里面,不能作用在目录上面,此命令不能随便加,太危险。


UID的作用:

当其他用户执行SUID权限的二进制程序的时候,在ps aux里面显示用户,也会是SUID的二进制程序的属于,大部分情况下面即是root



SGID 的作用  

(1)如果应用在二进制程序里面,启动为进程之后,其进程的属主为原程序文件的属组,这种情况跟SUID功能类似

wKiom1ejKX_jDwUvAAANCZmY6c0069.png

当文件拥有SIG的权限的时候,在group位会有一个s,替代了原来的x,代表SGID的权限已经添加进去,且一般情况下我们看到的是黄底黑字的文件的信息


SGID权限设定

chmod  2XXX FILE...   2表示GUID

chmodg + sFILE...

chmodg - sFILE...


(2)如果应用在目录里面,所有用户在此目录下面创建的文件(包括子目录)的时候的属组跟目录的属组一致。此作用通常用于创建一个协作目录。


SGID权限设定


chmodg + sDIR...

chmodg -s DIR...


注意:SGID: group,占据属组的执行权限位

         s: group拥有x权限

         S:group没有x权限


注意:root账号和root组的概率是不同的,root组也只是属于一个普通的组

这个意义跟windows操作系统里面的administrators组的意义是不一样的



STICKY 粘滞位的作用

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权,在目录设置Sticky位,只有文件的所有者或root可以删除该文件。(注意STICKY位作用在文件上面的话没有用)

当目录拥有STICKY的权限的时候,在other位会有一个t,替代了原来的x,代表STICKY的权限已经添加进去,且一般情况下我们看到的是绿底黑字的文件的信息


chmod  1XXX FILE, 1表示STICKY

chmod  o+t


注意:Sticky: other,占据other的执行权限位

          t: other拥有x权限

          T:other没有x权限


以上SUID,SGID,和STICKY都必须要配合有x的权限的。


删除这3个的时候必须用 chmod u-s,g-s,o-t FILE 这样的命令,不能用0777这样等的命令修改。


Linux文件系统的特殊权限之ACL


什么是ACL?

ACL:Access Control List,实现灵活的权限管理,除了文件的所有者,所属组和其它人,ACL的特别之处就是可以对单一用户实现对文件和目录的权限控制。


注意:

CentOS7.0默认创建的xfs和ext4文件系统有ACL功能。

CentOS7.X之前版本,默认手工创建的ext4文件系统无ACL功能。需手动增加:

tune2fs –o acl/dev/sdb1

mount –o acl/dev/sdb1 /mnt


具有acl权限的文件会有一个+,我们可以用getfacl FILE的命令去查看该文件的ACL权限,如下图所示。

下面我们给与本来没有对a文件任何操作的wan用户rw的ACL的权限

8.3_Linux文件系统权限和特殊权限浅析_第4张图片

通过上图我们可以发现,给与wan用户rw的ACL权限以后,用户wan就可以对a文件进行读写的操作,但是之后当我们删除掉ACL的权限以后,wan用户就没有读写a文件的权限了,这就是ACL的作用。


通过上图,我们还能发现ACL中有一个mask的权限

这个权限的作用是:

mask影响除所有者和other的之外的人和组的最大权限

mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

用户或组的设置必须存在于mask权限设定范围内才会生效。


下面我们来演示一下mask的用法:


首先,给用户wan增加rwx的权限

通过上图,我们可以看见:mask的值是rwx,跟用户wan的权限是一样的,

还有一点不知道大家留意到没有,group组的权限本来是---,但是显示文件的时候,现在的却是rwx的权限,这是怎么回事呢?下面再给大家继续演示。

这里设置mask的值为r,此时观察a文件的组的权限变成了r--,用户wan本来的后面也多了一个#effective:r--

的字样,用wan用户向a文件里面写入数据,发现此时数据写不进去。通过此实验我们可以发现,

mask的值可以限制本来用户的最大权限,而且文件上面现在的属组的权限,在增加ACL以后,显示出来的这个值,实际上是mask的值。要注意的是mask值的修改只影响除所有者和other的之外的人和组的最大权限。


注意,有ACL的情况下面,更改(组group)的权限,实际上就是更改mask的权限,实际的(组group)的权限不受影响,但是不作用。


setfacl 的常用选项

getfacl file |directory            查看ACL的信息

setfacl -m mask::rx file           使用mask值限制成为rx的权限

setfacl -m u:USERNAME:rw FILE      增加用户的rw的ACL权限

setfacl -x u:USERNAME FILE | DIR   删除用户的ACL权限

setfacl -b FILE                    彻底清空所有ACL权限

setfacl -M FILE | DIR              以指定格式导入ACL配置

setfacl -Rm g:sales:rwX directory  递归增加目录下面组group的ACL权限

setfacl -m g:salesgroup:rw file| directory  增加组group的ACL权限

setfacl -m d:u:USERNAME:rx directory     设置用户对该目录下面创建的文件有递归的rx的权限

(setfacl -m d:u:wang:rx directory 这个里面的d选项,就是影响以后在该文件夹下面创建文件的时候默认也带有原来ACL的权限)

setfacl -k dir 清除默认acl权限

setfacl -X file.acl directory

getfacl file1 | setfacl --set-file=-file2 复制file1的acl权限给file2

(--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,

不能象-m一样只是添加ACL就可以)

如: setfacl --set u::rw,u:wang:rw,g::r,o::- file1


主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息


如何备份和恢复ACL的权限


备份:getfacl -R * 目录/路径/*  >  /root/acl.bak (备份到指定文件里面)


恢复:setfacl -R --set-file=/root/acl.bak *


最后说明:以上说了几种权限,这里给大家说话一下,权限只是针对文件系统,假如文件系统换成诸如WINDOWS操作系统里面的vfat文件系统的话,文件权限就不一定能够支持了。