Часто возникает задача дать доступ на сервер в определенную директорию по протоколу sftp, чтобы при этом не было доступа в весь корень файловой системы. Т.е. используя технику chroot
. Делается это следующим образом.
Сначала создается пользователь в системе. Обычно по sftp
заходят для правки контента и группа пользователя назначается общей для этого рода пользователей (например, www-data
). Всё это делается опциями к adduser
или useradd
.
Далее в /etc/ssh/sshd_config
созданному пользователю newuser
добавляется кусок конфига, который определяет параметры входа и chroot
:
Match User newuser ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
После изменения конфига, естественно, нужно рестартануть sshd
.
На этом все не заканчивается. Вот что гласит мануал sshd_config
:
ChrootDirectory
Specifies the pathname of a directory to chroot(2) to after authentication. All components of the pathname must be root-owned directories that are not writable by any other user or group. After the chroot, sshd(8) changes the working directory to the user’s home directory.
…
Из соображений безопасности, чтобы работал chroot
, директория пользователя должна быть от пользователя root
(при этом группа может быть не рутовой). Выполняем это требование, voila и всё работает.
Также для безопасности обычно имеет смысл отключить шелл пользователя
usermod newuser -s /bin/false
PS: Это все применимо именно для sftp
. К сожалению, для scp
это не работает и при попытке подключиться по ssh/scp
произойдет ошибка.