понедельник, 1 августа 2011 г.

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

Потребовалось создать безопасный файлообменник.
Требования:
1. Безопасность.
2. Простота использования
3. Возможность использовать на различных ОС

Всем этим критериям больше всего удовлетворяет sftp.

SFTP расшифровывается как SSH File Transfer Protocol — SSH-протокол для передачи файлов. Он предназначен для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Как правило, в качестве базового протокола, обеспечивающего соединение, и используется протокол SSH2, но это не обязательно.
OpenSSH (открытый безопасный shell) — набор программ, предоставляющих шифрование сеансов связи по компьютерным сетям с использованием протокола SSH.
  Он был создан под руководством Teo de Raadt (Тэо де Раадт) как открытая альтернатива проприетарного ПО от SSH Communications Security. В набор программ OpenSSH входит и sftp-сервер. Также была добавлена возможность помещать отдельных пользователей в изолированное окружение(chroot).



Установка на FreeBSD:
# cd /usr/ports/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"
Переходим в католок с настроечными файлами
# cd /usr/local/etc/ssh
Открываем файл sshd_config и добавляем куда-нибудь в конец следующие строки.Убедиться, что в конфиге они не повторяются!!! В группу wheel входят пользователи без ограниченный, а в группу sftponly входят наши пользователи. Можно также выставить права и на конкретных пользователей (  Match User XXX) 
Subsystem       sftp    internal-sftp
## выставляем настройки для группы
Match group sftponly
#### выставляем настройки для пользователя
#Match User newusr
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTcpForwarding no
        X11Forwarding no

Создадим будущему пользователю домашний каталог, куда он и будет кидать свои файлы
# mkdir /usr/sftp
# mkdir /usr/sftp/newusr
Добавляем группу:
# chown -R root /usr/sftp
# pw groupadd sftponly
Теперь надо правильно добавить пользователя через adduser.
Надо включить его в группу sftponly, дать реальную оболочку(например sh),указать правильный домашний каталог(мы его уже создали /usr/sftp), ну естественно, пароль.
# adduser
Username: newusr
Full name:
Uid (Leave empty for default):
Login group [newusr]: sftponly
Login group is sftponly. Invite ssadminsftp into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash rbash nologin) [sh]: sh
Home directory [/home/newusr]: /usr/sftp
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : newusr
Password   : *****
Full Name  :
Uid        : 1006
Class      :
Groups     : sftponly
Home       : /usr/sftp
Home Mode  :
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (newusr) to the user database.
Add another user? (yes/no):no
Goodbye!
Права на каталоги должны быть root (домашний каталог пользователя и каталоги выше по иерархии перед ним). Права на папку 75x(rwxrwx---).
# chown -R root /usr/sftp
# chown -R newusr /usr/sftp/newusr 
Останавливаем базовый демон и стартуем новый.
 Примечание: на FreeBSD при остановке демона sshd не происходит дисконект, т.е. тукущие сессии остаются активными и Вы можете спокойно запустить новый демон. Проверенно, т.к. настраивал удаленно.
#/etc/rc.d/sshd stop
#/usr/local/etc/rc.d/openssh restart
И пробуем залогинится под нашим пользователем с какой-нибудь машины.
Я например использую WinSCP в Windows.
Кроме подсоединения он также может и синхронизировать файлы.
Для более "тонкой" настройки синхронизации рекомендую AllwaySync'n'Go

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

4 комментария:

  1. Привет,

    А что можете посоветовать если нужно раздавать контент с помощью HTTP(S), так чтобы каждый пользовател имел возможность создавать в своём домашнем каталоге, подкаталоги для других пользователей, поролить некоторые каталоги? + конечно лимитирование места. Идея состоит в том, чтобы дать возможность работнику компании создавать для своих клиентов аккаунты, чтобы они в свою очередь могли, чтото закачать или скачать, ну и конечно не смогли выйти за пределы их каталога.

    Так как имеем дело с конечным пользователем, то нужен дружелюбный веб интрефейс. Можете сталкивались с чем-то готовым?

    Спасибо.

    ОтветитьУдалить
  2. Интересная задачка...
    Пару уточняющих вопросов:
    - Уровень конечных пользователей? Как много их и как часто они меняются?
    - Требуемый уровень безопасности.

    задача не самая тривиальная. Основная загвозда -удобство для конечного пользователя...
    Готовых решений не встречал.Из того что первое приходит в голову - связка pureftpd + Mysql + PureUserAdmin (webfrontend) + apache.
    Пользователи смогут забирать файлы как по шифрованному ftp, так и по https. Закачка только через ftp (можно с шифрованием). Как вариант можно каждому пользователю создать Private и Public. private доступ будет иметь только сам пользователь. В Public создавать папки для клиентов. Каждый пользователь запер в своем катологе. Т.е. будет иметь доступ только к своим клиентам. Клиенты в свою очередь тоже "заперты" в своем катологе.
    Используя симлинки можно добиться некоторой гибкости схемы. Возможно понадобится написание некоторых дополнительных скриптов...

    ОтветитьУдалить
  3. Спасибо большое - эта идея давно уже крутилась в голове, не интересовался возможностью реализации.
    После этого можно забыть вообще о фтп.
    Но возникает проблемма с правами - ведь создаётся отдельный юзер со своим UID, а если хочется менять скажем php файлы то права должны быть www-data, т.к это всё дело работает под (nginx+php-fpm).
    Иначе: хочется чтоб был chroot в папку пользователя, но UID пользователя был как у www-data.
    (Интересует под линукс, но думаю разницы не должно быть большой)
    PS. У вас слетела подсветка bash

    ОтветитьУдалить
  4. У меня такой задачи не было...
    Из того что приходит в голову:
    1. Дать пользователю www-data shell и соответственно писать из под него. ПРоблем быть не должно. Но такой вариант по безопасности в корне не правилен! Особенно если заливают несколько человек...
    2. Скорее всего Вам нужно смотреть в сторону ftp серверов, которые умеют работать с sftp (pureftp, proftpd и т.д.)
    P.S. спасибо за замечание!!!

    ОтветитьУдалить