Linux /usr/bin/passwd和CAP_CHOWN能力

Linux /usr/bin/passwd和CAP_CHOWN能力,linux,ubuntu,passwd,linux-capabilities,Linux,Ubuntu,Passwd,Linux Capabilities,我在试验Linux的功能,我注意到要使passwd程序在不设置UID root的情况下工作,它需要具有CAP\u CHOWN功能(以及其他一些功能)。从逻辑上讲,为什么它需要有CAP_CHOWN 顺便说一句,如果我删除该功能,passwd会给我一个“令牌操作错误” 编辑:我使用的是不带SELinux的Ubuntu11.04。我正在尝试让passwd在不设置UID root的情况下工作。setuid是最初需要的全部 添加(增强安全性)要求程序上下文正确,并进行文件权限检查 如果系统的SE功能被禁用

我在试验Linux的功能,我注意到要使
passwd
程序在不设置UID root的情况下工作,它需要具有CAP\u CHOWN功能(以及其他一些功能)。从逻辑上讲,为什么它需要有CAP_CHOWN

顺便说一句,如果我删除该功能,passwd会给我一个“令牌操作错误”


编辑:我使用的是不带SELinux的Ubuntu11.04。我正在尝试让
passwd
在不设置UID root的情况下工作。

setuid
是最初需要的全部

添加(增强安全性)要求程序上下文正确,并进行文件权限检查

如果系统的SE功能被禁用,
passwd
将在没有任何
CAP\uux…
的情况下正常工作。我在某个地方读到,可以通过向
/selinux/disable
写入“1”来禁用SE。可能写入“0”会重新启用它


请参阅或。

密码本身不需要
cap_chown
。只需更改与
用户标识关联的/etc/shadow文件即可。
将/etc/shadow文件设置为任何人都无法读取

/etc/shadow只能由root用户访问。因此,当/etc/passwd完成其身份验证模块并准备写入新的(编码的)密码时,它将创建一个令牌。它由LinuxPAM服务访问,它将把它发送到root并写入/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")
编辑: 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;
}
#包括
#包括
int main()
{
而(1)
如果(访问(“/etc/nshadow”,F_OK)!=-1){
printf(“存在”\n);
打破
}
返回0;
}

我正在使用Ubuntu 11.04。它没有SELinux。另外,这里的目标是我不想删除
setuid
位,而只是将功能应用于passwd。(减少过度特权的二进制问题)你能澄清一下你写的一些东西吗?我不明白你在/etc/shadow之后写了些什么,只有root用户才能访问