Назад | Перейти на главную страницу

Простой пошаговый способ создания «заточенных» учетных записей только для SFTP.

Мне кажется, что я просмотрел все руководства по SFTP / Chroot в Интернете и не нашел того, что ищу (или, по крайней мере, ни один из них не дал правильных результатов). Вот моя специфика:

Вот и все. Кажется просто, правда? И все же большинство примеров, которые я видел, связаны с блокировкой всех пользователей SFTP в едином общем каталоге или требуют, чтобы вы «заключили» вашего пользователя в его каталог / home / USER (что не сработает для веб-службы). Я не хочу этого.

Я делаю это в Ubuntu 16.04, на свежем экземпляре AWS EC-2.

Два подхода, которые я пробовал безуспешно:

В результате либо у пользователей слишком много свободы, либо они полностью заблокированы. Мне никогда не удавалось привести его в ситуацию, когда пользователь может видеть только правильный каталог и может его редактировать. Я пробовал все настройки chown в этом каталоге (например, user: user, user: sftp, root: root) и настройки разрешений, и, похоже, они не дали никакого эффекта. Мне здесь не хватает чего-то очевидного или глубокого.


Некоторые дополнительные детали - вот одна из моих попыток.

Вот соответствующие части / etc / ssh / sshd_config:

Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

Что соответствует тому, что большинство руководств говорят, что вы должны делать.

Создаю нового пользователя:

adduser --disabled-password -gecos "" --ingroup sftp --shell /usr/sbin/nologin --home /var/www/html/testuser testuser

Что говорит:

Adding user `testuser' ...
Adding new user `testuser' (1001) with group `sftp' ...
Creating home directory `/var/www/html/testuser' ...
Copying files from `/etc/skel' ...

Затем я даю им пароль с помощью passwd.

Затем я пытаюсь войти в систему:

sftp testuser@myserver
testuser@myserver's password: 
packet_write_wait: Connection to myserver_ip: Broken pipe
Connection closed

Кажется, это связано с настройкой тюрьмы Chroot и не связано с какой-либо другой очевидной настройкой сервера. Если я закомментирую ChrootDirectory, он отлично подключается:

sftp testuser@myserver
testuser@myserver's password: 
Connected to myserver.
sftp> pwd
Remote working directory: /var/www/html/testuser

Но я делаю это, пользователь sftp может выйти из своего каталога и бродить по серверу, делая все, что ему заблагорассудится. Не хорошо!

Я также пробовал установить

 ChrootDirectory /var/www/html/%u

И это не меняет ничего, что я вижу (та же ошибка «Сломана труба», что и раньше). (И да, я перезапускаю ssh-сервер каждый раз, когда вношу изменения.)

Это текущие настройки для пользовательской папки:

drwxr-xr-x 4 testuser  sftp 4096 Aug 29 15:00 testuser

В некоторых инструкциях сказано, что для работы Chroot необходимо

chown root:root /var/www/html/testuser

Но я все еще получаю ошибку «Сломанная труба» с набором ChrootDirectory. Изменение разрешений на 777 тоже не меняет. (/ var / www / html принадлежит root: root, как / var / www / и / var /)

Другие вещи, которые я пробовал с / etc / ssh / sshd_config:

Хорошо, наконец-то он заработал. Было несколько вещей, которые я делал неправильно, и, очевидно, мои попытки делать это снова и снова приводили к неправильным настройкам, поэтому я просто промыл экземпляр и начал с нуля.

Основная проблема, похоже, в том, что вы не можете сделать каталог Chroot'ed доступным для записи. Так что это не может быть ваш основной веб-каталог. Я думал об этом неправильно, пытаясь удалить учетные записи пользователей из моего основного каталога Apache. Это неправильно - вы создаете учетные записи пользователей в стандартном каталоге пользователя (/ home / jimmy), создаете папку www (или public_html или что-то еще) в этом каталоге, создаете сам каталог пользователя (в данном случае / home / jimmy /) принадлежит пользователю root, а каталог с возможностью записи (/ home / jimmy / www) должен принадлежать jimmy и группе Chrooted (например, «sftp» в моих примерах выше). Затем вы устанавливаете ChrootDirectory на% h (в данном случае / home / jimmy). Джимми не сможет ничего делать в каталоге / home / jimmy /, но он может помещать файлы в / home / jimmy / www. Чтобы это можно было использовать, вы затем настраиваете userdir в Apache и скажите ему использовать эти www-папки как пользовательские.

Теперь это работает!

Думаю, jail-shell может удовлетворить это требование. Легко использовать.

https://github.com/pymumu/jail-shell