Я собрал следующий скрипт, который отлично работает. Он создаст пользователя sftp, и когда пользователь войдет в систему, он будет в /var/base/test1
, из которого он не может писать в этом каталоге, ему нужно войти, /var/base/test1/test1
и тогда он сможет писать.
Однако это немного раздражает, и в идеале я хочу, чтобы пользователь входил в /var/base/test1/test1
каталог, когда он входит через ftp. Есть ли способ облегчить это? Если я изменю ChrootDirectory (в sshd_config) на /var/base/test1/test1
, то пользователь ftp больше не сможет войти.
mkdir -p /var/base/test1/test1
chown root:root /var/base/test1
chown root:root /var/base
chmod 755 /var/base/test1
adduser --disabled-password --gecos test1
echo “test1:apassword” | chpasswd
chown test1:test1 /var/base/test1/test1
vim /etc/ssh/sshd_config
systemctl restart sshd
sshd_config:
Match User test1
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/base/test1
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
решение1
Короткий ответ
Это невозможно, но установите его /test1
как обходной путь.
Длинный ответ
openssh
требует, чтобы ChrootDirectory
и все компоненты пути, ведущие к нему, принадлежали пользователю root и не были доступны для записи кому-либо еще. Это мера безопасности, гарантирующая, что ChrootDirectory
нельзя будет злонамеренно манипулировать и, например, заменить символической ссылкой на что-то совершенно другое. Если ChrootDirectory
или любой из его родительских каталогов не принадлежит пользователю root или доступен для записи группе или всем, sshd
отказывает в входе. Если это происходит, вы видите что-то вроде этого в /var/log/auth.log
:
Jun 10 07:54:01 ubuntu-bionic sshd[2251]: fatal: bad ownership or modes for chroot directory "/var/base/test1"
Jun 10 07:54:01 ubuntu-bionic sshd[2173]: pam_unix(sshd:session): session closed for user test1
Сообщение об ошибке должно указать вам правильное направление.
Об этом также прямо говорится вСтраница руководства sshd_config:
ChrootDirectory
Указывает путь к каталогу для chroot(2) после аутентификации. При запуске сеанса sshd(8) проверяет, что все компоненты пути являются каталогами, принадлежащими root, которые не доступны для записи никакому другому пользователю или группе. После chroot sshd(8) изменяет рабочий каталог на домашний каталог пользователя.[...]Для безопасности очень важно, чтобы иерархия каталогов не изменялась другими процессами в системе (особенно теми, которые находятся за пределами jail). Неправильная конфигурация может привести к небезопасным средам, которые sshd(8) не сможет обнаружить.
Обходной путь
Однако вы можете установить домашний каталог пользователя на /test1
( sudo usermod test1 -d /test1
), тогда после chroot
применения каталог изменится на /var/base/test1/test1
. Таким образом, пользователю не нужно будет переходить на , test1
а он начнет свою sftp
сессию уже в этом каталоге.
$ sftp -P 2222 test1@localhost
test1@localhost's password:
Connected to localhost.
sftp> pwd
Remote working directory: /test1