Тематические термины: SSH, Linux
По умолчанию, при подключении по SFTP пользователь имеет возможность спускаться по дереву каталогов и видеть структуру папок. А при наличии прав, редактировать и удалять файлы. Доступ можно ограничить, создав специальное окружение для определенной папки и всех ее подпапок.
Настройка sshd
Пользователи и группы
Права на папки
Тестирование и логи
Lshell
We’ve found a workaround recently that goes like this:
- /etc/ssh/sshd_config:
- directory permissions:
- Введение
- User account setup
- Home directory setup
- SSH configuration
- Введение
- Create SFTP User
- SFTP restrict user to specific directory (with password authentication)
- Step 5.1: Create sftp chroot jail directories
- Step 5.2: Assign permissions on chroot jail directories
- Step 5.3: Verify SSH and SFTP connectivity and permissions
- Step 5.4: Assign SFTP umask (Optional but Important)
- How to fix packet_write_wait: Connection to X.X.X.X port 22: Broken pipe?
- Создание пользователя и группы
- Создание пользователя
- Создание группы
- Добавление sftp пользователя в bitrixenv
- Configure SFTP chroot jail
- Выставление прав на каталог
- Create SFTP Group (Optional)
- Доступ к bitrix сайтам разным пользователям по sftp
- Workaround 1
- caveate 1
- Ошибка ssh bad ownership or modes for chroot directory
- Why we use internal-sftp instead of sftp-server for ChrootDirectory?
- Добавляем пользователя ssh в chroot директорию
- Workaround 2
- caveates 2
- Lshell как альтернатива chroot ssh
- Install sftp on Linux
- Настройка SSH
- SFTP chroot multiple directories
- Setup SSH client for passwordless sftp
- Solution 1: Perform passowrdless sftp with private key
- Solution 2: Create ssh config file for individual user
- Setup passwordless sftp authorized_keys
- Step 6.1: Create sftp authorized_keys file
- Step 6.2: Generate SSH key pair to setup passwordless sftp
- Step 6.3: Setup sftp chroot jail with authorized_keys
- Step 6.4: Verify SFTP connectivity and permissions
- Заключение
- Помогла статья? Подписывайся на telegram канал автора
- Проверка и решение проблем
/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
answered Aug 21, 2017 at 23:54
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
- 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 сервер, благо совсем недавно написал обширную статью на эту тему.
Очень быстро его настроил, проверил изнутри — все отлично работает. Создал системного пользователя, зачрутил его в каталог с нужным виртуальным хостом, расставил права как надо. Дальше дело за малым. Надо пробросить порт на шлюзе для доступа к серверу.
Тут началось самое интересное. Я давно не работал с 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
Создание пользователя и группы
Если в системе еще нет группы или пользователя, для которого мы настроили 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 пользователем и проверить доступ. Удивитесь, когда обнаружите, что пользователь может перемещаться по всем директориям сервера.
Все правильно, я еще не добавил его в группу 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
На этом у меня все по настройке 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
andinternal-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 thesftp-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 withChrootDirectory
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.
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
- You can’t have user named ‘home’ with a home directory
/home/home
- 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.