Для предоставления доступа через 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"
Комментариев нет:
Отправить комментарий