У меня есть многопользовательский сервер, который помещает подмножество пользователей в chroot. Я хочу разрешить всем пользователям звонить passwd
чтобы изменить их соответствующий пароль. Все остальное, о чем я могу думать, либо избыточно, либо может поставить под угрозу безопасность системы.
Я создаю свой chroot с помощью makejail
используя следующую конфигурацию.
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 passwd, которое находится в /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
удается проверить текущий пароль, но умирает, когда дело доходит до его установки.
Вам также необходимо сохранить структуры pam (обычно /etc/pam.d)
Даже если вы получите пароль в chroot, будет ли он полезен? Passwd внутри chroot будет обновлять / etc / passwd или shadow в chroot, а не системный passwd / shadow. Вероятно, вам нужно будет рассказать нам больше о том, что именно вы обслуживаете из этого chroot, поскольку подробности могут помочь нам дать вам лучший ответ.
У меня была аналогичная проблема, но я считаю, что я построил свой chroot по-другому. В любом случае, поскольку внешний хост chroot был системой Fedora Linux, мне пришлось отключить SELinux, используя setenforce 0
прежде чем я смог успешно chroot /path/to/chroot /bin/bash
а затем используйте passwd
двоичный файл без получения сообщения «Ошибка манипулирования токеном аутентификации».
Обратите внимание, что это не имело ничего общего с теневыми паролями и без тени (вы всегда должны использовать тени), и я пытался изменить пароль root внутри chroot, поэтому он не имел ничего общего с пустым паролем и т. Д.
В этом случае strace на самом деле ведет меня по ложному пути.
Кроме того, похоже, что это зависит от ядра, поскольку 4.17.14 работала без Отключение SELinux, но 4.17.9 требовала этого.
В любом случае, в системах CentOS, Redhat или Fedora с такими странными ошибками сначала выключите SELinux и посмотрите, поможет ли это. Только не забудьте снова включить, он там поможет.