Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

Организация безопасного доступа scp и sftp с ограничениями ChrootDirectory

Система ssh поддерживает полезную функцию передачи файлов по сети между узлами сети, но как-то не особо хочется предоставлять доступ ко всей структуре каталогов в системе, пусть даже только для чтения. В нашем случае речь не идёт о полноценном доступе пользователей к системе, а только о создании учётной записи для передачи файлов по сети посредством scp и/или sftp. Можно сказать, что это нечто вроде ограниченного гостевого доступа, но, естественно, с паролем.

Добавим системного пользователя sftp, который будет использоваться для работы команд scp и sftp.

adduser --system --group --disabled-login --no-create-home sftp
passwd sftp

Добавим в настройки сервера sshd (файл конфигурации /etc/ssh/sshd_config) следующие директивы:

AllowUsers sftp

# подсистема sshd для работы sftp
Subsystem sftp internal-sftp

Match User sftp
   ForceCommand internal-sftp
   ChrootDirectory /home/sftp

Создаём каталог /home/sftp, принадлежащий root и с правами доступа drwxr-xr-x - это обязательное условие для корректной работы директивы ChrootDirectory.

cd /home
mkdir sftp
chown root:root sftp
chmod 755 sftp

Внутри данного каталога создаём некоторую структуру каталогов, в которые пользователь sftp имеет доступ для записи.

cd /home/sftp
mkdir home
mkdir home/sftp
mkdir tmp
mkdir upload
chown -R sftp:sftp *
chmod -R 750 *

Перезапускаем sshd.

systemctl reload sshd

Готово! Сейчас вы можете передать файл на данный узел сети.

scp test.txt sftp@hostname:/home/sftp
или
scp test.txt sftp@hostname:/tmp
или
scp test.txt sftp@hostname:/upload

Все файлы останутся в пределах каталога в системе /home/sftp.