Я постоянно учусь чему бы то ни было и в следствии этого вспомнил, а вот есть протокол передачи файлов на основе 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.