В новых версиях openssh (хотя не таких уж и новых, >= 4.9 если не ошибаюсь) есть возможность ограничить доступ пользователя в подсистеме sftp. Т.е. задать ему ChrootDirectory
, как в proftpd. Например в домашнюю папку (ибо нефиг лазить за её пределами). Рассмотрим, как это можно реализовать.
Для начала, создадим группу sftpusers
. Ограничения будут действовать только на пользователей из этой группы (мы ведь не хотим ограничивать пользователя root
?):
addgroup --system sftpusers
Далее заменим подсистему sftp в /etc/ssh/sshd_config
:
-Subsystem sftp /usr/lib/openssh/sftp-server
+Subsystem sftp internal-sftp
Ну и наконец запишем ограничения в тот же файл:
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
Не забываем перечитать конфиг:
invoke-rc.d ssh reload
Теперь разберемся с пользователями. При создании пользователя не надо указывать ему шелл, так как он все равно не сможет им воспользоваться (см. ForceCommand internal-sftp
). Поэтому указываем в качестве шелла /bin/false
. Домашняя папка (точнее папка, которую мы указали в ChrootDirectory
) обязательно должна иметь владельцем пользователя root
. Иначе будем получать ошибку:
fatal: bad ownership or modes for chroot directory "/home/%username%"
А вот группу-владельца chroot
-папки можно задать любую. Но главное условие - chroot
-директория должна быть доступна на запись только для пользователя root
и никого больше. В противном случае получим вышеприведенную ошибку.
Рассмотрим пример создания пользователя:
useradd -G sftpusers -s /bin/false -d /home/user1 user1
mkdir /home/user1
chown root:user1 /home/user1
chmod 750 /home/user1
Если по каким-то причинам, подобные извращения с доступом к домашней папке недопустимы, имеет смысл поставить ограничение на один каталог выше, т.е. жестко прописать:
ChrootDirectory /home
А внутри /home
разруливать доступ к папкам, используя обычные права доступа.