Ограничение доступа с помощью SFTP в Ubuntu 18.04

Posted by

Я постоянно учусь чему бы то ни было и в следствии этого вспомнил, а вот есть протокол передачи файлов на основе SSH — это SFTP (SSH File Transfer Protocol). В его задачу входит передача файлов с сервера на сервер с использование зашифрованного соединения.

Я данный протокол SFTP никогда не настраивал.

ekzorchik@navy:~$ touch file.txt

Чтобы подключиться с помощью него к системе, пусть это будет Ubuntu 18.04 Server amd64, а основная система это Ubuntu 18.04 Desktop amd64

ekzorchik@navy:~$ sftp ekzorchik@172.33.33.25

ekzorchik@172.33.33.25's password:

Connected to 172.33.33.25.

sftp> ls

ls

dproject install.sh

Отобразить справку по доступным командам в консоли:

sftp> help

Отобразить текущий путь в котором находится сессия:

sftp> pwd

Remote working directory: /home/ekzorchik

Отобразить какой путь дефолтный при подключении через SFTP:

sftp> lpwd

Local working directory: /home/ekzorchik

Отобразить текущую версию протокола SFTP:

sftp> version

SFTP protocol version 3

Чтобы перемещаться по серверу из консоли sftp:

sftp> cd /etc

sftp> pwd

Remote working directory: /etc

Чтобы отобразить содержимое директории:

sftp> ls -al

Чтобы посмотреть содержимое файла:

sftp> !cat /etc/issue.net

Ubuntu 18.04.1 LTS

Чтобы передать файл на этот сервер куда подключен под учетной записью, в данной случаем под Login = ekzorchik.

sftp> put file.txt

Uploading file.txt to /home/ekzorchik/file.txt

file.txt 100% 0 0.0KB/s 00:00

sftp> dir

dproject file.txt install.sh

Чтобы скачать файл с сервера на основную систему:

sftp> get install.sh

Fetching /home/ekzorchik/install.sh to install.sh

/home/ekzorchik/install.sh 100% 663 39.0KB/s 00:00

Чтобы отключиться от удаленного сервера:

sftp> quit

ekzorchik@navy:~$

А как сделать чтобы подключившись к удаленному серверу из под определенного пользователя можно было лишь передавать/скачивать файлы/каталоги, но нельзя было зайти через сам SSH и ограничиться только своим каталогом:

ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.25

ekzorchik@srv-bionic:~$ sudo adduser ruser

[sudo] password for ekzorchik:

Adding user ruser' ...

Adding new group ruser' (1005) ...

Adding new user ruser' (1001) with group ruser' ...

Creating home directory /home/ruser' ...

Copying files from /etc/skel' ...

Enter new UNIX password: Aa1234567

Retype new UNIX password: Aa1234567

passwd: password updated successfully

Changing the user information for ruser

Enter the new value, or press ENTER for the default

Full Name []: ruser

Room Number []: ruser

Work Phone []: ruser

Home Phone []: ruser

Other []: ruser

Is the information correct? [Y/n] y

ekzorchik@srv-bionic:~$ sudo mkdir -p /var/sftp/uploads

ekzorchik@srv-bionic:~$ sudo chown root:root /var/sftp

ekzorchik@srv-bionic:~$ sudo chown ruser:ruser /var/sftp/uploads

ekzorchik@srv-bionic:~$ ls -l /var/sftp

total 4

drwxr-xr-x 2 ruser ruser 4096 Sep 26 21:31 uploads

Теперь настраиваю сервис SSHD на удаленной системе для подключения учетных записей через протокол SFTP:

ekzorchik@srv-bionic:~$ sudo nano /etc/ssh/sshd_config

Match User ruser

ForeCommand internal-sftp

PasswordAutherntication yes

ChrootDirectory /var/sftp

PermitTunnel no

AllowAgentForwarding no

AllowTcpForwaring no

X11Forwarding no

На заметку:

  • Директива Match User говорит, что при подключении к удаленному серверу в качестве учетной записи ruser ограничивает его передвижение каталогом /var/sftp, т. к. он принадлежит суперпользователю, а внутри него есть свой домашний каталог uploads где для этой учетной записи права чтение и запись.
  • Директива ForceCommand internal-sftp → при подключении к удаленному серверу будет запускаться протокол SFTP без ввода логина и пароля оболочки bash.
  • Директива PasswordAuthentication yes → активация поддержки парольной аутентификации. Если не указывать данную директиву то будет предполагаться аутентификация по публичным ключам, а не связки логин + пароль.
  • Директива ChrootDirectory /var/sftp/ → блокировка удаленной учетной записи каталогом /var/sftp
  • Директивы AllowAgentForwarding no, AllowTcpForwarding no и X11Forwarding no → отключают форвардинг, туннелирование и X11 для указанного удаленного пользователя обозначенного директивой Match.

Дабы активировать внесенные изменения следует перезапустить службу безопасного подключения:

ekzorchik@srv-bionic:~$ sudo systemctl restart sshd

Job for ssh.service failed because the control process exited with error code.

See "systemctl status ssh.service" and "journalctl -xe" for details.

ekzorchik@srv-bionic:~$ sudo journalctl -xe

-- Support: http://www.ubuntu.com/support

--

-- Unit ssh.service has failed.

--

-- The result is RESULT.

Sep 26 21:43:14 srv-bionic systemd[1]: ssh.service: Service hold-off time over, scheduling restart.

Sep 26 21:43:14 srv-bionic systemd[1]: ssh.service: Scheduled restart job, restart counter is at 5.

-- Subject: Automatic restarting of a unit has been scheduled

-- Defined-By: systemd

-- Support: http://www.ubuntu.com/support

--

-- Automatic restarting of the unit ssh.service has been scheduled, as the result for

-- the configured Restart= setting for the unit.

Sep 26 21:43:14 srv-bionic systemd[1]: Stopped OpenBSD Secure Shell server.

-- Subject: Unit ssh.service has finished shutting down

-- Defined-By: systemd

-- Support: http://www.ubuntu.com/support

--

-- Unit ssh.service has finished shutting down.

Sep 26 21:43:14 srv-bionic systemd[1]: ssh.service: Start request repeated too quickly.

Sep 26 21:43:14 srv-bionic systemd[1]: ssh.service: Failed with result 'exit-code'.

Sep 26 21:43:14 srv-bionic systemd[1]: Failed to start OpenBSD Secure Shell server.

-- Subject: Unit ssh.service has failed

-- Defined-By: systemd

-- Support: http://www.ubuntu.com/support

--

-- Unit ssh.service has failed.

--

-- The result is RESULT.

Sep 26 21:43:20 srv-bionic sudo[23398]: ekzorchik : TTY=pts/0 ; PWD=/home/ekzorchik ; USER=root ; COMMAND=/bin/journalctl -x

Sep 26 21:43:20 srv-bionic sudo[23398]: pam_unix(sudo:session): session opened for user root by ekzorchik(uid=0)

Наверное это из-за того, что сейчас к удаленной системе я подключен через SSH основной, разлогиниваюсь и в консоли Virtualbox (либо физически у системы, в консоли ESXi, в консоли HyperV) пробую перезапустить службу:

ekzorchik@srv-bionic:~$ exit

logout

Connection to 172.33.33.25 closed.

ekzorchik@navy:~$

А нет ошибка не в этом, а вот теперь вдумчиво смотрю настройки которые внес и логи; вот моя ошибка — не правильно указана директива, вместо PasswordAutherntication нужно PasswordAuthentication. Не помогло, но исправило опечатку. Так, а если попробовать запустить сервис sshd в режиме отладки и пронаблюдать, на что он жалуется:

ekzorchik@srv-bionic:~$

/etc/ssh/sshd_config: line 124: Bad configuration option: ForeCommand

/etc/ssh/sshd_config line 124: Directive ForeCommand is not allowed within a Match block

ну вот и вторая опечатка нашлась.

Исправляю. Снова проверяю на ошибки:

ekzorchik@srv-bionic:~$ sudo sshd -t

Missing privilege separation directory: /run/sshd

ekzorchik@srv-bionic:~$ sudo systemctl restart sshd

ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep sshd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 25037/sshd

tcp6 0 0 :::22 :::* LISTEN 25037/sshd

Сервис поднят теперь без каких либо ошибок

Работающие строки.

Match User ruser

ForceCommand internal-sftp

PasswordAuthentication yes

ChrootDirectory /var/sftp

PermitTunnel no

AllowAgentForwarding no

AllowTcpForwarding no

X11Forwarding no

На заметку: Мой Вам совет сперва в тестовой конфигурации разберитесь какие директивы нужно указывать дабы не потерять удаленное подключение к системе если нет средств удаленного администрирования таких как: iLO, IPMI, iDRAC, IP-KVM и т.д, а то придется как у меня сейчас получилось анализировать почему не запускается службу sshd локально находясь возле него.

Проверяю, как работаю внесенные изменения в sshd_config для созданной удаленной учетной записи:

ekzorchik@navy:~$ sftp ruser@172.33.33.25

ruser@172.33.33.25's password: Aa1234567

Connected to 172.33.33.25.

sftp> pwd

Remote working directory: /

sftp> lpwd

Local working directory: /home/ekzorchikно почему-то этот каталог удаленный пользователь видит, ну и ладно

sftp> ls / пробую отобразить содержимое корня и в ответ только каталог ограниченный корневым /var/sftp

/uploads

sftp> cd /

sftp> ls

uploads

sftp> cd /etcпри попытке выйти за пределы ограниченного каталога получаю ошибку, что запрашиваемого каталога нет.

Couldn't stat remote file: No such file or directory

sftp> cd /home

Couldn't stat remote file: No such file or directory

sftp> cd /home/ekzorchik

Couldn't canonicalize: No such file or directory

sftp>

sftp> !cat /etc/issueА почему использование консольных команд сервера работает?

Ubuntu 18.04.1 LTS \n \l

sftp> !cat /etc/passwdА вот это уже дыра и все куда сможет дотянуться учетная запись ruser ставит на нет данную настройку.

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sftp> !cat /etc/shadow

cat: /etc/shadow: Отказано в доступе

Shell exited with status 1

Раз у учетной записи есть доступ к интерпретатору команд, то это нужно подтвердить и если есть ограничить:

ekzorchik@srv-bionic:~$ cat /etc/passwd | grep ruser

ruser:x:1001:1005:ruser,ruser,ruser,ruser,ruser:/home/ruser:/bin/bashследует убрать /bin/bash, должно получиться так:

ekzorchik@srv-bionic:~$ sudo usermod -s /bin/false ruser

ekzorchik@srv-bionic:~$ cat /etc/passwd | grep ruser

ruser:x:1001:1005:ruser,ruser,ruser,ruser,ruser:/home/ruser:/bin/false

Проверяю, не помогло, но данная настройка должна быть, а из этого напрашивается вывод, что учетную запись нужно создавать вручнуюuseradd»), а не пользоваться мастером adduser

Пример:

ekzorchik@srv-bionic:~$ sudo mkdir /var/sftp/ruser2

ekzorchik@srv-bionic:~$ sudo useradd -d /var/sftp/ruser2 -p Aa1234567 -s /bin/false ruser2

ekzorchik@srv-bionic:~$ cat /etc/passwd | grep ruser2

ruser2:x:1002:1006::/var/sftp/ruser2:/bin/false

ekzorchik@srv-bionic:~$ sudo chown ruser2:ruser2 /var/sftp/ruser2

ekzorchik@srv-bionic:~$ sudo nano /etc/ssh/sshd_config

Match User ruser,ruser2

ForceCommand internal-sftp

PasswordAuthentication yes

ChrootDirectory /var/sftp

PermitTunnel no

AllowAgentForwarding no

AllowTcpForwarding no

X11Forwarding no

ekzorchik@srv-bionic:~$ sudo systemctl restart sshd

ekzorchik@navy:~$ ssh -l ruser2 172.33.33.25

ruser2@172.33.33.25's password:

This service allows sftp connections only.

Connection to 172.33.33.25 closed.

ekzorchik@navy:~$ sftp ruser2@172.33.33.25

ruser2@172.33.33.25's password:

Connected to 172.33.33.25.

sftp> pwd

Remote working directory: /

sftp> ls

ruser2 uploads

sftp> mkdir 1

Couldn't create directory: Permission denied

sftp> mkdir uploads/1

Couldn't create directory: Permission denied

sftp> mkdir ruser2/1

sftp> ls -l ruser2/

drwxrwxr-x 2 1002 1006 4096 Sep 26 19:35 1

Итого: учетная запись ruser ограничена только своим домашним каталогом.

Проверяю, свою заметку по настройке пользовательских квот:

ekzorchik@srv-bionic:~$ sudo apt-get install quota -y

ekzorchik@srv-bionic:~$ sudo nano /etc/fstab

UUID=2a35ca1c-7596-11e8-8438-08002728311f / ext4 errors=remount-ro,usrquota,defaults 0 0

ekzorchik@srv-bionic:~$ sudo mount -o remount /

ekzorchik@srv-bionic:~$ sudo quotacheck -cum /

ekzorchik@srv-bionic:~$ sudo quotaon /

Настраиваю квоту для учетной записи ruser2 (100Мб, 100 * 1024 и в колонке hard указываем полученное значение), т. е. Не более 100Мб есть у учетной записи ruser2 для записи:

ekzorchik@srv-bionic:~$ sudo edquota ruser2

Disk quotas for user ruser2 (uid 1002):

Filesystem blocks soft hard inodes soft hard

/dev/sda2 20 0 102400 6 0 0

ekzorchik@navy:~$ sftp ruser2@172.33.33.25

ruser2@172.33.33.25's password:

Connected to 172.33.33.25.

sftp>

ekzorchik@navy:~$ dd if=/dev/zero of=ruser2 bs=200M count=1

1+0 records in

1+0 records out

209715200 bytes (210 MB, 200 MiB) copied, 1.01606 s, 206 MB/s

ekzorchik@navy:~$ file ruser2

ruser2: data

ekzorchik@navy:~$ ls -lh ruser2 && file $_

-rw-rw-r-- 1 ekzorchik ekzorchik 200M Sep 26 22:54 ruser2

ruser2: data

sftp> cd ruser2/

sftp> put ruser2

Uploading ruser2 to /ruser2/ruser2

ruser2 51% 102MB 29.3MB/s 00:03 ETA

Couldn't write to remote file "/ruser2/ruser2": Failure

sftp> ls -lh

-rw-r--r-- ? 1002 1006 100M Sep 26 23:02 ruser2

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

А вот и ограничение в 100Мбайт сработало для учетной записи ruser2. Следовательно настройку протокола SFTP следует дополнить всеми нюансами которые как мне кажется я бы видел у себя на системе описанными для себя в этой реальной заметке.

На заметку: Так СТОП: да нет все правильно учетная запись при указании символа восклицательного знака и команда консоли командной строки исполняется на локальной системе с которой я подключился к удаленной.

На заметку: Я бы еще поставил квоту на каталог /var/sftp дабы удаленная учетная запись не заполнила все место на сервере, а правильнее еще вынести на отдельный раздел не связанный с системным.

А если все же пользователь попытается подключиться к серверу не через протокол SFTP, а через SSH:

ekzorchik@navy:~$ ssh ruser@172.33.33.25

ruser@172.33.33.25's password:

This service allows sftp connections only.

Connection to 172.33.33.25 closed.

Ему будет выведено сообщение, то именно ему доступ ограничен и он может использовать только протокол SFTP внутри которого

Отлично, данная заметка мне пригодится когда нужно будет организовать удаленный доступ к серверу, но при этом не давать им доступ к самому серверу через консоль. На этом у меня все, с уважением автор блога Олло Александра aka ekzorchik.