Настройка SFTP-сервера в Ubuntu 18.04 LTS

16.03.2020

Теги: CLILinuxSSHUbuntuДиректорияКонфигурацияНастройкаСерверФайл

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

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

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

Итак, создаем нового пользователя, основную группу и задаем пароль:

$ sudo groupadd sftp-group # создаем группу sftp-group
$ sudo useradd --no-create-home --gid sftp-group sftp-user # создаем пользователя
$ sudo passwd sftp-user # задаем пароль для пользователя sftp-user

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

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

В качестве целевого каталога загрузки будем использовать /srv/sftp/sftp-user. Каталог /srv/sftp будет принадлежать пользователю root и заблокирован для других пользователей. Подкаталог /srv/sftp/sftp-user будет принадлежать пользователю sftp-user, так что он сможет загружать в него файлы.

$ sudo mkdir /srv/sftp
$ sudo chown root:root /srv/sftp
$ sudo chmod 755 /srv/sftp
$ sudo mkdir /srv/sftp/sftp-user
$ sudo chown sftp-user:sftp-group /srv/sftp/sftp-user

Конфигурация ssh-сервера

На этом этапе нужно изменить конфигурацию ssh-сервера и заблокировать пользователю sftp-user доступ к терминалу, но разрешить доступ к передаче файлов. Открываем на редактирование файл конфигурации ssh-сервера и дописываем в конец

$ sudo nano /etc/ssh/sshd_config
# использовать встроенный sftp-сервер
Subsystem    sftp    internal-sftp

# только для пользователей группы sftp-group
Match Group sftp-group
    # только работа с файлами, запрет shell
    ForceCommand internal-sftp
    # разрешить аутентификацию по паролю
    PasswordAuthentication yes
    # разрешить доступ только к /srv/sftp
    ChrootDirectory /srv/sftp
    # запретить все, что не нужно для работы
    PermitTunnel no
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no
$ sudo systemctl restart sshd.service

С функциональной точки зрения sftp-server и internal-sftp практически идентичны. Они построены из одного и того же исходного кода и реализуют SFTP-сервер. Sftp-server это отдельный бинарный файл, а internal-sftp это просто ключевое слово конфигурации. При указании internal-sftp будет использован встроенный SFTP-сервер, вместо запуска внешнего SFTP-сервера. В настоящее время sftp-server является избыточным и сохраняется для обратной совместимости.

#Subsystem    sftp    /usr/lib/openssh/sftp-server
Subsystem    sftp    internal-sftp

Тестирование конфигурации

Пользователь sftp-user не может подключиться по ssh и получить доступ к терминалу:

$ ssh sftp-user@192.168.110.9
sftp-user@192.168.110.9's password: пароль
This service allows sftp connections only.
Connection to 192.168.110.9 closed.

Но пользователь sftp-user может использовать SFTP для передачи файлов:

$ sftp sftp-user@192.168.110.9
sftp-user@192.168.110.9's password: пароль
Connected to 192.168.110.9.
> pwd
Remote working directory: /
> ls
sftp-user

Основные команды SFTP

Оказавшись в командной строке sftp можно получить список доступных команд с помощью команды help

> help
Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
chgrp grp path                     Change group of file 'path' to 'grp'
chmod mode path                    Change permissions of file 'path' to 'mode'
chown own path                     Change owner of file 'path' to 'own'
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
exit                               Quit sftp
get [-afPpRr] remote [local]       Download file
reget [-fPpRr] remote [local]      Resume download file
reput [-fPpRr] [local] remote      Resume upload file
help                               Display this help text
lcd path                           Change local directory to 'path'
lls [ls-options [path]]            Display local directory listing
lmkdir path                        Create local directory
ln [-s] oldpath newpath            Link remote file (-s for symlink)
lpwd                               Print local working directory
ls [-1afhlnrSt] [path]             Display remote directory listing
lumask umask                       Set local umask to 'umask'
mkdir path                         Create remote directory
progress                           Toggle display of progress meter
put [-afPpRr] local [remote]       Upload file
pwd                                Display remote working directory
quit                               Quit sftp
rename oldpath newpath             Rename remote file
rm path                            Delete remote file
rmdir path                         Remove remote directory
symlink oldpath newpath            Symlink remote file
version                            Show SFTP version
!command                           Execute 'command' in local shell
!                                  Escape to local shell
?                                  Synonym for help

Текущий рабочий каталог:

> pwd # удаленный рабочий каталог
> lpwd # локальный рабочий каталог

Изменить рабочую директорию:

> cd uploads # сменить директорию на удаленной системе
> lcd uploads # сменить директорию на локальной системе

Список файлов и директорий:

> ls # список на удаленной системе
> lls # список на локальной системе

Загрузить на удаленную систему файл или директорию:

> put image.jpg # загрузить файл
> put -r images/ # загрузить директорию

Скачать с удаленной системы файл или директорию:

> get image.jpg # скачать файл
> get -r images/ # скачать директорию

Создать директорию:

> mkdir images # создать директорию на удаленной системе
> lmkdir images # создать директорию на локальной системе

Удалить директорию:

> rmdir images # удалить директорию на удаленной системе
> !rmdir images # удалить директорию на локальной системе

Выполнить произвольную команду на локальной системе:

> !команда

Выполнить несколько команд на локальной системе:

> ! # временно выходим из командной строки sftp
$ команда # выполняем команду в shell (bash)
$ команда # выполняем команду в shell (bash)
$ exit # возвращаемся к командной строке sftp
> 

Завершить сеанс:

> exit # или quit или bye

Поиск: CLI • Linux • SSH • Ubuntu • Директория • Конфигурация • Настройка • Сервер • Файл • SFTP

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.