Для предоставления доступа через ssh и sftp например к файлам сайта, можно использовать штатный для FreeBSD демон sshd.
Для начала добавим в конфиг демона /etc/ssh/sshd_config строки:
Пользователь web при подключении по ssh, попадет в chroot окружение, которое было создано скриптом, а пользователь sftp не сможет входить по ssh, но сможет сводобно работать по sftp протоколу, и самое главное, для него будет коневым каталогом /usr/local/www, за его пределы он не сможет выйти.
P.S. Важно, чтобы права на chroot директории были chmod 755 и владелец root:wheel, в противном случае пользователи не смогут войти.
Ссылки по теме:
1. lissyara.su - "Использование sftp+chroot из openssh в качестве альтернативы ftp-серверу."
2. WOLAND's blog - "BASH. Создание chroot окружения для SSH chroot в FreeBSD."
3. Forums.freebsd.org - [Solved] sftp/scp chroot solution?
4. Hilink - "chroot ssh доступ. Настройка."
5. Под защитой песочного демона (Евгений Зобнин) - Хакер, номер #093, стр. 093-118-4
6. opennet.ru - "ssh chroot"
Для начала добавим в конфиг демона /etc/ssh/sshd_config строки:
############## : BEGIN #pw usermod sftponly -d /usr/local/www/ #chown root:wheel /usr/local/www/ #AllowGroups wheel sftp #AllowUsers user1 user2 user3@192.168.1.1 user3@192.168.2.* Match User web ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no Match Group sftp ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ############## : ENDДобавляем в систему пользователя sftp и web:
FreeBSD# adduser Username: sftp Full name: Uid (Leave empty for default): Login group [sftp]: Login group is sftp. Invite sftp into other groups? []: Login class [default]: Shell (sh csh tcsh nologin) [sh]: nologin Home directory [/home/sftp]: /usr/local/www Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : sftp Password : ***** Full Name : Uid : 1002 Class : Groups : sftp Home : /usr/local/www Home Mode : Shell : /usr/sbin/nologin Locked : no OK? (yes/no): y adduser: INFO: Successfully added (sftp) to the user database. Add another user? (yes/no): y Username: web Full name: Uid [1003]: Login group [web]: Login group is web. Invite webb into other groups? []: Login class [default]: Shell (sh csh tcsh nologin) [sh]: csh Home directory [/usr/local/web]: /home/web Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : web Password : ***** Full Name : Uid : 1003 Class : Groups : web Home : /home/web Home Mode : Shell : /bin/csh Locked : no OK? (yes/no): y adduser: INFO: Successfully added (web) to the user database. Add another user? (yes/no): n Goodbye!Теперь нужно создать chroot окружение для пользователя web, для этого я написал скрипт add_ssh_chrootuser.sh:
#!/bin/sh # Проверка задано ли имя пользователя if [ "$1" = "" ] ; then echo " Usage: $0 [ username ]" exit 1 fi USER=$1 GID=$(id -g $USER) HOMEDIR=/home/$USER # Задаем список каталогов в chroot окружении. SKEL="/bin /sbin /etc /home /home/$USER /lib /libexec /tmp /usr /usr/bin /usr/local /usr/share /usr/local/bin /usr/local/etc /usr/local/share /usr/local/libexec" # Создаем структуру каталогов внутри chroot окружения for i in $SKEL; do [ ! -d $HOMEDIR$i ] && mkdir $HOMEDIR$i done # Определяем какие библиотеки необходимо скопировать for item in sh csh zcat cat tbl groff chmod cp echo \ ln ls date expr mkdir mv pwd locale \ rm rmdir awk bzip2 diff du \ ee fetch find grep gunzip gzip \ more less sed sort tail head \ tar touch vi ee mc mcedit \ mysql mysqldump clear tput reset man zcat troff grotty; do p=$(whereis -q $item | cut -d' ' -f1) if [ -n "$p" ]; then # Копируем бинарники внутрь chroot окружения cp $p $HOMEDIR$p ldd $p | awk '{print $3}' | grep '.' >>/tmp/chroot_liblist #ldd $CMD_LIST|grep -v ':$'|grep -v "not a dynamic executable"|cut -f 3 -d " "|sort|uniq|sed 1d else echo "$item is NOT found, skip!" fi done # Копируем библиотеки for item in $(cat /tmp/chroot_liblist | sort | uniq); do cp $item $HOMEDIR/lib/ done # Подчищаем за собой [ -f /tmp/chroot_liblist ] && rm /tmp/chroot_liblist # Копируем оставшиеся необходимые файлы и библиотеки for i in /etc/termcap \ /etc/resolv.conf \ /etc/nsswitch.conf \ /libexec/ld-elf.so.1 \ /libexec/ld-elf32.so.1; do cp $i $HOMEDIR$i done # если копировали mc, то копируем все необходимые для mc файлы. for i in /usr/local/share/mc \ /usr/local/libexec/mc \ /usr/local/etc/mc \ /usr/local/man \ /usr/share/man \ /usr/share/groff_font \ /usr/share/tmac; do cp -R $i $HOMEDIR$i done # Если копировали mysql клиента, то настроим дефолтные опции. echo ' [client] port=3306 host=192.168.120.2' >$HOMEDIR/usr/local/etc/my.cnf # Генерируем /etc/motd для chroot окружения echo 'Welcome to chroot environment' > $HOMEDIR/etc/motd # Генерируем csh.cshrc для chroot окружения echo 'setenv TERMCAP /etc/termcap' > $HOMEDIR/etc/csh.cshrc cp /.cshrc $HOMEDIR/home/$USER/ #т.к. man требует зачем-то наличие /sbin/sysctl, то создаем заглушку - пустой файл с правами запуска. [ ! -d $HOMEDIR/sbin/ ] && mkdir $HOMEDIR/sbin [ ! -x $HOMEDIR/sbin/sysctl ] && chmod +x $HOMEDIR/sbin/sysctl # Генерируем /etc/group для chroot окружения grep $GID /etc/group > $HOMEDIR/etc/group # Переносим запись о пользователе grep "^$USER:" /etc/master.passwd > $HOMEDIR/etc/master.passwd pwd_mkdb -d $HOMEDIR/etc $HOMEDIR/etc/master.passwd # Выставляем права chown root:wheel $HOMEDIR chmod 755 $HOMEDIR chmod 777 $HOMEDIR/tmp for i in $SKEL; do chown -R $USER:$GID $HOMEDIR$i doneЗатем запускаем скрипт, указывая пользователя web:
FreeBSD# sh add_ssh_chrootuser.sh webВ каталоге /home/web будет создана структура каталогов системы и будут скопированы программы и все необходимые для их запуска библиотеки. В скрипте я копирую минимальный набор, которого хватает для чтения логов nginx, работы с mysql и некоторые другие программки - например mc. Перезапускаем демона sshd:
FreeBSD# service sshd restart Stopping sshd. Starting sshd.Все готово! Можно подключаться под созданными учетными записями.
Пользователь web при подключении по ssh, попадет в chroot окружение, которое было создано скриптом, а пользователь sftp не сможет входить по ssh, но сможет сводобно работать по sftp протоколу, и самое главное, для него будет коневым каталогом /usr/local/www, за его пределы он не сможет выйти.
P.S. Важно, чтобы права на chroot директории были chmod 755 и владелец root:wheel, в противном случае пользователи не смогут войти.
Ссылки по теме:
1. lissyara.su - "Использование sftp+chroot из openssh в качестве альтернативы ftp-серверу."
2. WOLAND's blog - "BASH. Создание chroot окружения для SSH chroot в FreeBSD."
3. Forums.freebsd.org - [Solved] sftp/scp chroot solution?
4. Hilink - "chroot ssh доступ. Настройка."
5. Под защитой песочного демона (Евгений Зобнин) - Хакер, номер #093, стр. 093-118-4
6. opennet.ru - "ssh chroot"
Комментариев нет:
Отправить комментарий