我正在尝试Linux功能,我注意到passwd
程序在没有Set-UID root的情况下工作,它需要具有 CAP_CHOWN 功能(除了一些其他)。从逻辑上讲,为什么需要 CAP_CHOWN 呢?
顺便说一句,如果删除该功能,passwd会给我一个“令牌操作错误”。
编辑:我正在使用没有SELinux的Ubuntu 11.04。我试图让passwd
在没有Set-UID root的情况下工作。
答案 0 :(得分:2)
cap_chown
本身不需要passwd
。只需要更改与userID
关联的/ etc / shadow文件。
/ 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")
此外,我使用此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;
}
答案 1 :(得分:0)
setuid
是最初需要的。
添加SELinux(安全性增强)需要程序上下文正确以及文件权限检查。
如果系统的SE功能被禁用,passwd
将正常工作,而不会CAP_...
。在某处我读到可以通过向/selinux/disable
写一个“1”来禁用SE。大概写“0”可以重新启用它。