除了读取、写入、执行权限之外还有其他一些较少用到的特殊权限设置。
SUID(Set User ID)
ls -l /usr/bin/passwd /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1443 Apr 7 22:39 /etc/passwd
-rw-r----- 1 root shadow 974 Apr 7 22:39 /etc/shadow
-rwsr-xr-x 1 root root 63960 Feb 7 2020 /usr/bin/passwd
在使用 passwd
命令(/usr/bin/passwd
)修改密码时,会修改存储密码的配置文件 /etc/shadow
(在之前的文章有提到,历史上密码存储于 /etc/passwd
中但现在已经不是了)。
但只是普通用户权限的我们是如何得以修改 /etc/shadow
文件的?答案是 setuid。
setuid 位(八进制表示为 4000),如果将其应用于可执行文件,会将有效用户ID(effective user ID)从真实用户(实际执行程序的用户)ID更改为程序属主的有效用户ID。
大多数情况下,少数超级用户的程序才会做此设置。当普通用户执行 setuid root 程序时,该程序将以超级用户的权限来执行,可以访问普通用户通常被禁止访问的文件和目录。这显然会带来安全隐患,因此允许设置 setuid 位的程序数量必须控制在最小范围内。
chmod u+s <程序文件名>
# 八进制法表示为
chmod 4755 <程序文件名>
权限:-rwsr-xr-x
,注意属主的s
。
SGID(Set Group ID)
setgid 位类似于 setuid 位,它会将有效组ID(effective group ID)从真实用户的真实组 ID(real group ID)更改为文件属主的有效组 ID。
如果对目录设置 setgid 位,那么在该目录下新创建的文件将由该目录的属组所有,而非文件创建者的属组所有。
这在共享目录中非常有用,当一个共同属组的成员需要访问目录中的所有文件时,不用管文件属主的属组是什么。
chmod g+s <目录名>
# 八进制法表示为
chmod 2775 <目录名>
权限:drwxrwsr-x
,注意属组的 s
。
Sticky Bit
粘滞(sticky)位来自「远古」Unix 的遗留产物,用于将可执行文件标记为「不可交换」。
Linux 会忽略文件上设置的粘滞位,如果对目录设置了粘滞位,则能够阻止用户删除或者重命名其中的文件,除非用户是该目录的属主,或者是文件的属主,又或者是超级用户。
粘滞位常用来控制对共享目录(如 /tmp
)的访问。
chmod +t <目录名>
# 八进制法表示为
chmod 1777 <目录名>
权限:drwxrwxrwt
,注意最后的t
。