[[Настройка SFTP доступа по OpenSSH]]

Настройка SFTP доступа по OpenSSH

Сервер sshd (OpenSSH) позволяет осуществлять доступ по протоколу SFTP

Теория

Вместе с клиентом ssh из пакета openssh ставиться утилита sftp, работает просто

sftp user@host.name

Поддержка сервером 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 - для гибкой и групповой настройки.
Плюсы: быстро сделать файловый доступ без дополнительного софта
Минусы: организация прав совместного использования файлов




Обсуждение

Дмитрий, 2013/01/28 14:52

Респект!

Вовчик, 2013/05/13 21:21

Спасибо!

Сергей, 2013/09/03 21:32

чрезвычайно полезная статья, СПАСИБО !!!

Artem, 2014/06/15 08:22

Возможно ли с SFTP сделать так, чтобы пользователь видел только конкретные директории, а не с корня начиналась домашняя папка?

Aleksey, 2014/06/16 14:31

ChrootDirectory

Kostya, 2014/09/24 17:42

Добрый вечер, а не могли бы вы подсказать, мучаюсь уже дня два, как только пытаюсь сделать ChrootDirectory доступ у пользователя к серверу пропадает вообще, если параметр ChrootDirectory убрать из ssh конфига то всё нормально, пользователь цепляется, но мне не нравится что он может просматривать весь корневой каталог, нужно как раз чтоб он попадал только в свою домашнюю директорию и всё, владелец у home root у /home/files user, в чём может быть затык?

ilias, 2014/09/24 19:58

права на папку, которая указывается в ChrootDirectory должны принадлежать root.

Kostya, 2014/09/25 13:09

Заработало, папку которую чрутил делал root:root, не помогало, помогла переустановка системы=) видимо экспериментами я её очень загадил, на чистой всё по ману настроил и всё работает=) спасибо автору))

vladimir, 2014/10/23 11:09

Starting sshd: /etc/ssh/sshd_config line 148: Directive 'PermitTunnel' is not allowed within a Match block

не помогает, как быть?

Igor, 2015/10/06 12:08

конфиг который касается пользователя нужно писать после UsePAM yes

Алексей, 2015/12/23 14:16

Получается после входа пользователь попадает в папку, в которую не может писать ?

Aleksey, 2015/12/23 18:45

При ChrootDirectory да, в сам корень пользователь ничего не сможет записать

nlinberg, 2017/02/16 11:31

Спасибо!

Carambe, 2018/03/02 10:01

Ребята, подскажите пожалуйста в чем может быть проблема. Конфигурация: Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key UsePrivilegeSeparation yes

KeyRegenerationInterval 3600 ServerKeyBits 1024

SyslogFacility AUTH LogLevel INFO

LoginGraceTime 120 PermitRootLogin no StrictModes yes

RSAAuthentication yes PubkeyAuthentication yes

IgnoreRhosts yes RhostsRSAAuthentication no HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp internal-sftp

UsePAM yes

Match User testuser X11Forwarding no AllowTcpForwarding no AllowAgentForwarding no PermitTunnel no ForceCommand internal-sftp ChrootDirectory %h/chroot

(/home/testuser — root:root; /home/testuser/chroot — testuser:testuser)

1. В параметре Match User — работает, только если указывать группу, а не пользователя. Если прописывать параметр Match Group — то не работает. 2. При подключении вижу все корневые папки.

Ваш комментарий. Вики-синтаксис разрешён:
242 +5 = ?
 
howto/ssh_sftp.txt · Последние изменения: 2013/11/25 11:18 — lexa
Gentoo Linux Driven by DokuWiki