chroot ssh доступ. Настройка.
В OpenSSH, который входит в FreeBSD есть поддержка chroot. То есть можно сделать так, что бы пользователь подключившийся по ssh видел только свое домашнее окружение и не мог выйти в каталоги других пользователей. Остается chroot только настроить.
В первую очередь создадим группу, в которую будем добавлять пользователей которых нужно chrootить, группа пусть будет www-user:
echo 'www-user:*:8080:' >> /etc/group
Теперь внесем настройки в /etc/ssh/sshd_config, в конце файла добавим:
Match group www-user
ChrootDirectory /home/%uИ перезапустим sshd:
/etc/rc.d/sshd restart
sshd настроен, но этого мало. Во первых нужно поменять владельца домашнего каталога на root:wheel, только в этом случае в этот каталог может быть заchrootен пользователь. Иначе системный вызов chroot вылетит с ошибкой:
fatal: bad ownership or modes for chroot directory
Итак добавим пользователя user с основной группой www-user. Его домашний каталог будет /home/user и скопировать в домашнюю директорию все файлы нужные ему для работы. То есть фактически в его каталоге воспроизвести мини систему.
Что бы не мучаться каждый раз я пользуюсь вот этим скриптом:
#!/bin/sh # В скрипт нужно передавать имя пользователя для которого создаем chroot окружение if [ "$1" = "" ] ; then echo " Usage: $0 [ username ]" exit fi USER=$1 GID=`cat /etc/master.passwd | grep "^$USER:" | cut -d ":" -f 4` HOME=/home/$USER # Задаем список бинарей, нужных для работы в chroot BINS=" /bin/cat \ /bin/chmod \ /bin/cp \ /bin/csh \ /bin/date \ /bin/df \ /bin/echo \ /bin/expr \ /bin/ln \ /bin/ls \ /bin/mkdir \ /bin/mv \ /bin/ps \ /bin/pwd \ /bin/rm \ /bin/rmdir \ /bin/sh \ /usr/bin/awk \ /usr/bin/bzip2 \ /usr/bin/diff \ /usr/bin/du \ /usr/bin/ee \ /usr/bin/fetch \ /usr/bin/find \ /usr/bin/grep \ /usr/bin/gunzip \ /usr/bin/gzip \ /usr/bin/less \ /usr/bin/sed \ /usr/bin/sort \ /usr/bin/scp \ /usr/bin/ssh \ /usr/bin/tail \ /usr/bin/tar \ /usr/bin/touch \ /usr/bin/vi \ /usr/bin/uname \ /usr/bin/uptime \ /usr/local/bin/mc \ /usr/local/bin/mcedit \ /usr/local/bin/mcmfmt \ /usr/local/bin/unrar \ /usr/local/bin/unzip \ " # Создаем структуру каталогов chroot окружения mkdir $HOME/bin mkdir $HOME/etc mkdir $HOME/home mkdir $HOME/home/$USER mkdir $HOME/lib mkdir $HOME/libexec mkdir $HOME/tmp mkdir $HOME/usr mkdir $HOME/usr/bin mkdir $HOME/usr/local mkdir $HOME/usr/local/bin mkdir $HOME/usr/local/etc mkdir $HOME/usr/local/share # Копируем бинарники в chroot окружение for item in $BINS; do cp $item $HOME$item done # Определяем какие библиотеки необходимо скопировать chroot for item in $BINS; do ldd $item |awk '{print $3}'|grep "." >> /tmp/libs done # Копируем библиотеки for item in `cat /tmp/libs|sort|uniq`; do cp $item $HOME/lib/ done # Копируем оставшиеся необходимые файлы и библиотеки cp /etc/termcap $HOME/etc/termcap cp /etc/resolv.conf $HOME/etc/resolv.conf cp /etc/nsswitch.conf $HOME/etc/nsswitch.conf cp -R /usr/local/share/mc $HOME/usr/local/share/mc cp /libexec/ld-elf.so.1 $HOME/libexec/ld-elf.so.1 # Создадим /etc/motd для пользователя echo "Welcome $USER" > $HOME/etc/motd # Теперь /etc/profile для него же echo 'export TERMCAP=/etc/termcap' > $HOME/etc/profile echo 'export PS1="$ "' >> $HOME/etc/profile # /etc/group тоже нужен свой cat /etc/group | grep $GID > $HOME/etc/group # Теперь внутри chroot создадим пользователя cat /etc/master.passwd|grep "^$USER:" > $HOME/etc/master.passwd pwd_mkdb -d $HOME/etc $HOME/etc/master.passwd # Выставляем права chown root:wheel $HOME chmod 755 $HOME chmod 755 $HOME chown -R $USER:$GID $HOME/bin chown -R $USER:$GID $HOME/etc chown -R $USER:$GID $HOME/home chown -R $USER:$GID $HOME/lib chown -R $USER:$GID $HOME/libexec chown -R $USER:$GID $HOME/tmp chown -R $USER:$GID $HOME/usr chmod 777 $HOME/tmp # Убираем за собой rm /tmp/libs
На этом настройка окончена.




By Vadim Nikiforov, 08.08.2010 @ 20:00
Не знаете с какого релиза FreeBSD появилась опция chroot в ssh?
Вероятно можно вместо копирования бинарей и библиотек обойтись символьными ссылками или может хард-ссылками.
By hilik, 08.08.2010 @ 21:05
Точно не знаю, надо смотреть когда эта опция появилась в openssh и когда эту версию openssh приняли во FreeBSD. В 7.3 и в 8.0 уже работает, более ранних версий под рукой нет. С симлинками не получится, они будут ссылаться сами на себя. А с хардлинками не пробовал.