Мне кажется, что я просмотрел все руководства по SFTP / Chroot в Интернете и не нашел того, что ищу (или, по крайней мере, ни один из них не дал правильных результатов). Вот моя специфика:
Вот и все. Кажется просто, правда? И все же большинство примеров, которые я видел, связаны с блокировкой всех пользователей SFTP в едином общем каталоге или требуют, чтобы вы «заключили» вашего пользователя в его каталог / home / USER (что не сработает для веб-службы). Я не хочу этого.
Я делаю это в Ubuntu 16.04, на свежем экземпляре AWS EC-2.
Два подхода, которые я пробовал безуспешно:
Установка HOME пользователя в / var / www / html / USER, Chroot помещает их в тюрьму в HOME. По какой-то причине это, похоже, не работает - это приводит к тому, что SFTP просто отказывается подключаться.
Настройка стандартного каталога HOME для пользователя (например, с помощью adduser), создание веб-каталога пользователя, Chroot помещает их в тюрьму в веб-каталог. Мне просто не удалось заставить эту работу работать, несмотря на несколько дней попыток - учетные записи SFTP все еще в конечном итоге туннелируют в каталог HOME, и это часто означает, что они отклоняются тюрьмой Chroot.
В результате либо у пользователей слишком много свободы, либо они полностью заблокированы. Мне никогда не удавалось привести его в ситуацию, когда пользователь может видеть только правильный каталог и может его редактировать. Я пробовал все настройки 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:
изменив его на Subsystem sftp / usr / lib / openssh / sftp-server и закомментировав ForceCommand internal-sftp (без заметных изменений)
Комментируя UsePAM, да (кто-то сообщил, что это помогло, но это просто заставляет sftp-сервер немедленно отклонять все соединения - «закрыто удаленным хостом»)
Хорошо, наконец-то он заработал. Было несколько вещей, которые я делал неправильно, и, очевидно, мои попытки делать это снова и снова приводили к неправильным настройкам, поэтому я просто промыл экземпляр и начал с нуля.
Основная проблема, похоже, в том, что вы не можете сделать каталог 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 может удовлетворить это требование. Легко использовать.