
Обычно после успешного входа в систему sftp
и выполнения put
команды я ожидаю, что мой файл будет перемещен в $HOME
каталог вошедшего в систему пользователя. Это работает из коробки, но я хотел бы ограничить пользователя sftp
его $HOME
каталогом (чтобы он не мог cd
подняться на более высокие уровни, например).
Вот где я использую ChrootDirectory
- согласно документации (https://linux.die.net/man/5/sshd_config)
ChrootDirectory: Указывает путь к chroot(2) после аутентификации. Этот путь и все его компоненты должны быть каталогами, принадлежащими root, которые не могут быть записаны никаким другим пользователем или группой
Я считаю, что правильно настроил папки / разрешения. Следующее предложение документации, как мне кажется, не работает или ведет себя не так, как ожидалось.
После chroot sshd(8) изменяет рабочий каталог на домашний каталог пользователя.
После изменения sshd_config
для использования ChrootDirectory
и успешного доступа к серверу через sftp
рабочий каталог пользователя НЕ устанавливается в каталог $HOME пользователя, а на самом деле устанавливается на один уровень выше. (например, /home
вместо /home/userTest
) Очевидным решением для пользователя является переход в нужный каталог на один уровень ниже, но если вы используете какую-то автоматизированную систему, которая просто передает данные по FTP в текущий рабочий каталог, это может быть очень проблематично.
Сначала я покажу общий случай, а затем модифицирую его, чтобы показать, как изменяется поведение рабочего каталога по умолчанию после ChrootDirectory
его внедрения.sshd_config
Это работает так, как и ожидалось:
- Создайте пользователя (используйте
-m
для создания домашнего каталога этого пользователя):sudo useradd -m userTest
- Дайте пользователю пароль:
sudo passwd userTest
- Обратите внимание
userTest
на каталог $HOME:cat /etc/passwd
->userTest:x:1002:1004::/home/userTest:/bin/sh
- sftp на ваш сервер для пользователя, которого вы только что создали:
sftp userTest@<your-server>
- Обратите внимание на рабочий каталог после успешного входа в систему:
pwd
->Remote working directory: /home/userTest
Приведенный выше пример работает именно так, как и ожидалось, единственная проблема в том, что userTest
он не заблокирован в рабочем каталоге и может привести cd ..
к сбросу файловой системы.
В нескольких руководствах было одно и то же базовое решение этой проблемы (https://linuxconfig.org/how-to-setup-sftp-server-on-ubuntu-20-04-focal-fossa-linux)
Дополнение к предыдущим шагам
- Добавьте группу sftp (она будет использоваться как ключ для нашего
Match
блока вsshd_config
):sudo addgroup sftp
- Добавить
userTest
пользователя в группу:sudo usermod -a -G sftp userTest
- Редактировать
sshd_config
:sudo nano /etc/ssh/sshd_config
- Добавьте следующие строки в конец файла
Match group sftp
ChrootDirectory /home
ForceCommand internal-sftp
(По сути, это означает, что любой пользователь, принадлежащий к sftp
группе, будет подчиняться правилам ChrootDirectory
и ForceCommand
)
Сохраните файл и перезапустите ssh: sudo systemctl restart ssh
Убедитесь, что указанный каталог ChrootDirectory
удовлетворяет требованиям из документации выше: ls -ltr
-> drwxr-xr-x 4 root root 4096 Jun 10 09:02 home
(я полагаю, что это выполнено)
Сравните результаты стандартной настройки с результатами нашей новой конфигурации sftp, используя userTest
еще раз:sftp userTest@<your-server>
Обратите внимание на текущий рабочий каталог: pwd
->Remote working directory: /
Это не является явным признаком того, что что-то не так, мы ожидаем, что рабочий каталог изменится... однако давайте быстро проверим содержимое текущего рабочего каталога:
ls -ltr
-> drwxr-x--- 3 1002 1004 4096 Jun 10 09:10 userTest
(!!!)
Согласно документации:
После chroot sshd(8) изменяет рабочий каталог на домашний каталог пользователя.
ls -ltr
показывает нам, что рабочий каталог НЕ находится в userTest
домашнем каталоге, а на самом деле находится на один уровень ВЫШЕ.
Есть ли способ настроить ChrootDirectory
или какой-то другой способ заставить это работать так, как ожидается?
ПРИМЕЧАНИЕ: Удаление ForceCommand
из sshd_config на самом деле приводит к этой другой проблеме, которая была закрыта как ERRATA 11 лет назад?
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=681202