Блог

Новости, акции и полезные статьи для разработчиков.

Настройка SFTP-доступа в Debian 8

Общая информация

SFTP (SSH File Transfer Protocol) - протокол прикладного уровня, предназначенный для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения.
Протокол разработан группой IETF как расширение к SSH-2, однако SFTP допускает реализацию и с использованием иных протоколов сеансового уровня.

Протокол предполагает, что:
- он работает поверх установленного безопасного канала;
- сервер уже аутентифицировал клиента;
- идентификатор клиента доступен протоколу.

Сервер SFTP по умолчанию использует 22-ой порт.

SSH File Transfer Protocol не является протоколом FTP, работающим поверх SSH - это другой, новый протокол. По сравнению с протоколом SCP, который позволяет только передачу файлов,
протокол SFTP допускает ряд других операций, как например, возобновление, прерывание передачи и удаление файла. SFTP более независимый от платформы, чем SCP. Сам протокол не
обеспечивает аутентификацию и безопасность. Ожидается, что это должен выполнить базовый протокол. SFTP чаще всего используется в качестве подсистемы реализаций версии 2 протокола
SSH, разработанных той же рабочей группой. Загруженные файлы могут быть связаны с их основными атрибутами, такими как метки времени. Это является преимуществом перед протоколом
FTP, у которого нет условия для загрузок, чтобы включать исходный атрибут даты/метки времени.

Поддержка сервером SFTP определяется как подсистема с указанием программы и опций.
По умолчанию в конфигурационном файле /etc/ssh/sshd_config указано:

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

OpenSSH по умолчанию даёт пользователю возможность доступа ко всей файловой системе, то есть к / - корню. И хотя есть права доступа, которые не позволят пользователю производить,
например, операции записи по всей файловой системе, в целях безопасности такую возможность лучше отключить.

Настройка для пользователя

Предоставление SFTP-доступа для пользователя user1 без активной shell-оболочки c ограничением доступа
только к домашней директории (chroot).

Создаём пользователя user1 с /home/user1 в качестве домашней директории и оболочкой /usr/sbin/nologin:

# adduser -d /home/user1 -s /usr/sbin/nologin 

Владельцем и группой для директории, которая будет указываться как корневая ChrootDirectory, а также для её родительских директорий, должен быть root:

# chown root:root /home/user1

В противном случае пользователь не сможет загружать или изменять файлы и директории.

Устанавливаем права на чтение/запись/выполнение для корневой директории пользователя:

# chmod 755 /home/user1

В /etc/ssh/sshd_config указываем:

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

Match User user1
   ChrootDirectory /home/user1
   ForceCommand internal-sftp
   AllowTCPForwarding no
   X11Forwarding no

ChrootDirectory - поддерживает различные переменные:

%u - имя пользователя;
%h - домашняя директория пользователя

Для того, чтобы user1 мог, например, загружать файлы - в корневой директории пользователя создаём директорию upload с владельцем и группой user1:

# mkdir /home/user1/upload
# chown user1:user1 /home/user1/upload

Настройка для группы пользователей

Предоставление SFTP-доступа только к директории /home/sftp для пользователей группы sftponly.

Создаём группу sftponly:

# groupadd sftponly
# grep sftponly /etc/group
sftponly:x:1001:

Указываем владельца и группу для ChrootDirectory:

# chown root:root /home/sftp

Устанавливаем права на чтение/запись/выполнение для корневой директории пользователей группы sftponly:

# chmod 755 /home/sftp

Добавляем в группу sftponly пользователя user2:

# useradd user2 -g sftponly -M -N -o -u 1001

-g, --gid GROUP - group id, в нашем случае sftponly;
-M - не создавать домашнюю директорию пользователя;
-N, --no-user-group - не создавать новую группу user2;
-o, --non-unique - позволяет создавать пользователей с дублирующимися UID;
-u, --uid UID - цифровое значение идентификатора пользователя, указываем как и для sftponly - 1001.

В /etc/ssh/sshd_config указываем:

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

Match Group sftponly
   ChrootDirectory /home/sftp
   ForceCommand internal-sftp
   AllowTCPForwarding no
   X11Forwarding no

Создаём директорию, в которой пользователи группы sftponly будут иметь права на запись/чтение/выполнение:

# mkdir /home/sftp/rwxtest
# chown root:sftponly /home/sftp/rwxtest
# chmod 775 /home/sftp/rwxtest

Разграничение SSH и SFTP доступа

Создадим два открытых SSH-сокета:
- первый только для SFTP-доступа с прослушиваемым портом 2202;
- второй для полного SSH-доступа для авторизированных пользователей, порт 2204.

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

Создаём новый конфигурационный файл, копируя основной:

# cp /etc/ssh/sshd_config /etc/ssh/sftp_config

Редактируем файл /etc/ssh/sftp_config и меняем прослушиваемый порт, например, на 2202:

Port 2202

Указываем PID-файл:

PidFile /var/run/sftp.pid

Устнавливаем no для X11Forwarding:

X11Forwarding no

Затем добавляем следующие строки:

ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no

Ниже пример полного листинга полученного конфигурационного файла /etc/ssh/sftp_config:

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
<strong>Port 2202</strong>
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 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
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

<strong>PidFile /var/run/sftp.pid</strong>

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 1024

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile    %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

<strong>X11Forwarding no</strong>
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

<strong>Subsystem sftp internal-sftp</strong>
<strong>ChrootDirectory %h</strong>
<strong>ForceCommand internal-sftp</strong>
<strong>AllowTcpForwarding no</strong>

UsePAM yes

Конфигурируем автозапуск sftp - копируем /lib/systemd/system/ssh.service в /lib/systemd/system/sftp.service
и приводим его к следующему виду:

[Unit]
Description=<strong>OpenBSD Secure Shell server (SFTP only)</strong>
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS -f <strong>/etc/ssh/sftp.conf</strong>
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=<strong>sftp.service</strong>

Разрешаем запуск сервиса:

# systemctl enable sftp.service

и запускаем его:

# service sftp start

Настройка основного SSH доступа

Для того, чтобы запретить обычным пользователям доступ к shell по протоколу SSH, изменим основной
конфигурационный файл /etc/ssh/sshd_config. Добавим директивы AllowUsers или AllowGroups:

# AllowUsers или AllowGroups, но не обе директивы сразу!
AllowUsers root adm1n
#AllowGroups sudo

Ниже пример полного конфигурационного файла /etc/ssh/sshd_config:

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
<strong>Port 2204</strong>
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 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
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 1024

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
<strong>AllowUsers adm1n</strong>

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile    %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding no
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

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

UsePAM yes

Перезапускаем сервис ssh:

# service ssh restart