假设普通用户想要更新他的密码/etc/passwd
。
为什么最好以诸如-rws------
.我假设它的工作方式与其他用户将以诸如 之类的方式获得这些权限相同-rwx---rwx
。
如果我错了,请纠正我,因为我可能实际上并不理解这个概念,因此我希望有人向我解释一下。
答案1
setuid 位(s
in -rws------
)意味着每当程序运行时,创建的进程都会使用拥有程序文件的用户。如果admin
拥有该文件并john
运行它,则生成的进程将在admin
的有效用户 ID 下运行。 (虽然仍然携带john
“真实”用户 ID。)这个想法通常是admin
可以做普通用户不能做的事情john
,但程序仍然可以做进一步的检查来控制正在运行的用户尝试做的事情。
有了上述权限,setuid 位就没有意义了,因为除了所有者之外没有人可以运行该程序。
有了-rwx---rwx
权限,任何不是文件组成员的人都可以执行该文件,但他们是在自己的用户 ID 下执行的。他们没有通过该计划获得任何额外的权利。
答案2
这里的关键是这/etc/passwd
是一个受保护的文件。除管理员外,任何人都不能对其进行编辑。在我的 Debian 上是-rw-r--r--
.您的问题并不清楚 SUID 与什么相关。这对 来说毫无意义/etc/passwd
。它只对可能改变的程序才有意义/etc/passwd
。但现在,-rws------
对于该程序文件来说没有多大意义,正如 ikkachu 上面所解释的那样。-rws---r-x
这是有道理的,因为普通用户可能会运行它。不过,请记住这/etc/passwd
是一个受保护的文件,在编写将进行更改的可执行文件时应考虑到这种保护。顺便说一句,出于安全原因,粘性位不适用于脚本语言。
答案3
为了更改他/她自己的密码,用户需要以某种方式写入新的密码哈希/etc/shadow
(或/etc/passwd
在没有影子密码实现的遗留系统上)。
如果允许用户对文件进行写访问,则用户可以更改该文件中的任何内容:用户可以更改任何人的密码,冒充任何用户,并轻松获得 root 访问权限。这显然是不可接受的。
解决方案是一个“看门人”,有能力让用户执行一项具体行为具有根级访问权限,即更改他/她自己的仅密码。
该/bin/passwd
程序就是这样一个看门人程序。它的编写非常仔细,以确保它只允许更改用户自己的密码,除非用户是 root(或者在某些情况下具有适当的额外权限)。当网守程序准备就绪时,其权限将被设置,以便用户可以执行它,但不能修改程序的内容。然后setuid 根权限被添加到程序中:它会导致运行该特定程序的任何进程都具有 root 访问权限仅在该特定过程的持续时间内。
有时,setuid root 程序的权限被设置为 4111 或---s--x--x
,这样非 root 用户只能执行该程序,而不能以任何其他方式读取其内容。
对于操作系统内置的 setuid 程序有一些保护:例如,除非您是 root,否则无法将调试器附加到正在运行 setuid root 程序的进程。如果一个 setuid 程序恰好可以被普通用户读取,并且用户尝试复制该程序,则该副本通常会丢失 setuid 权限位;即使没有,副本(通常)将由制作副本的用户拥有,因此它将不再是setuid 根但setuid [用户名],并且很可能无论如何都无法完成其工作。