Поиск по сайту:

Как включить SFTP без доступа к оболочке в Ubuntu 16.04


Введение

FTP (протокол передачи файлов), хотя он широко поддерживается современными FTP-клиентами.

SFTP доступен по умолчанию без дополнительной настройки на всех серверах, на которых включен доступ по SSH. Он безопасен и прост в использовании, но имеет недостаток: в стандартной конфигурации сервер SSH предоставляет доступ к передаче файлов и доступ к терминальной оболочке всем пользователям с учетной записью в системе.

В некоторых случаях может потребоваться разрешить передачу файлов только определенным пользователям и запретить доступ по SSH. В этом руководстве мы настроим демон SSH, чтобы ограничить доступ SFTP к одному каталогу без доступа SSH, разрешенного для каждого пользователя.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 16.04, настроенный с помощью этого руководства по начальной настройке сервера, включая пользователя без полномочий root и брандмауэр.

Шаг 1 — Создание нового пользователя

Сначала создайте нового пользователя, которому будет предоставлен доступ только к передаче файлов на сервер. Здесь мы используем имя пользователя sammyfiles, но вы можете использовать любое другое имя пользователя.

  1. sudo adduser sammyfiles

Вам будет предложено создать пароль для учетной записи, а затем предоставить некоторую информацию о пользователе. Информация о пользователе не является обязательной, поэтому вы можете нажать ENTER, чтобы оставить эти поля пустыми.

Вы создали нового пользователя, которому будет предоставлен доступ к каталогу с ограниченным доступом. На следующем шаге мы создадим каталог для передачи файлов и настроим необходимые разрешения.

Шаг 2 — Создание каталога для передачи файлов

Чтобы ограничить доступ SFTP к одному каталогу, мы сначала должны убедиться, что каталог соответствует требованиям разрешений сервера SSH, которые очень специфичны.

В частности, сам каталог и все каталоги над ним в дереве файловой системы должны принадлежать пользователю root и быть недоступными для записи кем-либо еще. Следовательно, невозможно просто предоставить ограниченный доступ к домашнему каталогу пользователя, поскольку домашние каталоги принадлежат пользователю, а не root.

Примечание. Некоторые версии OpenSSH не имеют таких строгих требований к структуре каталогов и владельцу, но в большинстве современных дистрибутивов Linux (включая Ubuntu 16.04) они есть.

Есть несколько способов обойти эту проблему собственности. В этом руководстве мы создадим и будем использовать /var/sftp/uploads в качестве целевого каталога загрузки. /var/sftp будет принадлежать пользователю root и не будет доступен для записи другим пользователям; подкаталог /var/sftp/uploads будет принадлежать sammyfiles, так что пользователь сможет загружать в него файлы.

Сначала создайте каталоги.

  1. sudo mkdir -p /var/sftp/uploads

Установите владельца /var/sftp как root.

  1. sudo chown root:root /var/sftp

Дайте права root на запись в тот же каталог, а другим пользователям — только права на чтение и выполнение.

  1. sudo chmod 755 /var/sftp

Измените владельца каталога uploads на sammyfiles.

  1. sudo chown sammyfiles:sammyfiles /var/sftp/uploads

Теперь, когда структура каталогов создана, мы можем настроить сам SSH-сервер.

Шаг 3 — Ограничение доступа к одному каталогу

На этом шаге мы изменим конфигурацию SSH-сервера, чтобы запретить терминальный доступ для sammyfiles, но разрешить доступ для передачи файлов.

Откройте файл конфигурации сервера SSH с помощью nano или вашего любимого текстового редактора.

  1. 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, вместо этого вам потребуется доступ к компьютеру с парой ключей пользователя.

Чтобы применить изменения конфигурации, перезапустите службу.

  1. sudo systemctl restart sshd

Теперь вы настроили сервер SSH, чтобы ограничить доступ к передаче файлов только для sammyfiles. Последний шаг — тестирование конфигурации, чтобы убедиться, что она работает должным образом.

Шаг 4 — Проверка конфигурации

Давайте удостоверимся, что наш новый пользователь sammyfiles может только передавать файлы.

Вход на сервер как sammyfiles с использованием обычного доступа к оболочке больше невозможен. Давай попробуем:

  1. ssh sammyfiles@localhost

Вы увидите следующее сообщение, прежде чем вернуться к исходной подсказке:

Error message
This service allows sftp connections only. Connection to localhost closed.

Это означает, что sammyfiles больше не может получить доступ к оболочке сервера по SSH.

Далее давайте проверим, может ли пользователь успешно получить доступ к SFTP для передачи файлов.

  1. sftp sammyfiles@localhost

Вместо сообщения об ошибке эта команда покажет сообщение об успешном входе в систему с интерактивным приглашением.

SFTP prompt
Connected to localhost. sftp>

Вы можете просмотреть содержимое каталога, используя ls в командной строке:

  1. ls

Это покажет каталог uploads, созданный на предыдущем шаге, и вернет вас к подсказке sftp>.

SFTP file list output
uploads

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

  1. cd ..

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

Теперь вы убедились, что ограниченная конфигурация работает должным образом. Вновь созданный пользователь sammyfiles может получить доступ к серверу только по протоколу SFTP для передачи файлов и не имеет доступа к полной оболочке.

Заключение

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

Сервер SSH допускает более сложные схемы конфигурации, включая ограничение доступа для групп или нескольких пользователей одновременно или ограничение доступа к определенным IP-адресам. Вы можете найти примеры дополнительных параметров конфигурации и объяснение возможных директив в серии статей по устранению неполадок SSH.