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

SFTP доступ по OpenSSH

Для чего это нужно? Ограничивает пользователя в одной папке и не позволяет выйти на уровень вверх. В основном используется для предоставления доступа к файловой системе сервера веб-разработчикам. Просто даем доступ к папке с фалами сайта и не позволяем подключаться через ssh. Таким образом, настроив SFTP доступ по OpenSSH, мы обезопасим свой сервер от лишних подключений и обеспечим возможность работы необходимым пользователям.

Теория

Вместе с клиентом 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

Настройка

Рассмотрим следующий вариант: нам зачем-то нужно создать пользователя 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 /user_dir

Общий порядок действий:

  1. Заводим пользователя
  2. Задаем пароль
  3. Добавляем его в группу(например www-data). В моем случае это необходимо чтобы пользователь мог редактировать файлы сайта.
  4. Создаем папку для пользователя (/user_dir). Выше нее пользователь не поднимется. ВАЖНО: владелец папки должен быть root!!!!
  5. Создаем папку /user_dir/files — в эту папку мы будем монтировать нужную папку, если она находится у вас в дебрях где то. Владельцем папки делаем необходимого пользователя.
  6. Монтируем нужную папку во вновь созданную

    mount –bind /var/www/sites /user_dir/files