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

Вступление

SFTP означает протоколSSHFмолчаниеTransferP. Как следует из названия, это безопасный способ передачи файлов между компьютерами с использованием зашифрованного соединения SSH. Несмотря на название, это совершенно другой протокол, чемFTP (FilentTransferProtocol), хотя он широко поддерживается современными FTP-клиентами.

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

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

Предпосылки

Чтобы следовать этому руководству, вам понадобится доступ к серверу Ubuntu 18.04. На этом сервере должен быть пользователь без полномочий root с привилегиямиsudo, а также должен быть включен брандмауэр. Чтобы получить помощь по настройке, следуйте нашимInitial Server Setup Guide for Ubuntu 18.04.

[[step-1 -—- Creating-a-new-user]] == Шаг 1. Создание нового пользователя

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

sudo adduser sammyfiles

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

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

[[шаг-2 -—- создание-каталога-для-передачи-файлов]] == Шаг 2 - Создание каталога для передачи файлов

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

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

[.note] #Note: Некоторые версии OpenSSH не имеют таких строгих требований к структуре каталогов и владению, но большинство современных дистрибутивов Linux (включая Ubuntu 18.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 -—- ограничение-доступа-к-одному-каталогу]] == Шаг 3 - Ограничение доступа к одному каталогу

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

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

sudo nano /etc/ssh/sshd_config

Прокрутите до самого конца файла и добавьте следующий фрагмент конфигурации:

/etc/ssh/sshd_config

. . .

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Затем сохраните и закройте файл.

Вот что делает каждая из этих директив:

  • Match User сообщает серверу SSH применять следующие команды только к указанному пользователю. Здесь мы указываемsammyfiles.

  • ForceCommand internal-sftp заставляет SSH-сервер запускать SFTP-сервер при входе в систему, запрещая доступ к оболочке.

  • PasswordAuthentication yes разрешает аутентификацию по паролю для этого пользователя.

  • ChrootDirectory /var/sftp/ гарантирует, что пользователю не будет разрешен доступ к чему-либо, кроме каталога/var/sftp.

  • AllowAgentForwarding no,AllowTcpForwarding no. аX11Forwarding no отключает переадресацию портов, туннелирование и пересылку X11 для этого пользователя.

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

[.Примечание]##

Note: вы можете опустить строкуPasswordAuthentication yes и вместо этого настроить доступ по ключу SSH для повышения безопасности. Для этого следуйте инструкциям разделаCopying your Public SSH Key в руководствеSSH Essentials: Working with SSH Servers, Clients, and Keys. Обязательно сделайте это, прежде чем отключить доступ к оболочке для пользователя.

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

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

sudo systemctl restart sshd

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

[[step-4 -—- verifying-the-configuration]] == Шаг 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-адресам. Вы можете найти примеры дополнительных параметров конфигурации и объяснения возможных директив вOpenSSH Cookbook. Если у вас возникнут какие-либо проблемы с SSH, вы можете отладить и исправить их с помощью этогоtroubleshooting SSH series.

Related