Для предоставления доступа через ssh
и sftp
например к файлам сайта, можно использовать штатный для FreeBSD демон sshd
.
Для начала добавим в конфиг демона /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 [ -z "$1" ] ; then
echo " Usage: $0 [ username ]"
exit 1
fi
USER=$1
GID=$(id -g $USER)
HOMEDIR=/home/$USER
# Задаем список каталогов в chroot окружении.
SKEL="/bin
/sbin
/etc
/home/$USER
/lib
/libexec
/tmp
/usr/bin
/usr/share
/usr/local/bin
/usr/local/etc
/usr/local/share
/usr/local/libexec"
# Создаем структуру каталогов внутри `chroot` окружения
for i in $SKEL; do
[ ! -d $HOMEDIR$i ] && mkdir -pv $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 | awk '{print $1}')
if [ -n "$p" ]; then
# Копируем бинарники внутрь chroot окружения
cp -vf $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 -vf $item $HOMEDIR/lib/
done
# Подчищаем за собой
[ -f /tmp/chroot_liblist ] && rm -vf /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 -vf $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 -vfR $i $HOMEDIR$i
done
# Если копировали mysql клиента, то настроим дефолтные опции.
cat >$HOMEDIR/usr/local/etc/my.cnf<<-_EOF
[client]
port=3306
host=192.168.120.2
_EOF
# Генерируем /etc/motd для chroot окружения
echo 'Welcome to chroot environment' > $HOMEDIR/etc/motd
# Генерируем csh.cshrc для chroot окружения
echo 'setenv TERMCAP /etc/termcap' > $HOMEDIR/etc/csh.cshrc
cp -fv /.cshrc $HOMEDIR/home/$USER/
#т.к. man требует зачем-то наличие /sbin/sysctl, то создаем заглушку - пустой файл с правами запуска.
[ ! -d $HOMEDIR/sbin/ ] && mkdir -pv $HOMEDIR/sbin
[ ! -x $HOMEDIR/sbin/sysctl ] && chmod -v +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 -vR $USER:$GID $HOMEDIR$i
done
Затем запускаем скрипт, указывая пользователя web:
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
, в противном случае пользователи не смогут войти.
Ссылки по теме:
- lissyara.su - "Использование sftp+chroot из openssh в качестве альтернативы ftp-серверу."
- WOLAND's blog - "BASH. Создание chroot окружения для SSH chroot в FreeBSD."
- Forums.freebsd.org - [Solved] sftp/scp chroot solution?
- Hilink - "chroot ssh доступ. Настройка."
- Под защитой песочного демона (Евгений Зобнин) - Хакер, номер #093, стр. 093-118-4
- opennet.ru - "ssh chroot"
Comments
comments powered by Disqus