Настройка SFTP доступа по OpenSSH
Сервер sshd (OpenSSH) позволяет осуществлять доступ по протоколу SFTP
Теория
Вместе с клиентом ssh из пакета openssh ставиться утилита sftp, работает просто
sftp <USER>@<HOST>
Поддержка сервером SFTP определяется как подсистема с указанием программы и опций, которая будет ее выполнять
/etc/ssh/sshd_config
## По умолчанию Subsystem sftp /usr/lib64/misc/sftp-server ## Альтернатива #Subsystem sftp internal-sftp
если ее закомментировать, то подключиться sftp не получиться
subsystem request failed on channel 0 Couldn't read packet: Connection reset by peer
sftp-server - ставиться из пакета OpenSSH.
Как видно есть выбор между sftp-server и internal-sftp.
А в чем разница?
В интернете я так и не нашел внятного ответа, в основном количестве мануалов используют internal-sftp.
Объясняется это так: нужно если применяем ChrootDirectory
Проверил - работает в обоих вариантах.
Subsystem Configures an external subsystem (e.g. file transfer daemon). Arguments should be a subsystem name and a command (with optional arguments) to execute upon subsystem request. The command sftp-server(8) implements the ``sftp'' file transfer subsystem. Alternately the name ``internal-sftp'' implements an in-process ``sftp'' server. This may simplify configurations using ChrootDirectory to force a different filesystem root on clients. By default no subsystems are defined. Note that this option ap- plies to protocol version 2 only.
Настройка
Рассмотрим следующий вариант: нам нужно создать пользователя user
и предоставить ему полный доступ только к папке с файлами /home/files по sftp (например будет пользоваться WinSCP),
при этом отключим ему возможности ssh и выходить за пределы каталога /home (сделать chroot).
ChrootDirectory - владельцем этой папки должен быть root и у других пользователей не должно быть прав на запись.
В противном случае получим ошибку:
fatal: bad ownership or modes for chroot directory
Поэтому ChrootDirectory делается на каталог выше, где у пользователя нету прав на запись, а уже внутри каталога /home/files у него есть права на запись.
Создаем пользователя
useradd -d /dev/null -M -s /bin/bash user passwd user
Создаем папку
mkdir /home/files chmod 777 /home/files # по вашему желанию chown user:user /home/files # по вашему желанию
Настройки sshd
/etc/ssh/sshd_config
... Subsystem sftp internal-sftp Match User user X11Forwarding no AllowTcpForwarding no AllowAgentForwarding no PermitTunnel no ForceCommand internal-sftp ChrootDirectory /home
ChrootDirectory - поддерживает различные переменные
- %u - имя пользователя
- %h - домашняя папка
Match - поддерживает User, Group, Host и Address - для гибкой и групповой настройки.
Плюсы: быстро сделать файловый доступ без дополнительного софта
Минусы: организация прав совместного использования файлов
Обсуждение
Респект!
Спасибо!
чрезвычайно полезная статья, СПАСИБО !!!
Возможно ли с SFTP сделать так, чтобы пользователь видел только конкретные директории, а не с корня начиналась домашняя папка?
ChrootDirectory
Добрый вечер, а не могли бы вы подсказать, мучаюсь уже дня два, как только пытаюсь сделать ChrootDirectory доступ у пользователя к серверу пропадает вообще, если параметр ChrootDirectory убрать из ssh конфига то всё нормально, пользователь цепляется, но мне не нравится что он может просматривать весь корневой каталог, нужно как раз чтоб он попадал только в свою домашнюю директорию и всё, владелец у home root у /home/files user, в чём может быть затык?
права на папку, которая указывается в ChrootDirectory должны принадлежать root.
Заработало, папку которую чрутил делал root:root, не помогало, помогла переустановка системы видимо экспериментами я её очень загадил, на чистой всё по ману настроил и всё работает спасибо автору))
Starting sshd: /etc/ssh/sshd_config line 148: Directive 'PermitTunnel' is not allowed within a Match block
не помогает, как быть?
конфиг который касается пользователя нужно писать после UsePAM yes
Получается после входа пользователь попадает в папку, в которую не может писать ?
При ChrootDirectory да, в сам корень пользователь ничего не сможет записать
Спасибо!
лучшая статья в инете на 2020