Как включить SFTP без доступа к оболочке в Ubuntu 16.04
Введение
FTP (протокол передачи файлов), хотя он широко поддерживается современными FTP-клиентами.
SFTP доступен по умолчанию без дополнительной настройки на всех серверах, на которых включен доступ по SSH. Он безопасен и прост в использовании, но имеет недостаток: в стандартной конфигурации сервер SSH предоставляет доступ к передаче файлов и доступ к терминальной оболочке всем пользователям с учетной записью в системе.
В некоторых случаях может потребоваться разрешить передачу файлов только определенным пользователям и запретить доступ по SSH. В этом руководстве мы настроим демон SSH, чтобы ограничить доступ SFTP к одному каталогу без доступа SSH, разрешенного для каждого пользователя.
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Один сервер Ubuntu 16.04, настроенный с помощью этого руководства по начальной настройке сервера, включая пользователя без полномочий root и брандмауэр.
Шаг 1 — Создание нового пользователя
Сначала создайте нового пользователя, которому будет предоставлен доступ только к передаче файлов на сервер. Здесь мы используем имя пользователя sammyfiles, но вы можете использовать любое другое имя пользователя.
- sudo adduser sammyfiles
Вам будет предложено создать пароль для учетной записи, а затем предоставить некоторую информацию о пользователе. Информация о пользователе не является обязательной, поэтому вы можете нажать ENTER
, чтобы оставить эти поля пустыми.
Вы создали нового пользователя, которому будет предоставлен доступ к каталогу с ограниченным доступом. На следующем шаге мы создадим каталог для передачи файлов и настроим необходимые разрешения.
Шаг 2 — Создание каталога для передачи файлов
Чтобы ограничить доступ SFTP к одному каталогу, мы сначала должны убедиться, что каталог соответствует требованиям разрешений сервера SSH, которые очень специфичны.
В частности, сам каталог и все каталоги над ним в дереве файловой системы должны принадлежать пользователю root и быть недоступными для записи кем-либо еще. Следовательно, невозможно просто предоставить ограниченный доступ к домашнему каталогу пользователя, поскольку домашние каталоги принадлежат пользователю, а не root.
Примечание. Некоторые версии OpenSSH не имеют таких строгих требований к структуре каталогов и владельцу, но в большинстве современных дистрибутивов Linux (включая Ubuntu 16.04) они есть.
Есть несколько способов обойти эту проблему собственности. В этом руководстве мы создадим и будем использовать /var/sftp/uploads
в качестве целевого каталога загрузки. /var/sftp
будет принадлежать пользователю root и не будет доступен для записи другим пользователям; подкаталог /var/sftp/uploads
будет принадлежать sammyfiles, так что пользователь сможет загружать в него файлы.
Сначала создайте каталоги.
- sudo mkdir -p /var/sftp/uploads
Установите владельца /var/sftp
как root.
- sudo chown root:root /var/sftp
Дайте права root на запись в тот же каталог, а другим пользователям — только права на чтение и выполнение.
- sudo chmod 755 /var/sftp
Измените владельца каталога uploads
на sammyfiles.
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
Теперь, когда структура каталогов создана, мы можем настроить сам SSH-сервер.
Шаг 3 — Ограничение доступа к одному каталогу
На этом шаге мы изменим конфигурацию SSH-сервера, чтобы запретить терминальный доступ для sammyfiles, но разрешить доступ для передачи файлов.
Откройте файл конфигурации сервера SSH с помощью nano
или вашего любимого текстового редактора.
- sudo nano /etc/ssh/sshd_config
Прокрутите файл до самого конца и добавьте следующий фрагмент конфигурации:
. . .
Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
Затем сохраните и закройте файл.
Вот что делает каждая из этих директив:
Подобрать пользователя
указывает серверу SSH применять следующие команды только к указанному пользователю. Здесь мы указываем sammyfiles.ForceCommand internal-sftp
заставляет сервер SSH запускать сервер SFTP при входе в систему, запрещая доступ к оболочке.PasswordAuthentication yes
разрешает аутентификацию по паролю для этого пользователя.ChrootDirectory /var/sftp/
гарантирует, что пользователю не будет разрешен доступ ни к чему, кроме каталога/var/sftp
. Вы можете узнать больше о chroot в этом руководстве по chroot.AllowAgentForwarding нет
,AllowTcpForwarding нет
. аX11Forwarding no
отключает переадресацию портов, туннелирование и переадресацию X11 для этого пользователя.
Этот набор команд, начинающийся с Подобрать пользователя
, можно копировать и повторять для разных пользователей. Не забудьте соответствующим образом изменить имя пользователя в строке Match User
.
Примечание. Вы можете опустить строку PasswordAuthentication yes
и вместо этого настроить доступ по ключу SSH для повышения безопасности. Для этого следуйте разделу «Копирование открытого ключа SSH» учебника «Основы SSH: работа с серверами, клиентами и ключами SSH». Обязательно сделайте это, прежде чем отключать доступ к оболочке для пользователя.
На следующем шаге мы проверим конфигурацию, используя SSH локально с доступом по паролю, но если вы настроите ключи SSH, вместо этого вам потребуется доступ к компьютеру с парой ключей пользователя.
Чтобы применить изменения конфигурации, перезапустите службу.
- sudo systemctl restart sshd
Теперь вы настроили сервер SSH, чтобы ограничить доступ к передаче файлов только для sammyfiles. Последний шаг — тестирование конфигурации, чтобы убедиться, что она работает должным образом.
Шаг 4 — Проверка конфигурации
Давайте удостоверимся, что наш новый пользователь sammyfiles может только передавать файлы.
Вход на сервер как sammyfiles с использованием обычного доступа к оболочке больше невозможен. Давай попробуем:
- ssh sammyfiles@localhost
Вы увидите следующее сообщение, прежде чем вернуться к исходной подсказке:
Error messageThis service allows sftp connections only.
Connection to localhost closed.
Это означает, что sammyfiles больше не может получить доступ к оболочке сервера по SSH.
Далее давайте проверим, может ли пользователь успешно получить доступ к SFTP для передачи файлов.
- sftp sammyfiles@localhost
Вместо сообщения об ошибке эта команда покажет сообщение об успешном входе в систему с интерактивным приглашением.
SFTP promptConnected to localhost.
sftp>
Вы можете просмотреть содержимое каталога, используя ls
в командной строке:
- ls
Это покажет каталог uploads
, созданный на предыдущем шаге, и вернет вас к подсказке sftp>
.
SFTP file list outputuploads
Чтобы убедиться, что пользователь действительно ограничен этим каталогом и не может получить доступ ни к одному каталогу над ним, вы можете попробовать изменить каталог на тот, который находится над ним.
- cd ..
Эта команда не выдаст ошибку, но перечисление содержимого каталога, как и раньше, не покажет никаких изменений, доказывая, что пользователь не смог переключиться на родительский каталог.
Теперь вы убедились, что ограниченная конфигурация работает должным образом. Вновь созданный пользователь sammyfiles может получить доступ к серверу только по протоколу SFTP для передачи файлов и не имеет доступа к полной оболочке.
Заключение
Вы ограничили пользователю доступ только по SFTP к одному каталогу на сервере без полного доступа к оболочке. Хотя в этом руководстве для краткости используется только один каталог и один пользователь, этот пример можно расширить до нескольких пользователей и нескольких каталогов.
Сервер SSH допускает более сложные схемы конфигурации, включая ограничение доступа для групп или нескольких пользователей одновременно или ограничение доступа к определенным IP-адресам. Вы можете найти примеры дополнительных параметров конфигурации и объяснение возможных директив в серии статей по устранению неполадок SSH.