Блог

Новини, акції та корисні статті для розробників.

Настройка 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-оболонки з обмеженням доступу
тільки до домашньої директорії (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