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

SFTP (SSH File Transfer Protocol) – это протокол передачи файлов SSH, который предоставляет безопасный способ передачи файлов между машинами благодаря зашифрованному SSH-соединению. Очевидно, его название похоже на FTP, однако эти протоколы совсем разные, хотя SFTP широко поддерживается современными FTP-клиентами.

Читайте также: Что такое FTP и как с ним работать

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

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

Требования

Чтобы следовать этому руководству, вам понадобится предварительно настроенный сервер Ubuntu 20.04. Чтобы получить помощь по настройке, следуйте этому мануалу.

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

Для начала мы создадим нового пользователя (позже мы предоставим ему доступ к серверу только для передачи файлов). В этом мануале мы назовем этого пользователя 8hostfiles, но вы можете использовать любое имя, которое вам нравится.

sudo adduser 8hostfiles

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

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

2: Создание каталога

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

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

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

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

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

sudo mkdir -p /var/sftp/uploads

Передайте права на /var/sftp пользователю root:

sudo chown root:root /var/sftp

Предоставьте root права на запись в этом каталоге, а другим пользователям – права только на чтение и выполнение:

sudo chmod 755 /var/sftp

Измените владельца каталога uploads – передайте его только что созданному вами пользователю (обязательно укажите правильное имя вашего пользователя):

sudo chown 8hostfiles:8hostfiles /var/sftp/uploads

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

3: Ограничение доступа

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

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

sudo nano /etc/ssh/sshd_config

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

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

Вот что делает каждая директива из вышеприведенного фрагмента:

  • Match User позволяет серверу SSH применять следующие команды только к конкретному пользователю. Здесь мы указываем 8hostfiles (опять же, не забудьте обновить имя пользователя, если у вас оно отличается).
  • ForceCommand internal-sftp запускает SFTP-сервер при входе в систему, запрещая доступ к оболочке.
  • PasswordAuthentication yes разрешает парольную аутентификацию для этого пользователя.
  • ChrootDirectory /var/sftp/ гарантирует, что пользователь не сможет получить доступ к другим каталогам, кроме /var/sftp.
  • Директивы AllowAgentForwarding no, AllowTcpForwarding no. и X11Forwarding no отключают переадресацию портов, туннелирование и переадресацию X11 для этого пользователя.

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

Примечание: Вы можете пропустить строку PasswordAuthentication yes и настроить доступ по ключам SSH – это повысит безопасность системы. Если вам подходит этот вариант, обязательно сделайте это, прежде чем отключать доступ к оболочке для пользователя. На следующем этапе мы протестируем конфигурацию с помощью локального SSH-подключения с парольным доступом, но если вы настроите SSH-ключи, вам понадобится доступ к компьютеру, на котором есть пара ключей вашего пользователя.

Добавив эти строки, сохраните и закройте файл. В nano вы можете сделать это, нажав Ctrl+X, затем Y и Enter.

Чтобы применить изменения к вашей конфигурации, перезапустите сервис:

sudo systemctl restart sshd

Теперь ваш SSH-сервер поддерживает ограничения доступа для пользователя 8hostfiles. Остался последний шаг – протестировать конфигурацию и убедиться, что она работает должным образом.

4: Тестирование настройки

Давайте убедимся в том, что наш новый пользователь 8hostfiles может только передавать файлы. Как упоминалось ранее, SFTP используется для передачи файлов между машинами. Чтобы проверить нашу настройку, мы можем передать файл между локальным компьютером и сервером.

Сначала попробуйте войти на свой сервер как пользователь, созданный вами в разделе 1. Из-за настроек, которые вы добавили в конфигурации SSH, это будет невозможно:

ssh 8hostfiles@your_server_ip

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

This service allows sftp connections only.
Connection to your_server_ip closed.

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

Теперь мы проверим, может ли пользователь получить доступ к SFTP для передачи файлов:

sftp 8hostfiles@your_server_ip

Вместо сообщения об ошибке эта команда сгенерирует сообщение об успешном входе в систему с интерактивной командной строкой:

Connected to your_server_ip
sftp>

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

ls

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

uploads

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

cd ..

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

Итак, мы убедились, что ограничения работают должным образом. Наш новый пользователь 8hostfiles может получить доступ к серверу только по протоколу SFTP, только для передачи файлов и не имеет доступа к полной оболочке.

Заключение

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

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

Tags: , ,

Добавить комментарий