如何在chroot中允许passwd?

我有一个多用户服务器,它把用户的一个子集放在一个chroot中。 我想允许所有用户调用passwd来更改他们各自的密码。 我能想到的其他任何事情都是矫枉过正,或者可能会危及系统安全。

我用makejail使用以下configuration来构build我的chroot。

 chroot="/var/chroot/sshd" cleanJailFirst=1 # these are binds to the actual location, hence, we don't want makejail to be tinkering with those. preserve=["/home","/etc/passwd","/etc/group","/srv"] testCommandsInsideJail=["bash","sh","ls","pwd","stat","whoami","svnserve -t","locale","localedef","man ssh","man scp","cat","nano","vim","ssh","scp","passwd"] testCommandsOutsideJail=[] packages=["coreutils"] # speed up things a bit sleepAfterStartCommand=0.8 sleepAfterTest=0.8 

正如你所看到的,在testCommandsInsideJail ,我列出了passwd ,但是如果我作为testuserlogin(谁在chroot里面),我得到:

 $ passwd Changing password for test. (current) UNIX password: passwd: Authentication token manipulation error passwd: password unchanged 

这是我不明白的不幸(在你问之前,是的,我确定我input的密码是正确的)。 我已经通过gfind了一些网站,它帮助我尽可能less的实际的错误信息。 据我了解,我错过了一些pam模块,但我不知道如何将其添加到构build监狱的python脚本。

我正在运行Ubuntu服务器10.04。

编辑

我有实际的/etc/passwd绑定(通过/etc/fstab )到/var/chroot/sshd/etc/passwd的chroot /var/chroot/sshd/etc/passwd ,因此可以从外部看到chroot中的修改。 我现在也做了相同的/etc/shadow ,由于某种原因,我忘了以前。 所以,而不是

 preserve=["/home","/etc/passwd","/etc/group","/srv"] 

我现在有了

 preserve=["/home","/etc/passwd","/etc/shadow","/etc/group","/srv"] 

和一个额外的绑定:

 # chroot binds /home /var/chroot/sshd/home none bind 0 0 /etc/passwd /var/chroot/sshd/etc/passwd none bind 0 0 /etc/shadow /var/chroot/sshd/etc/shadow none bind 0 0 /etc/group /var/chroot/sshd/etc/group none bind 0 0 /srv /var/chroot/sshd/srv none bind 0 0 

如果我现在尝试更改密码,我会得到

 $ passwd Changing password for test. (current) UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: Authentication token manipulation error passwd: password unchanged 

所以, passwd设法检查当前的密码,但在设置它时会死掉。

即使你把密码input到chroot中,它会有用吗? chroot中的passwd将更新chroot中的/ etc / passwd或shadow,而不是系统passwd / shadow。 你可能需要告诉我们更多关于你从这个chroot服务的细节,因为细节可以帮助我们为你提供更好的答案。

你也需要保留pam结构(通常是/etc/pam.d)