如何在 chroot 中允许 passwd?

如何在 chroot 中允许 passwd?

我有一个多用户服务器,它将一部分用户置于 chroot 中。我想允许所有用户调用passwd以更改各自的密码。我能想到的其他所有方法要么是过度的,要么可能会危及系统安全。

makejail我使用以下配置构建我的 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,但如果我以我的测试用户(位于该 chroot 内)身份登录,我会得到:

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

不幸的是我不明白(在您询问之前,是的,我确信我输入的密码是正确的)。我通过 g 找到了一些网站,但它们对我的帮助与实际错误消息一样小。据我所知,我缺少一些 pam 模块,但我不知道如何将其添加到构建监狱的 python 脚本中。

我正在运行 Ubuntu Server 10.04。

编辑

我已将实际/etc/passwd绑定(通过/etc/fstab)到 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设法检查当前密码,但在设置密码时失败。

答案1

即使您将密码放入 chroot 中,它还会有用吗?chroot 中的密码将更新 chroot 中的 /etc/passwd 或 shadow,而不是系统密码/shadow。您可能需要告诉我们更多关于您从此 chroot 中提供什么服务的信息,因为详细信息可能有助于我们为您提供更好的答案。

答案2

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

答案3

我遇到了类似的问题,但我认为我的 chroot 构建方式不同。无论如何,由于 chroot 的外部主机是 Fedora Linux 系统,因此我必须setenforce 0先禁用 SELinux,然后才能成功chroot /path/to/chroot /bin/bash使用passwd二进制文件,而不会收到“身份验证令牌操作错误”。

请注意,它与影子密码和非影子密码无关(您应该始终使用影子密码),并且我试图在 chroot 中更改 root 密码,因此它与空白密码等无关。

在这种情况下,strace 实际上让我走上了错误的道路。

此外,它似乎是内核特定的,因为 4.17.14 可以工作没有禁用 SELinux,但是 4.17.9 要求我这样做。

无论如何,在 CentOS、Redhat 或 Fedora 系统上,如果出现类似这样的奇怪错误,请先关闭 SELinux,看看是否有帮助。只需确保将其重新打开,它就会有所帮助。

相关内容