Настройка домашнего каталога SFTP или SSH Chroot

Тематические термины: SSH, Linux

По умолчанию, при подключении по SFTP пользователь имеет возможность спускаться по дереву каталогов и видеть структуру папок. А при наличии прав, редактировать и удалять файлы. Доступ можно ограничить, создав специальное окружение для определенной папки и всех ее подпапок.

Настройка sshd
Пользователи и группы
Права на папки
Тестирование и логи
Lshell

We’ve found a workaround recently that goes like this:

Содержание
  1. /etc/ssh/sshd_config:
  2. directory permissions:
  3. Введение
  4. User account setup
  5. Home directory setup
  6. SSH configuration
  7. Введение
  8. Create SFTP User
  9. SFTP restrict user to specific directory (with password authentication)
  10. Step 5.1: Create sftp chroot jail directories
  11. Step 5.2: Assign permissions on chroot jail directories
  12. Step 5.3: Verify SSH and SFTP connectivity and permissions
  13. Step 5.4: Assign SFTP umask (Optional but Important)
  14. How to fix packet_write_wait: Connection to X.X.X.X port 22: Broken pipe?
  15. Создание пользователя и группы
  16. Создание пользователя
  17. Создание группы
  18. Добавление sftp пользователя в bitrixenv
  19. Configure SFTP chroot jail
  20. Выставление прав на каталог
  21. Create SFTP Group (Optional)
  22. Доступ к bitrix сайтам разным пользователям по sftp
  23. Workaround 1
  24. caveate 1
  25. Ошибка ssh bad ownership or modes for chroot directory
  26. Why we use internal-sftp instead of sftp-server for ChrootDirectory?
  27. Добавляем пользователя ssh в chroot директорию
  28. Workaround 2
  29. caveates 2
  30. Lshell как альтернатива chroot ssh
  31. Install sftp on Linux
  32. Настройка SSH
  33. SFTP chroot multiple directories
  34. Setup SSH client for passwordless sftp
  35. Solution 1: Perform passowrdless sftp with private key
  36. Solution 2: Create ssh config file for individual user
  37. Setup passwordless sftp authorized_keys
  38. Step 6.1: Create sftp authorized_keys file
  39. Step 6.2: Generate SSH key pair to setup passwordless sftp
  40. Step 6.3: Setup sftp chroot jail with authorized_keys
  41. Step 6.4: Verify SFTP connectivity and permissions
  42. Заключение
  43. Помогла статья? Подписывайся на telegram канал автора
  44. Проверка и решение проблем

/etc/ssh/sshd_config:

...

Subsystem sftp internal-sftp

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

directory permissions:

root@server:~ # chown root:root /home
root@server:~ # chmod 111 /home
root@server:~ # chmod 700 /home/*

У меня есть веб сервер без возможности удаленного доступа к нему из вне, обслуживает несколько сайтов. Он стоит за фаерволом, проброшен 80-й порт, для работы сайтов этого достаточно. Понадобилось предоставить оперативный доступ сторонних разработчиков к исходным текстам одного из сайтов. У меня неожиданно возникли затруднения с этим, пришлось повозиться.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный тест.

Для эксплуатации сайтов на Bitrix я чаще всего использую BitrixEnv. Это удобный инструмент с консольным управлением, основанном на рецептах ansible. В типовых случаях это сильно упрощает разворачивание и управление окружением. При этом сделано все в целом качественно и удобно, всегда можно все поправить руками, если понимаешь, что и как делать. Но вот если нужно сделать что-то не типовое, возникают закономерные сложности.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный тест.

fatal: bad ownership or modes for chroot directory «/var/www»

ls -ld of this directory shows this:

drwxrwxr-x 4 root sftponly 4096 Aug 12 04:05 /var/www/

sudo chmod 755 /var/www/

Here’s my sshd_config setting

Match group sftponly
ChrootDirectory /var/www
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

So in short sudo chmod 755 /var/www/ allows me to connect but only in READ only mode. sudo chmod 775 /var/www/ doesn’t even allow me to connect.

How to fix this issue?

asked Aug 12, 2017 at 14:21

Frank Martin's user avatar

answered Aug 21, 2017 at 23:54

lgflorentino's user avatar

Here’s the commands you need:

setfacl -Rm «u:sftponly:rwx» /var/www/

setfacl -Rdm «u:sftponly:rwx» /var/www/

Then enjoy your life

answered Oct 2, 2018 at 13:25

Samir Ahmadli's user avatar

  • Install sftp on Linux
  • Configure sftp chroot
  • Create sftp user/Create sftp group
  • sftp restrict user to specific directory
  • sftp chroot multiple directories

sftp is a file transfer program, similar to ftp, which performs all operations over an encrypted ssh transport. It may also use many features of ssh, such as public key authentication and compression.

Доброе время суток All,
Для начала, я тут по шерстил и нашел несколько примеров, и потыкал. но увы везде одна и та же ботва.

Нужно:
Есть сервак, мой, личный и сокровенный, и хочу я дать некому юзеру шанс что то с него качать. но только из одной папки. я потенциально параноидальная личность и не хочу чтобы кто то даже возможность структуры папок смотрел, так далее вот его папк и не куда далее.
Ну и главное, решить это без всяких некстклаудов и почей хераборы.

Что есть сейчас:
Для начала я изучил маны по SSH и оказалось что все просто и пушисто, я создал юзверя :

Убил много времени и мозгов пока в конфигурации SSH не выставил :
ChrootDirectory /

И о боже оно работает, но , вот в чем беда , я могу лазить куда угодно !!!!

самое смешное что даже указание хомяка юзверя
ChrootDirectory /home/dl

вызывает ту же ошибку
fatal: bad ownership or modes for chroot directory component

«/home/dl/»
Это хомяк юзера

именно то что у меня указано в настройках SSH
ChrootDirectory /home/dl

И ругается оно на недостаток прав, на свой хомяк ?
$ ls /home/
drwxr-xr-x 3 dl dl 4096 янв 17 09:43 dl/

я понимаю что у меня кривые руки, но я даже пару мануалов видел где приводились те же действия как рабочие, что я делаю не так ?

I’ve encountered a problem, that I’ve been messing around since hours now, not understand what is happening. I have read tons of guides on this, which should be a 2 minute setup task on Ubuntu, and I still cannot get it to work.

The problem is:

Subsystem sftp internal-sftp

Match Group sftpusers
ChrootDirectory /var/www
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp

Now that I’m through with the prerequisites, here comes the real problem:
When I try to connect with an SFTP this is what I see in the auth log:

Nov  8 22:38:07 hidden_server_name sshd[7436]: Accepted password for wordpress_user from imagine_my_hp_address_here port 49508 ssh2
Nov  8 22:38:07 hidden_server_name sshd[7436]: pam_unix(sshd:session): session opened for user wordpress_user by (uid=0)
Nov  8 22:38:07 hidden_server_name systemd: pam_unix(systemd-user:session): session opened for user wordpress_user by (uid=0)
Nov  8 22:38:07 hidden_server_name systemd-logind[1462]: New session 241 of user wordpress_user.
Nov  8 22:38:07 hidden_server_name sshd[7481]: fatal: bad ownership or modes for chroot directory component "/"
Nov  8 22:38:07 hidden_server_name sshd[7436]: pam_unix(sshd:session): session closed for user wordpress_user
Nov  8 22:38:07 hidden_server_name systemd-logind[1462]: Removed session 241.
Nov  8 22:38:07 hidden_server_name sshd[7481]: fatal: bad ownership or modes for chroot directory component "/"

Why does it want to chroot in to the root directory of the server, when it is clearly set to /var/www?

Someone please relieve me of this headache, it hurts! 😀

В новых версиях openssh (хотя не таких уж и новых, >= 4.9 если не ошибаюсь) есть возможность ограничить доступ пользователя в подсистеме sftp. Т.е. задать ему ChrootDirectory, как в proftpd. Например в домашнюю папку (ибо нефиг лазить за её пределами). Рассмотрим, как это можно реализовать.

addgroup --system sftpusers

Далее заменим подсистему sftp в /etc/ssh/sshd_config:

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

Ну и наконец запишем ограничения в тот же файл:

Match Group sftpusers
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no

Не забываем перечитать конфиг:

invoke-rc.d ssh reload

Теперь разберемся с пользователями. При создании пользователя не надо указывать ему шелл, так как он все равно не сможет им воспользоваться (см. ForceCommand internal-sftp). Поэтому указываем в качестве шелла /bin/false. Домашняя папка (точнее папка, которую мы указали в ChrootDirectory) обязательно должна иметь владельцем пользователя root. Иначе будем получать ошибку:

fatal: bad ownership or modes for chroot directory "/home/%username%"

А вот группу-владельца chroot-папки можно задать любую. Но главное условие — chroot-директория должна быть доступна на запись только для пользователя root и никого больше. В противном случае получим вышеприведенную ошибку.

Рассмотрим пример создания пользователя:

useradd -G sftpusers -s /bin/false -d /home/user1 user1
mkdir /home/user1
chown root:user1 /home/user1
chmod 750 /home/user1

Если по каким-то причинам, подобные извращения с доступом к домашней папке недопустимы, имеет смысл поставить ограничение на один каталог выше, т.е. жестко прописать:

ChrootDirectory /home

А внутри /home разруливать доступ к папкам, используя обычные права доступа.

Введение

Суть проблемы в следующем. Изначально сервер создавался для внутренней работы над всеми сайтами из локальной сети. Разграничения по правам доступа не было, работали с сайтами мало, изредка что-то правили. Со временем разработчиков вообще не осталось, сайты не менялись. Все управление шло через панели администрирования сайтами.

В один прекрасный день решили обновить один из сайтов. Попросили предоставить доступ к исходникам. В принципе, ничего сложного, думал за 5-10 минут все сделаю. Пошел по простому пути. Решил настроить ftp сервер, благо совсем недавно написал обширную статью на эту тему.

Очень быстро его настроил, проверил изнутри — все отлично работает. Создал системного пользователя, зачрутил его в каталог с нужным виртуальным хостом, расставил права как надо. Дальше дело за малым. Надо пробросить порт на шлюзе для доступа к серверу.

Читайте также:  Скачать бесплатно 1с Битрикс — начните прямо сейчас!

Тут началось самое интересное. Я давно не работал с ftp и подзабыл как там с ним и что. А проблем с ним навалом. Простого проброса 21-го порта недостаточно. Я не смог подключиться извне ни в активном, ни в пассивном режиме. На сервере установлен firewall pf, я с ним не очень знаком, почти не работал. Стал читать, как организуют проброс ftp на нем. Оказалось, что необходимо поднять локальный FTP proxy, редиректить на него все подключения и он динамически будет создавать правила для корректной работы ftp.

Мне очень не понравились перспектива ковырять незнакомый фаервол с кучей правил. К тому же нельзя было допустить ошибку и нарушить работу шлюза. Но делать нечего, решил попробовать. Информации в интернете не очень много на эту тему. По тем примерам, что мне попались не смог корректно настроить. То в синтаксисе ошибка, то просто не работает.

Решил не терять время на ковыряния не нужного для меня фаервола и пойти другим путем. Естественно, подумал сразу на sftp. Там нет таких проблем с пробросом портов. Единственное, чего я не делал раньше, так это ограничение доступа по sftp в пределах какого-то каталога. Но как оказалось это не сложно, задача легко и быстро решается.

User account setup

$ useradd -n -M -s $shell -g $group -d "/home/$homedir" "$uname"
  • $shell was equal to /sbin/nologin
  • $group was set to this group: sftponly
  • $homedir was the name of the common home dir
  • $uname is this particular user’s username.

Home directory setup

I then setup the home directories like so:

$ mkdir -m 555 -p "/sftpdata/$homedir"
$ cp -pr /usr/local/bin/skel/. "/sftpdata/$homedir/."
/home         /etc/auto.cifs_sftp    --timeout=2    --ghost
*   /         -fstype=cifs,ro,noperm,netbiosname=${HOST},file_mode=0444,dir_mode=0555,credentials=/etc/sftpuser_credentials.txt ://NASServer/sftpdata/& \
    /upload   -fstype=cifs,rw,noperm,netbiosname=${HOST},file_mode=0666,dir_mode=0777,credentials=/etc/sftpuser_credentials.txt ://NASServer/sftpdata/&/upload
username=dom\user
password=somethingreallylong

SSH configuration

Subsystem   sftp    internal-sftp -f AUTH -l INFO

AllowGroups sftponly

Match   Group sftponly
    ChrootDirectory %h
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no
    PasswordAuthentication yes

Then just make sure to restart the SSH daemon.

$ service sshd restart

Введение

Ранее я уже рассказывал, как делать тонкую настройку сервера под bitrix на основе bitrixenv. Сейчас продолжу эту тему и расскажу, как добавить еще одного пользователя в систему, чтобы он мог спокойно работать над сайтом. Напомню, что по умолчанию bitrixenv создает системного пользователя bitrix с доступом по ssh к серверу. От этого пользователя работают многие службы, так же для него выставлены полные права на исходники сайта.

Если над проектом работает один программист, то нет никаких проблем. Ему выдается пользователь bitrix, который не имеет полных прав на сервере, но при этом может работать с исходниками сайта. И все в порядке. А вот если надо организовать одновременную работу нескольких разработчиков, которым нужен прямой доступ к исходникам сайта, то придется что-то придумывать. Давать им всем одного и того же пользователя неудобно. Нужно каждому свой. Я покажу далее, как это сделать.

Напомню, что по-хорошему, вести разработку сайта необходимо с использованием git. Ранее я показывал пример, как можно деплоить bitrix сайт из репозитория. На практике, над небольшими проектами работают по старинке, правя напрямую исходники сайта. Зачастую даже без dev окружения. Я с этим постоянно сталкиваюсь, когда соприкасаюсь с небольшими интернет магазинами. Думаю, для микро проектов это приемлемо, так как отслеживать изменения по репозиторию банально некому.

В общем, если вам нужна дополнительная учетная запись для работы с bitrix, рассказываю, как это сделать. Причем доступ у этой учетки будет только к папке с исходниками сайта. Первое, что приходит на ум, это создать отдельного пользователя с шелом /sbin/nologin и настроить ему chroot по sftp в настройках ssh. Это первое, что я попробовал. Подробно об этом я рассказываю в отдельной статье про доступ к сайту через sftp. Но в данном случае это не прокатывает. При подключении вы будете получать ошибку в /var/log/secure:

Aug 10 16:11:08 bitrix-dev sshd[3819]: pam_unix(sshd:session): session opened for user devbitrix01 by (uid=0)
Aug 10 16:11:08 bitrix-dev sshd[3819]: fatal: bad ownership or modes for chroot directory component "/home/bitrix/" [postauth]
Aug 10 16:11:08 bitrix-dev sshd[3819]: pam_unix(sshd:session): session closed for user devbitrix01

Суть ошибки в том, что на всем пути до chroot директории, владельцем каталогов с правами на запись может быть только root. Нам это никак не подходит, так как у домашнего каталога /home/bitrix владельцем должен быть пользователь bitrix.

Create SFTP User

[root@server2 ~]# useradd -m deepak
[root@server2 ~]# id deepak
uid=1003(deepak) gid=1003(deepak) groups=1003(deepak)
[root@server2 ~]# ls -ld /home/deepak/
drwx------ 2 deepak deepak 4096 Mar 30 18:48 /home/deepak/
[root@server2 ~]# passwd deepak
Changing password for user deepak.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@server2 ~]# usermod --shell /bin/false deepak
[root@server2 ~]# grep deepak /etc/passwd
deepak:x:1003:1003::/home/deepak:

SFTP restrict user to specific directory (with password authentication)

Step 5.1: Create sftp chroot jail directories

Linux show hidden files and folders with simple commands

[root@server2 ~]# mkdir -p /opt/sftp-jails

Step 5.2: Assign permissions on chroot jail directories

[root@server2 ~]# ls -ld /opt/sftp-jails/
drwxr-xr-x 3 root root 4096 Mar 30 18:29 /opt/sftp-jails/

From the man page https://man.openbsd.org/sshd_config

[root@server2 ~]# ls -ld /opt/sftp-jails/deepak/
drwxr-xr-x 3 root root 4096 Mar 30 18:29 /opt/sftp-jails/deepak/
[root@server2 ~]# chown deepak:root /opt/sftp-jails/deepak/exchange

Also change the permission to 750 to restrict others from writing in this exchange directory

[root@server2 ~]# chmod 750 /opt/sftp-jails/deepak/exchange

Verify the permission:

[root@server2 ~]# ls -ld /opt/sftp-jails/deepak/exchange/
drwxr-x--- 2 deepak root 4096 Mar 30 18:29 /opt/sftp-jails/deepak/exchange/
[root@server2 ~]# tree -paug /opt/
/opt/
└── [drwxr-xr-x root     root    ]  sftp-jails
    └── [drwxr-xr-x root     root    ]  deepak
        ├── [drwxr-x--- deepak   root    ]  exchange

How to create or configure NIC Teaming using nmcli (CentOS / RHEL 7/8)

Step 5.3: Verify SSH and SFTP connectivity and permissions

[root@server1 ~]# ssh deepak@10.10.10.13
deepak@10.10.10.13's password:
This service allows sftp connections only.
Connection to 10.10.10.13 closed.

As expected we are getting «This service allows sftp connections only«.

Step 5.4: Assign SFTP umask (Optional but Important)

So, umask will trim down any additional permission from the files uploaded to the SFTP server.

If you wish to provide a custom umask for SFTP PUT operation then modify

ForceCommand internal-sftp
ForceCommand internal-sftp 

For Example to use sftp umask of 022 we can add:

ForceCommand internal-sftp -u 0022

Restart sshd service to activate the changes.

Now any file uploaded will have atleast 644 permission.

You have to understand one more thing, if the source file permission is 640 then setting umask to 022 will not add additional read permission to others. umask is used only to trim down additional permission. So you have to make sure that the file permission for the files to be uploaded on SFTP server is inline to your requirement.

How to create custom tuned profile in Linux ( RHEL / CentOS 7 )

How to fix packet_write_wait: Connection to X.X.X.X port 22: Broken pipe?

It is possible that if your configuration has some issues, you will get «packet_write_wait: Connection to X.X.X.X port 22: Broken pipe» error instead of «This service allows sftp connections only

# ssh deepak@10.10.10.13
deepak@10.10.10.13's password:
packet_write_wait: Connection to 10.10.10.13 port 22: Broken pipe

Now this error does not gives much detail of the underlying problem but this is seen mostly due to permission issues.

So in such case we must check /var/log/messages on server node which you are trying to connect which for us is server2. We will use journalctl to analyse the error «packet_write_wait: Connection to X.X.X.X port 22: Broken pipe«

Using journalctl -f I found error «fatal: bad ownership or modes for chroot directory«

Mar 30 18:54:17 server2.example.com systemd[1]: Started User Manager for UID 1003.
Mar 30 18:54:17 server2.example.com sshd[10232]: pam_unix(sshd:session): session opened for user deepak by (uid=0)
Mar 30 18:54:17 server2.example.com sshd[10232]: 
Mar 30 18:54:17 server2.example.com sshd[10232]: pam_unix(sshd:session): session closed for user deepak

Now this error «fatal: bad ownership or modes for chroot directory» itself tells you that the permission on your chroot directory provided under /etc/ssh/sshd_config is incorrect.

So you can validate the permission you have provided for your chroot directory to fix «fatal: bad ownership or modes for chroot directory» and re-attempt the ssh.

[root@server1 ~]# sftp deepak@10.10.10.13
deepak@10.10.10.13's password:
 <-- The sftp connection is successful
 pwd <-- Check your present working directory
Remote working directory: /
 ls -lah		<-- List the directories and files in current directory
drwxr-xr-x    ? 0        0            4.0K Mar 30  2020 .
drwxr-xr-x    ? 0        0            4.0K Mar 30  2020 ..
drwxr-x---    ? 1003     0            4.0K Mar 30  2020 exchange

 mkdir test <-- Create a directory named "test"
Couldn't create directory: Permission denied 
                                                 in his home folder, he gets permission denied

 cd exchange/ <-- Navigate to exchange directory

 mkdir deepak_dir <-- Create directory named deepak_dir

 ls -l <-- List the directories and files in current directory
drwx------ 2 deepak deepak 4096 Mar 30 13:38 deepak_dir <-- Directory creation was successful

 pwd <-- Present working directory
Remote working directory: /exchange

 exit <-- To exit your session

Easy steps to open a port in Linux RHEL/CentOS 7/8

Читайте также:  Статья - WebDAV: что это такое, где с ним можно столкнуться, и существующие альтернативы | Форум информационной безопасности -

Создание пользователя и группы

Если в системе еще нет группы или пользователя, для которого мы настроили SSH chroot, выполняем следующие команды.

Создание пользователя

Задаем пароль для пользователя:

Создание группы

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

или отредактировать файл:

* 1004 — идентификатор группы (может быть любым числом).

Добавление sftp пользователя в bitrixenv

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

Добавляем в систему группу dev-group.

# groupadd dev-group

Настроим chroot для всех пользователей этой группы, чтобы они не могли выйти за пределы каталога с сайтами при подключении к исходникам по sftp. Для этого редактируем файл /etc/ssh/sshd_config. Комментируем существующий параметр и добавляем новые.

#Subsystem	sftp	/usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group dev-group
ChrootDirectory /home/dev-group/

Для применения настроек перезапускаем sshd.

# systemctl restart sshd

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

# adduser devbitrix01 -g600 -o -u600 -s /sbin/nologin -d /home/dev-group/

Если пользователю нужен будет доступ к консоли по ssh, то вместо /sbin/nologin укажите /bin/bash. Устанавливаем пароль для пользователя:

# passwd devbitrix01

Теперь для того, чтобы заработал chroot по sftp, выставляем необходимые права доступа на домашний каталог пользователя:

# chown root:bitrix /home/dev-group/
# chmod 750 /home/dev-group/

Уже сейчас вы можете подключиться по sftp пользователем и проверить доступ. Удивитесь, когда обнаружите, что пользователь может перемещаться по всем директориям сервера.

Подключение по sftp к bitrix

Все правильно, я еще не добавил его в группу dev-group, для которой назначен chroot. Делаем это.

# usermod -aG dev-group devbitrix01

Отключитесь и подключитесь заново. Пользователь будет сразу попадать в свой домашний каталог, выхода из которого у него теперь нет. Дальше нам осталось добавить в этот каталог исходники сайта.

Configure SFTP chroot jail

To configure SFTP chroot jail we will modify /etc/ssh/sshd_config

[root@server2 ~]# vim /etc/ssh/sshd_config

#Comment sftp-server SubSystem and use internal-sftp
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    


Match 
        ChrootDirectory /opt/sftp-jails/deepak    <-- Our sftp chroot jail directory
        X11Forwarding no
        AllowTcpForwarding no
        PermitTunnel no
        AllowAgentForwarding no
        ForceCommand internal-sftp
			Introduces a conditional block.  If all of the criteria on the Match line are satisfied, the keywords on the following lines 
			override those set in the global section of the config file, until either another Match line or the end of the file. If a 
			keyword appears in multiple Match blocks that are satisfied, only the first instance of the keyword is applied.
		
	The ChrootDirectory must contain the necessary files and directories to support the user's session. For an interactive session 
			this requires at least a shell, typically sh, and basic /dev nodes such as null, zero, stdin, stdout, stderr, and tty devices. 
			For file transfer sessions using SFTP no additional configuration of the environment is necessary if the in-process sftp-server
			is used, though sessions which use logging may require /dev/log inside the chroot directory on some operating systems.
					
		This allows/denies the X11 forwarding. If set to yes, it can expose X11 to attacks; so this option must be taken with care. 
			Defaults to no. We prevent the forwarding to X11: there is no need for it and it can expose the system.
					
	This allow/denies TCP forwarding and can take as argument yes, all, no, or local and remote. The first two options allow the
			forwarding, the third denies it, and the local allows local forwarding only; remote enables remote forwarding only. There is 
			no shell or TCP forwarding for our example.
					
		Specifying a command of internal-sftp will force the use of an in-process SFTP server that requires no support files when 
			used with ChrootDirectory.

	Defines whether ssh-agent forwarding is allowed or not. Defaults to yes to increase the security, and since it is not really 
			needed for an sftp account, so we are going to disable it.
						
	        This allows/denies the tunnel device forwarding. It takes yes, point-to-point , Ethernet, or no as arguments. Yes enables both 
			point-to-point and Ethernet forwarding. Defaults to no, and we want to be sure it is disabled since we do not need a tunnel for 
			an sftp account.					

		The command sftp-server implements the SFTP file transfer subsystem. 
			Alternately the name internal-sftp implements an in-process SFTP server. This may simplify configurations using ChrootDirectory 
			to force a different filesystem root on clients.

Выставление прав на каталог

При попытке подключиться по SFTP мы получим ошибку fatal: bad ownership or modes for chroot directory, так как необходимо выставить правильные права. Система требует, чтобы все каталоги пути имели права 755 и их владельцем был root.

В нашем примере мы выполняем следующие команды:

Права будут следующие:

Create SFTP Group (Optional)

[root@server2 ~]# groupadd sftpusers   
[root@server2 ~]# usermod --gid sftpusers deepak  

6 practical scenarios to use grep recursive with examples

Доступ к bitrix сайтам разным пользователям по sftp

Делается это с помощью mount —bind. Если у вас несколько сайтов, то имеет смысл для каждого сайта делать отдельный каталог и моунтить туда нужный сайт.

# mkdir /home/dev-group/site1.ru
# chown bitrix. /home/dev-group/site1.ru
# chmod 750 /home/dev-group/site1.ru
# mount --bind /home/bitrix/ext_www/site1.ru /home/dev-group/site1.ru

Подключитесь еще раз по sftp и попробуйте отредактировать или создать файл в каталоге с сайтом. Его владельцем будет пользователь bitrix, что нам и нужно для корректной работы с сайтом.

При необходимости, можете добавить монтирование каталога с сайтом в автозагрузку, чтобы не пришлось это делать еще раз после перезагрузки сервера. Для этого в /etc/fstab добавьте в самый конец строку.

/home/bitrix/ext_www/site1.ru /home/dev-group/site1.ru none bind 0 0

Обязательно убедитесь, что файл fstab оканчивается переходом на новую строку. Это важно. Перезагрузите сервер, чтобы убедиться в том, что все корректно настроили.

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

# adduser devbitrix02 -g600 -o -u600 -s /sbin/nologin -d /home/dev-group/
# passwd devbitrix02
# usermod -aG dev-group devbitrix02

В том случае, когда список сайтов для разных пользователей будет разный, добавляйте новую группу в другую домашнюю директорию и биндите туда другой набор сайтов. Если же вам изначально нет необходимости управлять группами, то в настройках sshd вместо:

Match Group dev-group
Match User devbitrix01

и так для каждого отдельного пользователя.

Небольшое замечание по работе mount с ключом bind. Тут надо быть аккуратным. Если у вас сложная конфигурация сервера и в какой-то момент вы отмонтируете диск с сайтами, откуда стоят линки на домашние директории пользователей, там эти точки монтирования останутся, как и доступ к файлам. Так что прежде чем что-то делать с разделом, где лежат сайты, отмонтируйте все каталоги, которые биндили пользователям. Посмотреть их можно командой mount без ключей.

# mount

mount bind

На этом у меня все по настройке sftp пользователей для bitrix. Надеюсь, эта информация будет для вас полезна. Мне она периодически нужна, поэтому решил оформить в статью, чтобы самому потом было проще вспоминать последовательность действий.

Если у вас есть желание научиться администрировать системы на базе Linux, но вы с ними никогда не работали и не знакомы, то рекомендую начать с онлайн-курса «Linux для начинающих» в OTUS. Курс для новичков, для тех, кто с Linux не знаком. Цена за курс минимальная (символическая). Информация о курсе и цене.

Workaround 1

root@server:~ # usermod -d /username username

caveate 1

Ошибка ssh bad ownership or modes for chroot directory

Можно пробовать подключаться через sftp клиент. Я в данном случае предпочитаю пользоваться бесплатным WinSCP. Скорее всего вы не подключитесь и получите ошибку в лог файле /var/log/secure:

Apr 11 14:53:20 web sshd[5026]: Accepted password for sftpuser from 75.37.234.139 port 40923 ssh2
Apr 11 14:53:20 web sshd[5026]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0)
Apr 11 14:53:20 web sshd[5028]: fatal: bad ownership or modes for chroot directory "/var/www/site.ru"
Apr 11 14:53:20 web sshd[5026]: pam_unix(sshd:session): session closed for user sftpuser

Ошибка возникает, если владелец необходимой папки не root и права доступа на запись есть у кого-то еще, кроме владельца. Такой вот нюанс. В этом есть некоторое неудобство, но в данном случае лично мне это не помешало. Делаем владельцем каталога /var/www/site.ru рута, у остальных убираем права на запись в него. Дальше в этом каталоге две папки — одна с логами веб сервера для виртуального хоста, другая с исходниками сайта. На эти папки может быть любой владелец и права доступа. Так что подключившийся пользователь сможет без проблем работать с исходниками сайта.

Why we use internal-sftp instead of sftp-server for ChrootDirectory?

Collected from: OpenSSH: Difference between internal-sftp and sftp-server

  • Both sftp-server and internal-sftp are part of OpenSSH. sftp-server is a standalone binary.
  • internal-sftp is just a configuration keyword that tells sshd to use SFTP server code built-into sshd, instead of running another process (typically the sftp-server).
  • sftp-server is now redundant and is kept for a backward compatibility.
  • The main advantage of internal-sftp is, that it requires no support files when used with ChrootDirectory directive.
  • Administrator may rely on a login shell configuration to prevent certain users from logging in.
  • Switching to the internal-sftp would bypass the restriction, as the login shell is no longer involved.
  • Using sftp-server binary (being a standalone process) you can use some hacks, like running the SFTP under sudo.
  • For SSH-1 (if anyone is still using it), Subsystem directive is not involved at all.
  • An SFTP client using SSH-1 tells the server explicitly, what binary the server should run. So legacy SSH-1 SFTP clients have sftp-server name hard-coded.
Читайте также:  Раскройте возможности Python с помощью бесплатного хостинга: быстро, безопасно и экономично

Next restart sshd service to activate sftp chroot jail configuration.

[root@server2 ~]# systemctl restart sshd

Добавляем пользователя ssh в chroot директорию

Для начала создадим нового системного пользователя без шелла. Вообще, это не обязательно делать, можно настроить в ssh подключение не системных пользователей. Но я не вижу проблемы с системным пользователем. В моем случае для одного пользователя нет смысла заморачиваться с какими-то дополнительными настройками. Добавляем пользователя:

# useradd -s /sbin/nologin sftpuser

Дальше редактируем конфиг ssh. Открываем /etc/ssh/sshd_config. Комментируем существующую строку и добавляем следом за ней еще несколько:

# mcedit /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /var/www/site.ru
ForceCommand internal-sftp

Сохраняем и перезапускаем ssh. В случае с centos 6 команда такая:

# service sshd restart

Настройка подключения sftp с ограничением доступа за пределами конкретной папки закончена.

Workaround 2

This is an alternative to the previous one that we ended up using:

root@server:~ # ln -s . /home/home

caveates 2

  1. You can’t have user named ‘home’ with a home directory /home/home
  2. You have to be careful with scripts that traverse /home hierarchy and follow symlinks.

Lshell как альтернатива chroot ssh

По сути, это более простой способ настроить окружение chroot для пользователя UNIX систем.

Его развертывание сводится к установке:

yum install lshell

apt-get install lshell

И смене шела для пользователя:

Остальная настройка выполняется в файле /etc/lshell.conf.

Install sftp on Linux

On most Linux distributions sftp should be installed by default. On RHEL/CentOS 7 and 8 Linux you can use yum or dnf to install sftp which is provided as part of openssh-clients rpm in RHEL/CentOS distro.

Based on distribution sftp may part of a different rpm, please check your distribution to install sftp

[root@server1 ~]# which sftp
/usr/bin/sftp

Настройка SSH

Открываем конфигурационный файл openssh:

Комментируем следующую строку:

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

Добавляем следующее (обязательно в самый конец файла).

Для определенного пользователя:

Для группы пользователей:

Subsystem sftp internal-sftp -f AUTH -l VERBOSE
Match group sftpgroup
  ChrootDirectory /home/%u
  ForceCommand internal-sftp
  AllowTcpForwarding no

После перезапускаем службу:

* команда рассчитана на запуск в разных версиях Linux (CentOS / Ubuntu / Red Hat / Debian и так далее, а также на базе systemd или ранних версий), так как служба может называться ssh или sshd.

SFTP chroot multiple directories

Match User deepak
   ChrootDirectory /opt/sftp-jails/deepak
   AllowTCPForwarding no
   X11Forwarding no
   ForceCommand internal-sftp


Match User amit
   ChrootDirectory /opt/sftp-jails/amit
   AllowTCPForwarding no
   X11Forwarding no
   ForceCommand internal-sftp


Match Group sftpusers
   ChrootDirectory /opt/sftp-jails/sftpusers
   AllowTCPForwarding no
   X11Forwarding no
   ForceCommand internal-sftp

Setup SSH client for passwordless sftp

[amit@server1 ~]$ ssh deepak@10.10.10.13
deepak@10.10.10.13's password:  <-- Prompting for password even when passwordless sftp is configured

As you see the sftp communication is prompting for password and passwordless sftp authorized_keys is not working.

Solution 1: Perform passowrdless sftp with private key

You must define the private key you want to use for performing sftp communication to perform passwordless sftp. For example:

[root@server1 ~]# mkdir /tmp/sftp_keys
[root@server1 ~]# chmod 755 /tmp/sftp_keys/
[root@server1 ~]# cp .ssh/id_rsa /tmp/sftp_keys/
[root@server1 ~]# chmod 644 /tmp/sftp_keys/id_rsa

Next attempt to perform passwordless sftp to server2

[root@server1 ~]# su - amit
[amit@server1 ~]$ sftp -i /tmp/sftp_keys/id_rsa deepak@10.10.10.13
. <-- Passwordless sftp is working using sftp authorized_keys from sshd_config 
 exit

Solution 2: Create ssh config file for individual user

You can check the permissions and ownership I have assigned for all the files and directories under amit's home folder:

[amit@server1 ~]$ tree -paug .
.
├── [-rw------- amit     amit    ]  .bash_history
├── [-rw-r--r-- amit     amit    ]  .bash_logout
├── [-rw-r--r-- amit     amit    ]  .bash_profile
├── [-rw-r--r-- amit     amit    ]  .bashrc

│   ├── [-rw------- amit     amit    ]  id_rsa
│   └── [-rw-r--r-- amit     amit    ]  known_hosts
└── [-rw------- amit     amit    ]  .viminfo

1 directory, 8 files

Below is the content of /home/amit/.ssh/config, which you can modify based on your requirement to perform passwordless sftp. I have copied the private key inside /home/amit/.ssh which we created earlier.

[amit@server1 ~]$ cat .ssh/config
Host 
AddressFamily inet
ConnectionAttempts 10
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
GatewayPorts no
HostBasedAuthentication no
HostKeyAlias sftp-alias
HostName 
IdentityFile 
PasswordAuthentication no
Protocol 2
Compression yes
ServerAliveCountMax 3
ServerAliveInterval 15
TCPKeepAlive no
User 

Next verify the passwordless sftp communication

[amit@server1 ~]$ sftp server2
Connected to server2. <-- Passwordless sftp is working using sftp authorized_keys from sshd_config 
 exit

Linux Boot Process Explained Step by Step in Detail

Setup passwordless sftp authorized_keys

Step 6.1: Create sftp authorized_keys file

On server2 create sftp authorized_keys file which will store the public key content from server1. Here I have created a hidden folder .ssh inside which I will create authorized_keys file

[root@server2 ~]# cd /opt/sftp-jails/deepak

Create a hidden directory .ssh where we will store our sftp authorized_keys file

[root@server2 deepak]# mkdir .ssh
[root@server2 deepak]# chown deepak:root .ssh
[root@server2 deepak]# chmod 700 .ssh

[root@server2 deepak]# ls -al
total 16
drwxr-xr-x 4 root   root 4096 Mar 30 19:20 .
drwxr-xr-x 3 root   root 4096 Mar 30 18:29 ..
drwxr-x--- 3 deepak root 4096 Mar 30 19:08 exchange
 2  4096 Mar 30 19:20 .ssh

Create sftp authorized_keys file

[root@server2 deepak]# touch .ssh/authorized_keys

Change ownership and permission of this file

[root@server2 ~]# chown deepak:root .ssh/authorized_keys
[root@server2 ~]# chmod 600 .ssh/authorized_keys

Verify the permissions:

[root@server2 .ssh]# ls -al
total 12
drwxr-xr-x 2 deepak root 4096 Mar 30 19:20 .
drwxr-xr-x 4 root   root 4096 Mar 30 19:20 ..
 1 deepak root  410 Mar 30 19:17 authorized_keys

Remove Directory in Linux PROPERLY & SAFELY

Step 6.2: Generate SSH key pair to setup passwordless sftp

[root@server1 ~]# ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key ():
Your identification has been saved in .
Your public key has been saved in .
The key fingerprint is:
SHA256:waurDGhB1PvXepoJKcTADzia1qDZilHvC1BV+UnZnic root@server1.example.com
The key's randomart image is:
+---[RSA 2048]----+
| .. .... o       |
|+  o  ..o .      |
|o*o .  ooo .     |
|+BBo    ooE .    |
|Bo.=o   S  o     |
|o=o. ..o .       |
|+.o..oo .        |
|.  +...oo.       |
|    +..+o        |
+----[SHA256]-----+

Copy the content of your public key id_rsa.pub to server2 and place it in /opt/sftp-jails/deepak/exchange/.ssh/authorized_keys which we created under Create sftp authorized_keys file. Below as you see I have appended my id_rsa.pub content to /opt/sftp-jails/deepak/exchange/.ssh/authorized_keys

[root@server1 ~]# 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7qO/cXiw8UZtgGIoCiVWF24CW3hdIQ4w1hA6L+cHts1Sg6ecJRFXZJmrv23TSmD9Xrw4HHAxECJJKAk1zSWzBYykvqNM6xpvbg8pnIRSLyA06Erf+FdyfFjpDXorJ+eE309H9fJH4ke1aXBvF5LddA1N+1yDjuAllekjL/6kL7e58D4+E6gJa2wGs8OdQM7YFEgPbQJPBn03WQLHR3O59S+zURvrHSmUTVPJ7VWVdJ6nrcMlraOMc0yshTK4QWkmsBEa3+fhEBk0qFxJBhI0Fn775omaquhD3RzKyySXn9vgw3bb36k99KzD3F/w5hoK4sehDnEZs9lTYz8I8FUeV root@server1.example.com

[root@server2 ~]# 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7qO/cXiw8UZtgGIoCiVWF24CW3hdIQ4w1hA6L+cHts1Sg6ecJRFXZJmrv23TSmD9Xrw4HHAxECJJKAk1zSWzBYykvqNM6xpvbg8pnIRSLyA06Erf+FdyfFjpDXorJ+eE309H9fJH4ke1aXBvF5LddA1N+1yDjuAllekjL/6kL7e58D4+E6gJa2wGs8OdQM7YFEgPbQJPBn03WQLHR3O59S+zURvrHSmUTVPJ7VWVdJ6nrcMlraOMc0yshTK4QWkmsBEa3+fhEBk0qFxJBhI0Fn775omaquhD3RzKyySXn9vgw3bb36k99KzD3F/w5hoK4sehDnEZs9lTYz8I8FUeV root@server1.example.com

Step 6.3: Setup sftp chroot jail with authorized_keys

In your existing sftp chroot jail configuration of sshd_config, we will add one more line as highlighted with the location of sftp authorized_keys

[root@server2 ~]# cat /etc/ssh/sshd_config

Match user deepak
        ChrootDirectory /opt/sftp-jails/deepak/
        
        X11Forwarding no
        AllowTcpForwarding no
        PermitTunnel no
        AllowAgentForwarding no
        ForceCommand internal-sftp

Restart sshd service to activate the sftp authorized_keys changes

[root@server2 ~]# systemctl restart sshd

Below is a tree structure of our sftp chroot jail directory with all the permissions:

[root@server2 ~]# tree -paug /opt/
/opt/
└── [drwxr-xr-x root     root    ]  sftp-jails
    └── [drwxr-xr-x root     root    ]  deepak
        ├── [drwxr-x--- deepak   root    ]  exchange
        │   └── [drwx------ deepak   deepak  ]  deepak_dir


5 directories, 1 file

Step 6.4: Verify SFTP connectivity and permissions

Perform sftp connection from server1 to server2.

[root@server1 ~]# sftp  deepak@10.10.10.13
Connected to deepak@10.10.10.13.  <-- There was no password prompt and the connection was established 
 exit

So our passwordless sftp authorized_keys configuration is successful and is working as expected.

Заключение

На смену ftp приходит sftp. Я давно пользуюсь этим для доступа к отдельным файлам на сервере. Но есть большой минус — скорость по sftp низкая. Когда приходится качать что-то объемное, начинаешь грустить. Это нужно учитывать. Для работы с исходниками сайтов существующей скорости вполне достаточно. Для передачи объемных файлов нужно искать другие варианты подключения, тот же ftp, либо через vpn cifs или nfs.

Еще плюс такого решения — можно настроить авторизацию по сертификату. Получается удобно и безопасно. Легко подключиться по 22-м порту, плюс пароли не нужны, авторизуешься автоматически сертификатом. Настроить это не сложно, в интернете масса инструкций на тему авторизации по ssh с помощью сертификатов.

Если у вас есть желание научиться администрировать системы на базе Linux, но вы с ними никогда не работали и не знакомы, то рекомендую начать с онлайн-курса «Linux для начинающих» в OTUS. Курс для новичков, для тех, кто с Linux не знаком. Цена за курс минимальная (символическая). Информация о курсе и цене.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Проверка и решение проблем

Проверить настройку можно с помощью любого sftp-клиента, например Filezilla или WinSCP.

При возникновении проблем, стоит просмотреть лог

tail -f -n20 /var/log/auth.log

tail -f -n20 /var/log/secure

* первая команда подходит для систем на базе RPM, вторая — Debian.

Оцените статью
Хостинги