通常只有 root 可以访问/etc/shadow
。但是像su
和 之类的程序sudo
可以在不以 root 身份运行的情况下检查密码。那么问题来了:为什么这些程序可以/etc/shadow
无权限访问呢?我尝试通过带有spwd
模块的 python 来无权限访问它,但我没有获得访问权限(如预期的那样)。这些程序使用哪种机制?
答案1
为什么像 su 这样的程序可以访问 /etc/shadow
因为程序像su
和passwd
已经设定了SetUID
。您可以使用以下方法进行检查:
[root@tpserver tmp]# ls -l /usr/bin/passwd
-r-s--x--x 1 root root 21200 Aug 22 2013 /usr/bin/passwd
当您查看文件权限时,您将看到“s”。如果有人尝试运行该passwd
程序,默认情况下它会获取文件所有者(此处为 root)的权限。这意味着任何用户都可以获得root权限来执行passwd
程序,因为只有root用户才能编辑或更新/etc/passwd
文件/etc/shadow
。其他用户不能。当普通用户passwd
在其终端上运行该程序时,该passwd
程序将以“root”身份运行,因为有效 UID 被设置为“root”。所以普通用户可以轻松更新文件。
您可以使用chmod
带有u+s
或g+s
参数的命令分别设置可执行文件上的 setuid 和 setgid 位
长答案:Set-User_Id (SUID):暂时通电:
默认情况下,当用户执行文件时,执行该文件的进程具有与该用户相同的权限。事实上,该进程继承了他的默认组和用户标识。
如果在可执行文件上设置 SUID 属性,则导致其执行的进程不会使用用户的标识,而是使用文件所有者的用户标识。
由 Dennis Ritchie 发明的 SUID 机制存在潜在的安全隐患。它允许用户通过运行 root 拥有的此类文件来获得隐藏的权力。
$ ls -l /etc/passwd /etc/shadow /usr/bin/passwd
-rw-r--r-- 1 root root 2232 Mar 15 00:26 /etc/passwd
-r-------- 1 root root 1447 Mar 19 19:01 /etc/shadow
该清单显示 passwd 可供所有人读取,但 Shadow 无法被组和其他人读取。当运行程序的用户属于这两个类别之一(可能是其他类别)时,因此在影子上的读取测试中访问失败。假设普通用户想要更改他的密码。他怎么能这么做呢?他可以通过跑步来做到这一点/usr/bin/passwd
。许多 UNIX/Linux 程序都有一种特殊的权限模式,允许用户更新敏感的系统文件,例如/etc/shadow
他们无法直接使用编辑器执行的操作。程序也是如此passwd
。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 22984 Jan 6 2007 /usr/bin/passwd
权限字段的用户类别中的 s 字母代表一种称为设置用户 ID (SUID) 的特殊模式。这种模式让进程在程序实例期间拥有文件所有者的特权。因此,当非特权用户执行 passwd 时,进程的有效 UID 不是该用户的,而是 root(程序所有者)的。然后 passwd 使用此 SUID 权限进行编辑/etc/shadow
。