我正在试验 Linux 功能,我注意到要使passwd
程序在没有 Set-UID root 的情况下工作,它需要具有CAP_CHOWN功能(除了其他一些功能)。从逻辑上讲,为什么它需要CAP_CHOWN呢?
顺便说一句,如果我删除该功能,passwd 会给我一个“令牌操作错误”。
编辑:我使用的是没有 SELinux 的 Ubuntu 11.04。我试图在passwd
没有 Set-UID root 的情况下开始工作。
我正在试验 Linux 功能,我注意到要使passwd
程序在没有 Set-UID root 的情况下工作,它需要具有CAP_CHOWN功能(除了其他一些功能)。从逻辑上讲,为什么它需要CAP_CHOWN呢?
顺便说一句,如果我删除该功能,passwd 会给我一个“令牌操作错误”。
编辑:我使用的是没有 SELinux 的 Ubuntu 11.04。我试图在passwd
没有 Set-UID root 的情况下开始工作。
本身cap_chown
不需要。passwd
只需更改与userID
. /etc/shadow 文件被设置为不能被任何人读取。
/etc/shadow 只能由 root 访问。因此,当 /etc/passwd 完成它的身份验证模块并准备写入新的(编码的)密码时,它将创建一个令牌。它由 Linux-PAM 服务访问,该服务会将其 chown 为 root 并将其写入 /etc/shadow。
passwd 使用文件 /etc/.pwd.lock、/etc/shadow 和 /etc/nshadow。由于 passwd 从 /etc 目录读取和写入,因此它需要 w 权限。请注意,/etc/shadow 永远不会由 passwd 写入。passwd 实际上写入 /etc/nshadow 并将 /etc/nshadow 重命名为 /etc/shadow。
open('/etc/nshadow',O_WRONLY|O_CREAT)=fd1
open('/etc/shadow', O_RDONLY)=fd2
fchown(fd1, uid=root, gid=shadow)
chmod /etc/shadow to : rw by owner and r by group
read(fd2)
write(fd1)
rename("/etc/nshadow", "/etc/shadow")
此外,我确认了/etc/nshadow
使用这个 C 程序的存在。供参考,
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
printf("Exists\n");
break;
}
return 0;
}