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

спасибо.



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.2438 секунд
Из них PHP: 40%; SQL: 60%; Число SQL-запросов: 77 шт.
Исходный размер: 24012; Сжатая: 7148