2021-07-16

在Linux系统中,每个文件都有归属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的读(r)、写(w)、执行(x)等权限。对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,理解其权限设置来就不那么容易了。很多资深Linux用户其实也没有真正搞明白。对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。可以参考表格5-5,帮助同学们理解当文件和目录被设置rwx权限后,能够被执行的命令的区别:

表5-5                                              读写执行权限对于文件与目录可执行命令的区别

第5章 用户身份与文件权限第5章 用户身份与文件权限

文件的读、写、执行权限英文全称分别是read、write、execute,可以简写为r、w、x,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联,如表5-6所示。

表5-6                                              文件权限的字符与数字表示

第5章 用户身份与文件权限第5章 用户身份与文件权限

文件权限的数字法表示基于字符(rwx)的权限计算而来,其目的是简化权限的表示方式。例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。我们来看这样一个例子。现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法表示即为764。不过大家千万别再将这三个数字相加,计算出7+6+4=17的结果,这是小学的数学加减法,不是Linux系统的权限数字表示法,三者之间没有互通关系。

以rw-r-x-w-权限为例进行讲解,要想转换成数字法,首先要进行各个位之上的数字替代,如图5-1所示。

第5章 用户身份与文件权限第5章 用户身份与文件权限

图5-1 字符与数字权限转换示意图

减号是占位符,代表这里没有权限,数字法用0表示,也就是说rw-转换后是420,r-x转换后是401,-w-转换后是020,三组数字之间每组数字进行相加后得出652便是转换后的数字法权限。

而数字法转回到字符权限相比来说就有些难度了,以652权限为例进行讲解。首先数字6是由4+2得到的,不可能是4+1+1,因为每个权限只能占一位,所以数字5则是4+1得到的,2便是本身,没有权限即是空值0,可以按照表5-6所示的格式填写进去后得到420401020这样一串数字。有了这些信息就好办了,如图5-2所示,把他们都转换回来。

第5章 用户身份与文件权限第5章 用户身份与文件权限

图5-2 数字与字符权限转换示意图

心中牢记——文件的所有者、所有组和其他人权限之间无关联,不要写成rrwwx----的样子,一定要把rwx权限位对应到正确的位置,写成rw-r-x-w-。

Linux系统的文件权限相当复杂,但是用途很广泛,建议大家把它彻底搞清楚之后再学习下一节的内容。现在来练习一下。请各位读者分别计算数字表示法764、652、153、731所对应的字符表示法,然后再把rwxrw-r--、rw--w--wx、rw-r--r--转换成数字表示法。

下面我们利用上文讲解的知识,一起分析图5-3中所示的文件信息。

第5章 用户身份与文件权限第5章 用户身份与文件权限

图5-3 通过ls命令查看到的文件属性信息

在图5-3中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r--),除此以外的其他人也只有可读权限(r--),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的凌晨23分,文件的名称为install.log。

其中排在权限前面的减号(-)是文件类型,新手经常会把它跟无权限混淆。尽管在Linux系统中一切都是文件,但是不同的文件由于作用不同,因此类型也不尽相同,有一点点像Windows系统的后缀名。常见的文件类型包括有:普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。

普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及Shell脚本等等都包含在内,所以几乎在每个目录下都能看到普通文件(-)和目录文件(d)的身影。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等等都是设备文件,主要集中在/dev/目录中最为常见,不过其实很少会对鼠标键盘进行硬件级别的管理吧~

5.3 文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

下面具体解释这3个特殊权限位的功能以及用法。

1.  SUID

SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。这很像在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。

查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。

[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1312 Jul 21 05:08 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd 
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd

Tips

醒目的红色提醒告诫着用户一定要小心这个权限,因为一旦某个命令文件被设置上了SUID权限,那么就意味着凡是执行的人都可以临时获取到更高的权限,千万不要设置到vim、cat、rm等命令上面!!!

2.  SGID

SGID特殊权限有两种应用场景,当对二进制程序进行设置时,能够让执行者临时获取到文件所有组的权限;而对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。

第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:

cr--r-----   1 root system 2,  1 Feb 11 2017  kmem

大家看出问题了吗?除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:

-r-xr-sr-x   1 bin system 59346 Feb 11 2017  ps

这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而顺利地读取到了设备文件。

前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x. 2 root root 6 Oct 27 23:44 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir
[root@linuxprobe tmp]# chmod -R g+s testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx. 2 root root 6 Oct 27 23:44 testdir

在使用上述命令设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:

[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test 
-rw-rw-r--. 1 linuxprobe root 15 Oct 27 23:47 test

除了上面提到的SGID的这两个功能,再介绍两个与本小节内容相关的命令:chmod和chown。

chmod命令用于设置文件的一般权限及特殊权限,英文全称为:“change mode”,语法格式为:“chmod [参数] 文件名”。

这是一个与日常设置文件权限强相关的命令,例如要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。

[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg 
[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rwxrw----. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg

chown命令用于设置文件的所有者和所有组,英文全称为:“change own”,语法格式为:“chown 所有者:所有组 文件名”。

chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。

使用“所有者:所有组”的格式轻松把刚刚那个文件的所属信息修改一下,变更后的效果如下:

[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg 
[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rwxrw----. 1 linuxprobe linuxprobe 1407 Jul 21 05:09 anaconda-ks.cfg

3.  SBIT

现在,大学里的很多老师都要求学生将作业上传到服务器的特定共享目录中,但总是有几个“破坏分子”喜欢删除其他同学的作业,这时就要设置SBIT(Sticky Bit)特殊权限位了(也可以称之为特殊权限位之粘滞位)。SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

最初不知道是哪位非资深技术人员将Sticky Bit直译成了“粘滞位”,刘遄老师建议将其称为“保护位”,这既好记,又能立刻让人了解它的作用。RHEL 8系统中的/tmp作为一个共享文件的目录,默认已经设置了SBIT特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。

与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

/tmp目录上的SBIT权限默认已经存在,体现为“其他用户”权限字段的权限变为rwt:

[root@linuxprobe ~]# ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Oct 28 00:29 /tmp

其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限(其原理会在下个章节讲到)。为了避免现在很多读者不放心,所以下面的命令还是赋予了这个test文件最大的777权限(rwxrwxrwx):

[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# echo "Welcome to linuxprobe.com" > test
[root@linuxprobe tmp]# chmod 777 test
[root@linuxprobe tmp]# ls -al test 
-rwxrwxrwx. 1 root root 26 Oct 29 14:29 test

随后,切换到一个普通用户身份下,尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件:

[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ rm -f test
rm: cannot remove 'test': Operation not permitted

工作中对特殊权限善加使用,能够实现很多巧妙的功能,chmod命令设置特殊权限时的参数如表5-7所示。

表5-7                                          SUID、SGID、SBIT特殊权限的设置参数

参数作用
u+s设置SUID权限
u-s取消SUID权限
g+s设置SGID权限
g-s取消SGID权限
o+t设置SBIT权限
o-t取消SBIT权限

切换回root管理员的身份下,在家目录中创建一个名为linux的新目录,随后设置上SBIT权限吧:

[linuxprobe@linuxprobe tmp]$ exit
Logout
[root@linuxprobe tmp]# cd ~
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/

上面的o+t参数是在一般权限已经设置完毕的前提下,又新增了一项特殊权限,那如果我们想一般权限和特殊权限一起设置,有什么高效率的方法呢?

其实SUID、SGID与SBIT也有对应的数字法表示,分别即是4、2、1。也就是说777还不是最大权限,满权限应该是7777,第一个数字代表的是特殊权限位。既然知道了数字表示法是由“特殊权限+一般权限”构成的,那就以上面linux目录的权限为例为同学们梳理下计算方法吧。

在“rwxr-xr-t”权限中,最后一位是t,代表该文件的一般权限为“rwxr-xr-x”,并带有SBIT特殊权限。对于读(r)、写(w)、执行(x)权限的数字计算方法大家应该很熟悉了——即755,而SBIT特殊权限位是1,合并后结果为1755。

再增加点难度,如果权限是“rwsrwSr--”呢?首先不要慌,看到大写S代表原先没有执行权限,因此一般权限为“rwxrw-r--”,数字法计算后结果是764。带有的SUID和SGID特殊权限数字法表示是4和2,心算得出结果是6,合并后结果为6764。这个示例确实难度高一些,读者们可以参考学习图5-4的计算过程,搞明白了再往下看。

第5章 用户身份与文件权限第5章 用户身份与文件权限

图5-4 权限的字符表示法转数字表示法

将数字法转换成回字符法难度略微高一些,以5537为例为大家讲解。首先特殊权限的5是由4+1组成的,意味着是有SUID和SBIT。SUID和SGID的写法是原先有执行权限则是小写s,如果没有执行权限则是大写S,而SBIT的写法则是原先有执行权限是小写t,没有执行权限是大写T。一般权限的537进行字符转换后应为“r-x-wxrwx”,然后在此基础上增加SUID和SGID特殊权限,合并后结果是“r-s-wxrwt”。可以参考图5-5所示的计算过程来学习理解。

第5章 用户身份与文件权限第5章 用户身份与文件权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值