В настоящее время у меня РАБОТАЮЩАЯ учетная запись SFTP, использующая закрытый ключ для входа в систему, и пользователь chroot'ed в своем домашнем каталоге.
Цель: сохранить пользовательский chroot, но разрешить WRITE доступ к относительному каталогу chroot без необходимости указывать какой-либо путь или компакт-диск где-либо.
Другими словами, когда пользователь sftp входит в систему, я не хочу, чтобы ему приходилось переходить по другому пути, чтобы загрузить файл.
Из-за того, что каталог chroot требует полного владения root (из-за дизайна chroot), я не уверен, возможно ли это вообще.
В / etc / passwd:
sftpuser:x:1006:1006:,,,:/home/sftpuser:/bin/false
Ключ для входа пользователя находится в:
/home/sftpuser/.ssh/authorized_keys
Правила chroot в sshd_confg:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
Разрешения для домашнего каталога:
# ls -l /home/ |grep sftpuser
drwxr-xr-x 5 root root 4096 May 4 11:24 sftpuser
# ls -l /home/sftpuser/
total 4
drwxrw-r-x 3 sftpuser sftpuser 4096 May 4 11:23 sftp_share
Пример текущего рабочего процесса:
Connected to sftp.example.com.
sftp> ls
sftp_share
sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
remote open("/testfile.txt"): Permission denied
sftp> cd sftp_share
sftp> put testfile.txt
Uploading testfile.txt to /sftp_share/testfile.txt
testfile.txt
Желаемый рабочий процесс:
Connected to sftp.example.com.
sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
testfile.txt
Есть ли способ разрешить загрузку (размещение) в каталог по умолчанию без предварительного chdir?
У меня есть возможность перемещать эти каталоги. Например, каталог chroot sftp не обязательно должен находиться в домашнем каталоге пользователя, я даже могу изменить домашний каталог пользователя (но пользователь все равно должен иметь возможность использовать authorized_keys для входа в систему).
Пожалуйста, обратите внимание: Я понимаю многих клиентов SFTP, а клиент SFTP командной строки позволяет определять относительный путь при входе в систему. Это выходит за рамки этого вопроса, я хочу, чтобы эта конфигурация была выполнена на стороне сервера, и клиенту просто нужно войти в систему.
Привет, @emmdee Мне потребовалась целая вечность, чтобы понять, что в этом есть простой и приятный трюк. Вам просто нужно сделать root владельцем родительской папки, в которой вы хотите использовать sFTP, а затем использовать команду force, чтобы указать конкретному пользователю загрузить определенный DIR внутри каталога CHROOT.
В вашем случае, если вы хотите /home/sftpuser
чтобы быть записываемым каталогом, вам нужно будет сделать корень владелец /home
каталог, затем продолжайте и Force Command он /sftpuser
как целевой каталог для этого пользователя или группы.
Ваш /etc/ssh/sshd_conf
будет выглядеть так:
Match User sftpuser
ChrootDirectory /home
ForceCommand internal-sftp -d /sftpuser
AllowTCPForwarding no
X11Forwarding no
Как только это будет сделано, вы должны предоставить правильные разрешения, как было сказано ранее, корень должен владеть родительским (chroot) каталогом. /home
в то время как пользователю должен принадлежать последний (-d) каталог /sftpuser
. Я собираюсь предположить, что у вас есть группа пользователей sFTP под названием sftpusers, если не; просто опустите группу из следующих команд или замените ее пользователями (корень в первом и sftpusers во-вторых). Поскольку мы используем -R в командной строке для наследования, вам нужно будет начать с корневого владения перед владением пользователем следующим образом:
sudo chown -R root:sftpusers /home
затем для пользователя вы можете запустить:
sudo chown -R sftpuser:sftpusers /home/sftpuser
Я не уверен, что это необходимо, но вы всегда можете перезапустить службу sshd, чтобы убедиться, что все настройки снова перезагружены:
sudo systemctl restart sshd.service
Надеюсь, это должно сработать как шарм, у меня была похожая проблема, и решение было там, глядя мне в глаза большую часть времени.
Ура!
Я знаю, что прошло уже пару лет, но этот пост помог мне на 98%. после долгих поисков.
Чтобы сделать так, чтобы у меня были пользователи chroot и автоматически помещали их в их собственный каталог с разрешениями на запись, я использовал метод, предложенный African Idiot, а также создал исходный каталог chroot, принадлежащий пользователю root и группе ftp.
Но ключевым моментом для меня, чтобы сохранить их в этой папке и не иметь возможности .. и попытаться просмотреть папки других пользователей, было сделать папку chmod 710 (rwx--x---)
чтобы группа ftp выполняла команду internal-sftp -d /% u (т.е. cd в подкаталог пользователей), и теперь, если я попытаюсь cd ..
в верхний каталог, потому что никто не читает, кроме root, он не выполняется.
drwx--x--- 6 root sftpusers uarch 6 Feb 19 15:34 ./
drwxr-xr-x 5 root root uarch 5 Feb 4 09:13 ../
drwxrwx--- 3 anotheruser anotheruser uarch 3 Feb 24 15:34 anotheruser/
drwxrwx--- 3 ftpuser ftpuser uarch 12 Feb 25 10:55 ftpuser/
надеюсь, это тоже поможет кому-то другому.