我有一个多用户服务器,它将一部分用户置于 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,看看是否有帮助。只需确保将其重新打开,它就会有所帮助。