- Как настроить SFTP Chroot Jail
- Создание группы SFTP
- Добавление пользователей в группу SFTP
- Настройка SSH
- Тестирование конфигурации
- Выводы
- SFTP chroot
- Installation
- Configuration
- Setup the filesystem
- Create an unprivileged user
- Configure OpenSSH
- Fixing path for authorized_keys
- Tips and tricks
- Write permissions
- Allow upload only
- Logging
- Create sub directory
- Bind to journald
- Syslog-ng configuration
- OpenSSH configuration
- Restart service
- Alternatives to SFTP
- Secure copy protocol (SCP)
- Scponly
- Adding a chroot jail
- See also
Как настроить SFTP Chroot Jail
Если вы системный администратор, управляющий сервером Linux, скорее всего, вам может потребоваться предоставить SFTP-доступ некоторым пользователям для загрузки файлов в их домашние каталоги. По умолчанию пользователи, которые могут войти в систему через SSH, SFTP и SCP, могут просматривать всю файловую систему, включая каталоги других пользователей. Это может не быть проблемой, если этим пользователям доверяют, но если вы не хотите, чтобы вошедшие в систему пользователи могли перемещаться по системе, вам необходимо ограничить доступ пользователей к их домашнему каталогу. Это добавляет дополнительный уровень безопасности, особенно в системах с несколькими пользователями.
В этом руководстве мы объясним, как настроить среду SFTP Chroot Jail, которая ограничит пользователей их домашними каталогами. Пользователи будут иметь доступ только по SFTP, доступ по SSH будет отключен. Эти инструкции должны работать для любого современного дистрибутива Linux, включая Ubuntu, CentOS, Debian и Fedora.
Создание группы SFTP
Вместо того, чтобы настраивать сервер OpenSSH для каждого пользователя индивидуально, мы создадим новую группу и добавим в эту группу всех наших chrooted-пользователей.
Выполните следующую команду groupadd чтобы создать sftponly пользователей sftponly :
Добавление пользователей в группу SFTP
Следующим шагом является добавление пользователей, которых вы хотите ограничить, в группу sftponly .
Если это новая настройка и пользователь не существует, вы можете создать новую учетную запись пользователя , набрав:
sudo useradd -g sftponly -s /bin/false -m -d /home/username username
- Параметр -g sftponly добавит пользователя в группу sftponly.
- Параметр -s /bin/false устанавливает оболочку входа пользователя. Установив для оболочки входа значение /bin/false пользователь не сможет войти на сервер через SSH.
- Параметры -m -d /home/username говорят useradd создать домашний каталог пользователя.
Установите надежный пароль для вновь созданного пользователя:
В противном случае, если пользователь, которого вы хотите ограничить, уже существует, добавьте пользователя в группу sftponly и измените оболочку пользователя:
sudo usermod -G sftponly -s /bin/false username2
Домашний каталог пользователя должен принадлежать пользователю root и иметь 755 разрешений :
sudo chown root: /home/username
sudo chmod 755 /home/username
Поскольку домашние каталоги пользователей принадлежат пользователю root, эти пользователи не смогут создавать файлы и каталоги в своих домашних каталогах. Если в доме пользователя нет каталогов, вам необходимо создать новые каталоги, к которым у пользователя будет полный доступ. Например, вы можете создать следующие каталоги:
sudo mkdir /home/username/ sudo chmod 755 /home/username/ sudo chown username:sftponly /home/username/
Если веб-приложение использует каталог пользователя public_html качестве корня документа, эти изменения могут привести к проблемам с разрешениями. Например, если вы используете WordPress, вам нужно будет создать пул PHP, который будет запускаться от имени пользователя, владеющего файлами, и добавить веб- sftponly группу sftponly .
Настройка SSH
SFTP является подсистемой SSH и поддерживает все механизмы аутентификации SSH.
Откройте файл конфигурации SSH /etc/ssh/sshd_config текстовом редакторе :
sudo nano /etc/ssh/sshd_config
Найдите строку, начинающуюся с Subsystem sftp , обычно в конце файла. Если строка начинается с хеша # удалите хеш # и измените его, чтобы он выглядел следующим образом:
Subsystem sftp internal-sftp
Ближе к концу файла следующий блок настроек:
Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
Директива ChrootDirectory указывает путь к каталогу chroot. %h означает домашний каталог пользователя. Этот каталог должен принадлежать пользователю root и не иметь права записи для других пользователей или групп.
Будьте особенно осторожны при изменении файла конфигурации SSH. Неправильная конфигурация может привести к сбою запуска службы SSH.
Как только вы закончите, сохраните файл и перезапустите службу SSH, чтобы применить изменения:
sudo systemctl restart ssh
В CentOS и Fedora служба ssh называется sshd :
sudo systemctl restart sshd
Тестирование конфигурации
Теперь, когда вы настроили SFTP chroot, вы можете попытаться войти на удаленный компьютер через SFTP, используя учетные данные chrooted пользователя. В большинстве случаев вы будете использовать настольный SFTP-клиент, например FileZilla, но в этом примере мы будем использовать команду sftp .
Откройте SFTP-соединение с помощью команды sftp, за которой следует имя пользователя удаленного сервера и IP-адрес сервера или имя домена:
Вам будет предложено ввести пароль пользователя. После подключения удаленный сервер отобразит подтверждающее сообщение и приглашение sftp> :
Запустите команду pwd , как показано ниже, и если все работает, как ожидалось, команда должна вернуть / .
sftp> pwd Remote working directory: /
Вы также можете перечислить удаленные файлы и каталоги с помощью команды ls и вы должны увидеть каталоги, которые мы создали ранее:
sftp> ls public_html uploads
Выводы
В этом руководстве вы узнали, как настроить среду SFTP Chroot Jail на вашем сервере Linux и ограничить доступ пользователей к их домашнему каталогу.
По умолчанию SSH прослушивает порт 22. Изменение порта SSH по умолчанию добавляет дополнительный уровень безопасности на ваш сервер, снижая риск автоматических атак. Вы также можете настроить аутентификацию на основе ключа SSH и подключиться к серверу без ввода пароля.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
SFTP chroot
OpenSSH 4.9+ includes a built-in chroot for SFTP, but requires a few tweaks to the normal install.
Installation
Install and configure OpenSSH. Once running, make sure sftp-server has been set correctly:
Subsystem sftp /usr/lib/ssh/sftp-server
Access files with sftp or SSHFS. Many standard FTP clients should work as well.
Configuration
Setup the filesystem
- Readers may select a file access scheme on their own. For example, optionally create a subdirectory for an incoming (writable) space and/or a read-only space. This need not be done directly under /srv/ssh/jail — it can be accomplished on the live partition which will be mounted via a bind mount as well.
- It is also possible chrooting into /home directory thus skipping the usage of bind, however the desired user home directory should be owned by root:
# chown root:root /home/ # chmod 0755 /home/
Bind mount the live filesystem to be shared to this directory. In this example, /mnt/data/share is to be used, owned by user root and has octal permissions of 755 :
# chown root:root /mnt/data/share # chmod 755 /mnt/data/share # mkdir -p /srv/ssh/jail # mount -o bind /mnt/data/share /srv/ssh/jail
Add entries to fstab to make the bind mount survive on a reboot:
/mnt/data/share /srv/ssh/jail none bind 0 0
Create an unprivileged user
Note: You do not need to create a group, it is possible to use Match User instead of Match Group .
Create a user that uses sftponly as main group and has shell login access denied:
# useradd -g sftponly -s /usr/bin/nologin -d /srv/ssh/jail username
Set a (complex) password to prevent account is locked error (may appear even with key authentication):
Configure OpenSSH
Note: You may want to use Match User instead of Match Group as been given in the previous step.
Subsystem sftp /usr/lib/ssh/sftp-server Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no PasswordAuthentication no
Restart sshd.service to confirm the changes.
Fixing path for authorized_keys
With the standard path of AuthorizedKeysFile, the SSH keys authentication will fail for chrooted-users. To fix this, append a root-owned directory on AuthorizedKeysFile to /etc/openssh/sshd_config e.g. /etc/ssh/authorized_keys , as example:
AuthorizedKeysFile /etc/ssh/authorized_keys/%u .ssh/authorized_keys PermitRootLogin no PasswordAuthentication no PermitEmptyPasswords no Subsystem sftp /usr/lib/ssh/sftp-server
Create authorized_keys folder, generate a SSH-key on the client, copy the contents of the key to /etc/ssh/authorized_keys (or any other preferred method) of the server and set correct permissions:
# mkdir /etc/ssh/authorized_keys # chown root:root /etc/ssh/authorized_keys # chmod 755 /etc/ssh/authorized_keys # echo 'ssh-rsa ' >> /etc/ssh/authorized_keys/username # chmod 644 /etc/ssh/authorized_keys/username
Tips and tricks
Write permissions
The bind path needs to be fully owned by root , however files and/or subdirectories do not have to be. In the following example the user www-demo uses /srv/ssh/www/demo as the jail-directory:
# mkdir /srv/ssh/www/demo/public_html # chown www-demo:sftponly /srv/ssh/www/demo/public_html # chmod 755 /srv/ssh/www/demo/public_html
The user should now be able to create files/subdirectories inside this directory. See File permissions and attributes for more information.
Allow upload only
To allow only uploading files via sftp and deny downloading files, change the ForceCommand internal-sftp line:
Match Group sftponly ForceCommand internal-sftp -u 0666 -p realpath,open,write,close,lstat
Logging
The user will not be able to access /dev/log . This can be seen by running strace on the process once the user connects and attempts to download a file.
Create sub directory
Create the sub-directory dev in the ChrootDirectory , for example:
# mkdir /usr/local/chroot/user/dev # chmod 755 /usr/local/chroot/user/dev
Now you should create socket at /usr/local/chroot/user/dev/log which will be used by openssh. You may directly bind this socket to /dev/log (or /run/systemd/journal/dev-log in case you are using journald) or create using syslog-ng / rsyslog .
Bind to journald
# touch /usr/local/chroot/user/dev/log # mount --bind /run/systemd/journal/dev-log /usr/local/chroot/user/dev/log
Syslog-ng configuration
Add to /etc/syslog-ng/syslog-ng.conf a new source for the log and add the configuration, for example change the section:
#sftp configuration destination sftp < file("/var/log/sftp.log"); >; filter f_sftp < program("internal-sftp"); >; log < source(src); filter(f_sftp); destination(sftp); >;
(Optional) If you would like to similarly log SSH messages to its own file:
#sshd configuration destination ssh < file("/var/log/ssh.log"); >; filter f_ssh < program("sshd"); >; log < source(src); filter(f_ssh); destination(ssh); >;
OpenSSH configuration
Edit /etc/ssh/sshd_config to replace all instances of internal-sftp with internal-sftp -f AUTH -l VERBOSE .
Restart service
Restart service syslog-ng and sshd .
/usr/local/chroot/theuser/dev/log should now exist.
Alternatives to SFTP
Secure copy protocol (SCP)
Installing openssh provides the scp command to transfer files. SCP may be faster than using SFTP [1].
Install rssh AUR or scponly as alternative shell solutions.
Scponly
For existing users, simply set the user’s shell to scponly:
# usermod -s /usr/bin/scponly username
Adding a chroot jail
The package comes with a script to create a chroot. To use it, run:
# /usr/share/doc/scponly/setup_chroot.sh
- Provide answers.
- Check that /path/to/chroot has root:root owner and r-x for others.
- Change the shell for selected user to /usr/bin/scponlyc .
- sftp-server may require some libnss modules such as libnss_files. Copy them to chroot’s /lib path.