Назад | Перейти на главную страницу

Как разрешить passwd в chroot?

У меня есть многопользовательский сервер, который помещает подмножество пользователей в 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 и посмотрите, поможет ли это. Только не забудьте снова включить, он там поможет.