Авг 08 2010

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

На этом настройка окончена.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • 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 уже работает, более ранних версий под рукой нет. С симлинками не получится, они будут ссылаться сами на себя. А с хардлинками не пробовал.

Other Links to this Post


Украинская Баннерная Сеть