9.3. 管理权限

Linux 是一个典型的多用户系统,这就有必要提供许可制度来控制对文件和目录的操作,其中包含了所有的系统资源和设备(在Unix 系统中,任何设备都由文件或目录来表示)。这一原则对所有Unix 系统通用,这里再提醒一下,特别是对一些有趣的相对高级应用。

每个文件和文件夹有三种用户许可类型:

  • 所有者 (使用符号 u “user”首字母);

  • 所有者组(使用符号 g “group”首字母),代表组中的所有成员;

  • 其他(使用符号 o “other”的首字母)。

有三种可以相互结合的权限类型:

  • 读取(使用符号 r “read”的首字母);

  • 写(使用符号 w “write”的首字母);

  • 执行(使用“eXecute”中的符号 x )。

以文件来说,其权利较容易理解:读取就是允许读取其内容 (包括复制)、写入就是允许改变它、而运行就是跑它 (文件本身必须是程序)。

安全 setgid 目录和 粘着位

两个特殊权限和可执行文件相关:setuidsetgid(使用字符“s”表示)。请注意,我们常常称之为“位”,因为这些布尔值可以用一个0或者一个1表示。这两种权限允许任何用户以相应文件的所有者或组的身份执行程序。这种机制可以允许用户使用那些需要更高级别的授权才能工作的特性,即使普通用户原本不具备其使用权限。

由于 setuid 根程序在系统层以超级用户的身份运行,有必要确定其安全性和可靠性。实际上,如果用户可以侵入该程序并调用自己设定的命令,就有可能伪装成超级用户并获取系统的所有权限。

文件夹的处理方式略有不同。读取其条目 (文件及文件夹)、写入包括添加与删除文件、而运行则是进入它 (尤其是使用 cd 命令)。进入文件夹而不必有读取权限,运行已知的文件名,若不知其正确的名称,则无法运行。

安全 setgid 目录和 粘着位

setgid 位也适用于目录。在这种目录中新创建的条目会被自动赋予其父目录的所有组,而不是通常情况下那样继承创建者的主用户组。这种设置可以避免几个同组用户在共享文件树中协同工作时(为保持所创建文件的所有组的一致性)而不得不改变自身主用户组的额外工作(使用 newgrp 命令)。

“粘着”位(使用符号“t”)是仅用于目录的许可位。专门用于所有人都有写权限的临时目录(例如 /tmp/):它严格限制删除操作,只有所有者(或者父目录的所有者)可以删除。少了它,所有人都能删除其他用户在 /tmp/中的文件。

有三个控制文件许可权限的命令:

  • chown *用户* *文件* 命令更改文件的所有者;

  • chgrp *组* *文件* 改变所有组

  • chmod *权限* *文件* 改变文件许可权限。

有两种方法表示权限。其中,符号表示是最易于理解和记忆的。它使用前述的符号链接。可以通过显示的设置(u/g/o),通过加(+),或者减(-)定义每种用户的权限类型。一个 u=rwx,g+rw,o-r 格式的命令会赋予所有者读,写和执行权限,给所有组添加读写权限,移除其他用户的读权限。其他命令中未通过加或者减列出的权限保持不变。字母 a是指“所有”,涵盖三种类型的用户,因此 a=rx 命令会赋予三种用户相同的权限(读和执行,没有写)。

与权限相关的(八进制)数字表示:4是读,2是写,1是执行。各种权限组合通过代表的数字求和得到。通过把每个值置于端到端序列不同位置关联不同的用户类型(所有者,所有组,其他用户)。

比如, chmod 754 *file* 会设置如下的权限:所有者读,写和执行(由于7 = 4 + 2 + 1);所有组读和执行(由于 5 = 4 + 1);其他用户只读。 0 意味着没有任何权限;因此 chmod 600 *file* 允许所有者读写,而其他人没有任何权限。对可执行文件和目录,最常用的权限组合是 755 ,对数据文件是 644

要表示特殊权限,可以根据同样的原则在数字上加入第四个前缀位,位 setuidsetgidsticky 分别对应4,2,和1。chmod 4754 会设置前面描述的 setuid 位权限。

八进位标记只适用于对文件的一次性设置所有权限;不能以它加入新的权限,如群组拥有者的读取,因为必须把现在的权限与计算新的数值。

提示 递归操作

有时需要更改整个文件树的权限。以上所有的命令都有 -R 选项来递归操作子目录。

文件夹与文件的不同,有时造成递归运算的问题。所以,在符号式权限里加入 “X” 字母。它代表只对文件夹 (不是文件) 的运行权。因此,chmod -R a+X *directory* 对至少一个范畴用户 (即使只有一个拥有者) 已经有运行权的所有次文件夹与文件,只对所有范畴用户加入运行权 (a)。

提示 改变组和用户

通常在改变拥有者的时候,也要改变文件的群组。chown 命令有个特别的语法,用在这个时机:chown *user*:*group* *file*

进阶 umask

当应用程序创建文件的时候,它指定许可权限,而系统则会根据 umask命令的内容,自动地移除某些权限。在命令界面输入 umask :会看到类似 0022的掩码。这是一个八进制数代表了会被系统移除的权限(在本例中,是指对所有组和其他用户的写权限)。

如果指定新的八进制数值, umask 命令会修改掩码。在命令行界面初始化文件中使用 (例如~/.bash_profile),它会改变会话默认的掩码。