mar
03-12-2004, 23:20
возникла задача - сделать песочницу, загнать туда пользователя и дать ему возможность идти по ssh дальше.
Прежде всего, оговорюсь, почему chroot, а не jail:
- только 1 внешний (юзер ожидается снаружи) IP
- мало места на диске, да и машинка старая-слабая.
chroot-песочница, назначение юзеру шелла для попадания в нее и прочее мы как-то уже обсуждали (http://www.forum.oszone.net/showthread.php?t=15803) (могу еще как-нибудь подробно для желающих расписать, но вопрос сейчас не об этом).
Кратко остановлюсь на установка ssh тк она не совсем тривиальна:
Потребовалось:
- копирование программы ssh
- копирование библиотек (узнаем по ldd)
- копирование неотловленных ldd библиотек (ловим: strace sshd 2>&1 | grep lib )
- touch etc/resolv.conf
- echo "order hosts" > etc/host.conf
- echo "127.0.0.1 localhost" > etc/hosts
- cp /usr/bin/env usr/bin/ (может, можно и без этого обойтись)
- mknod dev/random c 2 3 ( а то получим ошибку PRNG is not seeded)
- mknod dev/urandom c 2 4 (см выше)
- mknod dev/tty c 1 0
(NB цифры для mknod смотрим в ls -l /dev | grep что_нам_надо)
- файл паролей в chroot-ом etc (хотя я теперь в этом и не уверена - надо проверить)
- mkdir .ssh
- touch .ssh/known_hosts
Вроде бы все =)
Дальше, собственно, самое интересное
- когда я пыталась запустить ssh после chroot каталог, то упорно получала отлуп со словами unknown user номер_uid_в_настоящем_passwd
отлов этого отлупа в исходниках openssh в портах показал три места в файлах
/usr/src/crypto/openssh/scp.c
/usr/src/crypto/openssh/ssh.c
/usr/src/crypto/openssh/tildexpand.c
во всех трех идет проверка
if ((pwd = getpwuid(userid = getuid())) == NULL)
отлуп
Понятно, что раз в дело вступает getpwuid, то поиск идет не по файлу паролей, а по файлам базы, находящимся в etc. То есть ошибка перестала вылезать не после создания в chroot-ном etc файла паролей, или же master.passwd, а после копирования в этот самый chroot-ный etc
pwd.db и spwd.db
Теперь все работают, но возникают вопросы:
пусть даже юзер в chroot будет запускаться с флагом -u имя (то есть не получит там chroot-ного root-ового shell-a). Все равно как-то сомнения гложат, насколько такой метод безопасен.
Возможные варианты:
1) скомпилировать специально для использования в песочнице ssh без этих строк проверки.
2) сделать так, как сделано - с копированием реальных файлов (и запуском юзера под юзером :))
3) создания файлов базы прямо под chroot (боюсь, придется поизвращаться)
4) any ideas?
Хотелось бы выслушать мнение уважаемого all и всякие идеи по этому поводу :)
Прежде всего, оговорюсь, почему chroot, а не jail:
- только 1 внешний (юзер ожидается снаружи) IP
- мало места на диске, да и машинка старая-слабая.
chroot-песочница, назначение юзеру шелла для попадания в нее и прочее мы как-то уже обсуждали (http://www.forum.oszone.net/showthread.php?t=15803) (могу еще как-нибудь подробно для желающих расписать, но вопрос сейчас не об этом).
Кратко остановлюсь на установка ssh тк она не совсем тривиальна:
Потребовалось:
- копирование программы ssh
- копирование библиотек (узнаем по ldd)
- копирование неотловленных ldd библиотек (ловим: strace sshd 2>&1 | grep lib )
- touch etc/resolv.conf
- echo "order hosts" > etc/host.conf
- echo "127.0.0.1 localhost" > etc/hosts
- cp /usr/bin/env usr/bin/ (может, можно и без этого обойтись)
- mknod dev/random c 2 3 ( а то получим ошибку PRNG is not seeded)
- mknod dev/urandom c 2 4 (см выше)
- mknod dev/tty c 1 0
(NB цифры для mknod смотрим в ls -l /dev | grep что_нам_надо)
- файл паролей в chroot-ом etc (хотя я теперь в этом и не уверена - надо проверить)
- mkdir .ssh
- touch .ssh/known_hosts
Вроде бы все =)
Дальше, собственно, самое интересное
- когда я пыталась запустить ssh после chroot каталог, то упорно получала отлуп со словами unknown user номер_uid_в_настоящем_passwd
отлов этого отлупа в исходниках openssh в портах показал три места в файлах
/usr/src/crypto/openssh/scp.c
/usr/src/crypto/openssh/ssh.c
/usr/src/crypto/openssh/tildexpand.c
во всех трех идет проверка
if ((pwd = getpwuid(userid = getuid())) == NULL)
отлуп
Понятно, что раз в дело вступает getpwuid, то поиск идет не по файлу паролей, а по файлам базы, находящимся в etc. То есть ошибка перестала вылезать не после создания в chroot-ном etc файла паролей, или же master.passwd, а после копирования в этот самый chroot-ный etc
pwd.db и spwd.db
Теперь все работают, но возникают вопросы:
пусть даже юзер в chroot будет запускаться с флагом -u имя (то есть не получит там chroot-ного root-ового shell-a). Все равно как-то сомнения гложат, насколько такой метод безопасен.
Возможные варианты:
1) скомпилировать специально для использования в песочнице ssh без этих строк проверки.
2) сделать так, как сделано - с копированием реальных файлов (и запуском юзера под юзером :))
3) создания файлов базы прямо под chroot (боюсь, придется поизвращаться)
4) any ideas?
Хотелось бы выслушать мнение уважаемого all и всякие идеи по этому поводу :)