3.7 权限管理

Linux系统中的文件或目录都有属于自己的权限,通过权限来判断某个用户或群组是否有对文件或目录进行操作的权利,如访问、修改等。每个文件都对应三种身份,即文件的拥有人身份,文件的拥有组身份和文件的其他人身份。对同一个文件而言,这三种身份有着不同的权限,理解这点非常重要。

3.7.1 文件的权限

在正式学习权限的设置之前,必须先学会查看权限。使用“ls-l”命令可以列出某个文件的权限(如果是目录,则需要再加入-d选项),例如:

上述命令各部分说明如下:

① 文件类型,“-”代表普通文件,“d”代表目录文件。

② 文件拥有人权限。

③ 文件拥有组权限。

④ 文件其他人权限。

⑤ 文件链接数。

⑥ 文件拥有人。

⑦ 文件拥有组。

⑧ 文件大小。

⑨ 最后一次修改时间。

⑩ 文件名称。

其中,r、w、x分别代表不同的权限。权限的定义见表3-4。

表3-4 权限的定义

续表

需要注意以下几点:

(1)如果对文件有w权限,则只代表可以对文件内容进行修改,对文件本身是无法删除的,如果想删除,则必须有对上级目录写入的权限。

(2)对于目录来说,x权限代表可以进入(切换到)目录,而非执行。

如何判断用户或群组是否有权限访问、修改文件或目录呢?以本节开始处名为file的文件为例,其拥有人和拥有组都是root,edward登录系统后,是否可以对file文件进行写入呢?答案是否定的,系统会给出“Permission denied”的提示信息。下面来分析系统是如何做出判断的。这要结合之前的用户和群组小节的UID和GID的内容。首先,系统会查看file文件拥有人的UID是否为edward的UID,在此示例中不是(而是root),既然不是edward的UID,就不能使用拥有人身份的权限。接着,查看GID是否为edward的GID,很显然也不是(还是root),因此不能使用拥有组身份的权限。由此可见,edward属于其他人身份,而其他人身份只有读取权限,因此edward不能对file文件进行写入。

3.7.2 设置文件权限

通过上一节内容的学习,读者学会了如何判断是否有权限去访问或修改某个文件或目录,当权限不满足时,可以借助chmod命令修改。该命令语法格式如下:

常见的选项有-R,是用在目录中的,作用是以递归的形式对目录设置权限。

mode指方式,有以下几种:

u|g|o|a,分别代表拥有人、拥有组、其他人和所有人这几个身份。

+|-|=,分别代表增加一个权限、删除一个权限和重新设置权限。

rwxX,分别代表读、写和执行权限。值得注意的是,x权限需要谨慎使用。因为当对某个目录使用-R选项递归设置权限时,如果对此目录设置了执行权限,则执行权限会被此目录下的子文件所继承,而如果使用X,则此目录下的子文件不会继承执行权限(读、写权限不受影响)。

例如,想为文件file中其他人身份增加一个写权限,则可以输入下面的命令:

Linux系统中的权限其实是用八进制数表达的,然后转换成二进制数。在二进制数中,每一位代表一个二进制位。权限的数字表达见表3-5。

表3-5 权限的数字表达

因此,在上一个示例中,也可以直接使用数字的形式对其他人身份赋予权限。

3.7.3 修改文件所属者

在某些情况下,需要对文件或目录修改所属关系。在介绍文件属性信息时,提到文件有“拥有人”和“拥有组”这两种所属者。可以分别使用chown和chgrp命令修改。

chown命令语法格式如下:

例如,使用chown命令将文件file的拥有人修改为edward。

此命令还具有修改文件拥有组的功能。例如,再将文件file的拥有组修改为edward。

还可以通过使用-R选项,以递归的形式对整个目录树修改所属关系,例如:

使用chgrp命令,可以只修改文件的拥有组,其语法格式如下:

例如,将文件file2的拥有组修改为bob。

与此命令具有相同效果的做法是使用chown命令对file2修改拥有组。

注意:这里应有一个“.”,如果忘记添加,则代表将拥有人修改为bob。

3.7.4 特殊权限

除拥有人权限、拥有组权限和其他人权限外,文件还有三个特殊的权限,这些权限提供了额外的功能,见表3-6。

表3-6 特殊权限

下面分别对上述权限进行解释。对于执行文件(命令)来说,当被设置了SUID权限后,再次执行此文件时,使用的是该执行文件拥有人的身份,而不是执行者自己的权限。例如,passwd命令就被设置了SUID权限。

普通用户使用passwd命令修改自己的密码时,其实是修改/etc/shadow文件,此文件是保存用户密码的文件,由于密码是敏感内容,因此对安全性要求非常高,通过查看得到此文件是没有任何权限的。

这就产生了一个矛盾,普通用户没有权限修改/etc/shadow文件,但确实可以成功修改密码,这又是怎么回事呢?下面来解释当使用passwd命令时,是如何修改密码文件的。

例如,用户edward使用passwd命令修改自己的密码时,可以看见/usr/bin/passwd这个可执行文件的拥有人身份上面有个字母“s”,这便是SUID权限。通过SUID的定义,当edward使用/usr/bin/passwd指定密码时,实际使用的是/usr/bin/passwd文件拥有人的权限(root)修改/etc/shaodw文件,而不是执行者(edward)自己的权限,因此可以成功修改密码。

SGID一般用于目录,在目录下建立子文件(子目录)时,其拥有组并不会自动继承父目录的拥有组身份。如果希望继承,则必须对父目录设置SGID权限。例如,对dir目录设置SGID权限。

此时,如果对dir目录的拥有组做出修改,则dir目录中的子文件也会同步继承。

t(粘贴位)也是针对目录的,但含义和SGID不同,t权限是让对目录有写入权限的用户只能“碰”自己建立的文件,而对于其他人建立的文件只允许读。这类权限一般用于公共性目录,如/tmp目录默认对其他人身份设置t权限。假如没有t权限,则任何用户都可以在/tmp目录中删除别人建立的文件(因为其他人身份上有w权限)。为了防止出现这种现象,就可以在/tmp其他人身份上增加t权限进行保护,这时只有文件的拥有者才可以删除/tmp中的文件。

以上三个特殊权限都是在原来的x权限上添加的。它们和普通权限一样,也用数字来表达,分别是4(SUID)、2(SGID)和1(t)。使用数字表达时,需要在普通权限前面一位进行设置。例如,再次观察/usr/bin/passwd可执行文件的权限。

此文件如果用数字表达的话应为4755。其中,4表示SUID,比较好理解。但有些读者会有一个疑问,其中的“s”设置在原来“x”的位置,那执行权限还存在吗?如果不存在,那么答案就不是4775,而是4655。其实,通过推理也可以判断出执行权限是存在的,因为如果没有执行权限,也就无法以拥有人的身份执行该命令。另一种判断方式是,如果字母“s”是大写的,则原来的“x”不存在。其他两个特殊权限与此相同。例如,把/tmp中其他人身份上的执行权限去掉,则t权限使用大写字母“T”表示。