我正在试验 Linux 功能,我注意到要使 passwd
程序在没有 Set-UID root 的情况下工作,它需要具有 CAP_CHOWN 功能(在除了其他一些)。从逻辑上讲,为什么它需要有 CAP_CHOWN?
顺便说一句,如果我删除该功能,passwd 会给我一个“ token 操作错误”。
编辑:我使用的是没有 SELinux 的 Ubuntu 11.04。我正在尝试让 passwd
在没有 Set-UID root 的情况下工作。
最佳答案
passwd
本身不需要 cap_chown
。只需要更改与 userID
关联的/etc/shadow 文件。
/etc/shadow 文件被设置为任何人都无法读取。
/etc/shadow 只能由 root 访问。因此,当/etc/passwd 完成其身份验证模块并准备好编写新的(编码的)密码时,它将创建一个 token 。由 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")
此外,我使用这个C程序确认了/etc/nshadow
的存在。仅供引用,
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
printf("Exists\n");
break;
}
return 0;
}
关于linux -/usr/bin/passwd 和 CAP_CHOWN 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844933/