Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> sftp+chroot

Использование sftp+chroot из openssh в качестве альтернативы ftp-серверу.

Автор: Storoge.


   SFTP расшифровывается как SSH File Transfer ProtocolSSH-протокол для передачи файлов. Он предназначен для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Как правило, в качестве базового протокола, обеспечивающего соединение, и используется протокол SSH2, но это не обязательно.OpenSSH (открытый безопасный shell) — набор программ, предоставляющих шифрование сеансов связи по компьютерным сетям с использованием протокола SSH.
   Он был создан под руководством Teo de Raadt (Тэо де Раадт) как открытая альтернатива проприетарного ПО от SSH Communications Security. В набор программ OpenSSH входит и sftp-сервер.Недавно в дерево исходных текстов OpenSSH принят код,позволяющий помещать отдельных пользователей в изолированное окружение(chroot).
   Собственно, я сам для копирования данных на сервер пользуюсь sftp, меня это вполне устраивает.Возникла необходимость дать возможность нескольким пользователям заливать на сервер контент для своих сайтов.Ставить ради этого какой-нибудь PureFTPd я не хотел, но использование в чистом виде sftp мне не нравилось тем, что они могут залогиниться под ssh, а также тем, что в клиенте (например Filezilla) видна вся файловая система сервера.То есть я хотел, чтобы пользователи могли зайти только по sftp и видеть и изменять только свою папку.
# cd /usr/ports/
# make search name='openssh'
Port:   openssh-portable-5.0.p1,1
Path:   /usr/ports/security/openssh-portable
Info:   The portable version of OpenBSD's OpenSSH
Maint:  mnag@FreeBSD.org
B-deps:
R-deps:
WWW:    http://www.openssh.org/portable.html

Port:   security/openssh
Moved:
Date:   2008-03-02
Reason: Has expired: Outdate and has security issues

   Нашли то, что нам надо, идем туда, компилируем с такими опциями и устанавливаем.
# cd ./security/openssh-portable
# make install clean
[X] PAM             Enable pam(3) support                     
[X] TCP_WRAPPERS    Enable tcp_wrappers support               
[X] LIBEDIT         Enable readline support to sftp(1)
[X] KERBEROS        Enable kerberos (autodetection)            
[ ] SUID_SSH        Enable suid SSH (Recommended off)    
[ ] GSSAPI          Enable GSSAPI support (req: KERBEROS)  
[ ] KERB_GSSAPI     Enable Kerberos/GSSAPI patch (req: GSSAPI)
[X] OPENSSH_CHROOT  Enable CHROOT support                      
[ ] OPENSC          Enable OpenSC smartcard support            
[ ] OPENSCPINPATCH  Enable OpenSC PIN patch                   
[ ] HPN             Enable HPN-SSH patch                      
[ ] LPK             Enable LDAP Public Key (LPK) patch         
[ ] OVERWRITE_BASE  OpenSSH overwrite base      

   Не забудьте прописать в /etc/rc.conf
openssh_enable="YES"
#sshd_enable="YES"

   Далее редактируем файлы настроек
[color=red]# cd /usr/local/etc/ssh
# ls
moduli                  ssh_config-dist         
ssh_host_dsa_key.pub    ssh_host_key.pub        
ssh_host_rsa_key.pub    sshd_config-dist
ssh_config              ssh_host_dsa_key        
ssh_host_key            ssh_host_rsa_key        
sshd_config

   Открываем файл sshd_config и добавляем куда-нибудь в конец следующие строки.
AllowGroups wheel sftponly

# override default of no subsystems
Subsystem       sftp    /usr/local/libexec/sftp-server

Match group sftponly
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTcpForwarding no
        X11Forwarding no

   Ну, в wheel вхожу я, ничем не ограниченный, а в группу sftponly входят наши пользователи.

   Создадим будущему пользователю домашний каталог, куда он и будет кидать свои файлы
# mkdir /usr/local/www/example

   А внутри этого каталога еще один
# mkdir /usr/local/www/example/www

   Теперь надо правильно добавить пользователя через adduser. Надо включить его в группу sftponly, дать реальную оболочку(например sh),указать правильный домашний каталог(мы его уже создали), ну естественно, пароль.Вернемся  к нашим баранам(т.е. домашним каталогам пользователей),зададим правильные права.
# chown -R root /usr/local/www/example
# chown -R our_user /usr/local/www/example/www 

   Все, теперь перезапускаем openssh
#/usr/local/etc/rc.d/openssh restart

   И пробуем залогинится под нашим пользователем с какой-нибудь машины. Сам я пользуюсь Filezilla, честно говоря, другие клиенты не смотрел.Виден только домашний каталог, а записать пользователь может только в папку www, что и требовалось сделать.
Зайти под ssh этот пользователь не сможет.

Ссылки
1.http://www.openssh.com/-страница проекта OpenSSH
2.http://ru.wikipedia.org/wiki/OpenSSH - страница OpenSSH  в Википедии
3.http://xgu.ru/wiki/Sftp -Информация о протоколе sftp
4.http://www.opennet.ru/opennews/art.shtml?num=14331 - Ссылка на новость о chroot в OpenSSH из Opennet
5.http://blogs.techrepublic.com.com/opensource/?p=229
6.http://www.debian-administration.org/articles/590



размещено: 2008-12-27,
последнее обновление: 2008-12-27,
автор: Storoge


Dan, 2008-12-27 в 11:54:55

# mkdir /usr/loca/www/example

опечатка в тексте в этой строке

XoRe, 2008-12-28 в 1:17:56

Раз уж решили использовать openssh+chroot, то можно предоставлять и шелл при необходимости.
Определить список доступных команд, и вперед.
И корневой директорией будет папка пользователя.
Ну а статей о том, как сделать chroot'ный шелл юзеру с помощью того-же патча openssh, в инете навалом.
Например тут:
http://www.opennet.ru/search.shtml?exclude=index|%2Fman.shtml&words=ssh+chroot

Alexander Sheiko, 2008-12-28 в 1:40:08


Как альтернатива - давно использую такой вариант:

http://www.mozilla.org.ua/projects/faq/chroot.sftp.openssh/

vorakl, 2009-02-20 в 2:09:51

У меня заработало только после установки

Subsystem sftp internal-sftp
вместо
Subsystem       sftp    /usr/local/libexec/sftp-server

И ещё особое внимание стоит обратить на то, что
все каталоги выше от домашенего и сам домашний, должны быть с владельцем root. Записывать sftp пользователь
сможет толкьо в каталоги "ниже", в которые у него должно быть право записи.

k-unker, 2009-06-23 в 17:50:59

Работает только если

Subsystem       sftp    internal-sftp

Права на каталоги должны быть root (домашний каталог пользователя и каталоги выше по иерархии перед ним)

prOFForg, 2010-06-07 в 21:10:11

необходимость выставлять на пути к chroot директории владельца root может подпортить нормально выставленные права на веб папки(чтобы php скрипты работали в правами пользователя в его директории и не могли лазить в соседнии и т.д.)

симлинки sftp в chroot не обрабатывет, поэтому можно сделать так:
mount_nullfs /hosting/web/localhost/www/ /hosting/sftp/localhost/www/

В итоге юзер localhost chrootится в /hosting/sftp/localhost и видит там папку www, при заходе в которую попадает в каталог веб-сервера /hosting/web/localhost/www


ara, 2011-12-01 в 14:47:31

как сделать общую папку для всех пользователей.
через линк не получается.

ara, 2011-12-02 в 9:03:27

второй вопрос..
как быть с логированием пользователей..


im, 2011-12-02 в 16:03:33

Для логирования можно перепилить вот так:
Subsystem       sftp    /usr/libexec/sftp-server -l INFO
Лог будет писаться в /var/log/auth.log.

Но есть один момент: для юзеров попадающих в "ForceCommand internal-sftp" лог не работает, ибо это internal-sftp, и он  логировать не способен.

ara, 2012-02-01 в 13:25:31

в rc.conf syslogd_flags=\" -s -l /Exchange/user1/dev/log\"
то логирование для user1 попадающих в \"ForceCommand internal-sftp\" работает, но у меня несколько useroв;
у каждого  своя директория. Как запустить несколько копии syslogd c разными флагами если это возможно или  
есть какой нибудь другой метод.

спасибо.

MVS, 2020-09-11 в 17:28:03

Возможно ли все параметры созданных пользователей вынести в отдельный файл, а в sshd_config оставить лишь ссылку?



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0395 секунд
Из них PHP: 28%; SQL: 72%; Число SQL-запросов: 77 шт.
Исходный размер: 29692; Сжатая: 7895