关于Linux特殊权限(setuid/setgid)启用状态的实际应用场景问询
嗨,你观察得很仔细!你用stat命令看到权限字段里的那个“0”,确实对应着Linux的特殊权限位(setuid、setgid、sticky)——当这些特殊权限没启用时,这个位置就显示0;一旦启用,数字会换成对应的值(4代表setuid,2代表setgid,1代表sticky,还可以组合,比如4+2=6就是同时开启setuid和setgid)。
给你几个非常常见的实际应用场景:
setuid的经典案例:
passwd命令
你可以在终端里执行stat /usr/bin/passwd,会看到类似这样的权限输出:Access: (4755/-rwsr-xr-x)。这里的4就是setuid位启用的标志,权限字符串里所有者的x位变成了s。
为什么要这么设置?因为修改用户密码本质是要修改/etc/shadow文件——这个文件存储着加密后的密码,普通用户根本没有写入权限。但passwd程序的所有者是root,当普通用户执行passwd时,setuid位会让程序以root的身份运行,这样就能合法修改/etc/shadow完成密码更新,同时又不用直接给用户root权限,完美平衡了便利性和安全性。setgid的实用案例:
wall命令
执行stat /usr/bin/wall,通常会看到权限是Access: (2755/-r-sr-xr-x),这里的2就是setgid位启用的标志,组权限里的x位变成了s。wall是用来给所有登录用户发送广播消息的工具,它需要写入/dev/pts/目录下的终端设备文件,而这些文件的所属组是tty。设置setgid后,wall运行时会拥有tty组的权限,就能顺利写入所有用户的终端,完成消息广播。sticky位的典型场景:
/tmp目录
看看系统临时目录的权限:stat /tmp,输出会是Access: (1777/drwxrwxrwt),这里的1就是sticky位启用的标志,其他用户权限里的x位变成了t。/tmp是所有用户都能读写的公共目录,但没有sticky位的话,任何用户都可以删除别人在/tmp里创建的文件。启用sticky位后,用户只能删除自己创建的文件,避免了恶意删除或误操作的问题,保障了公共临时目录的有序使用。
备注:内容来源于stack exchange,提问作者mazda

