SSH FTP (SFTP) instead/вместо FTP

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

    Вам, Уважаемое хабрасообщество, да будет известно, что FTP передаёт данные в не шифрованном виде. И нам, параноикам мира сего, немного сцыкотно страшно за сервер наш и данные на нём хранящиеся.

    По этому решил полностью отказаться от FTP в пользу SFTP. Я использую Ubuntu Server, и по умолчанию установленный в нём OpenSSH, также мне известно, что он поддерживает SFTP из коробки, поэтому задача казалась мне крайне простой и я быстро приступил к воплощению её в жизнь. С той же скоростью, с которой выполнялась задача, я столкнулся с досадным фактом того, что OpenSSH по умолчанию даёт пользователю доступ ко всей файловой системе, то есть к / — корню.

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

    Тут я подробно расскажу как тюнинговать OpenSSH сервер в Ubuntu Linux для того что бы chroot-нуть пользователя в необходимом нам каталоге.

    Почему я говорю тюниговать?

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

    sudo aptitude install openssh-server

    Что приведёт к установке и запуску сервера, а также откроет, по умолчанию, 22 порт. Осуществив соединение на который, при помощи, например Filezilla, можно получить доступ к файловой системе удалённого компьютера/сервера по ШИФРОВАННОМУ протоколу.

    Но как я уже намекнул, настройки «по умолчанию» нас не устраивают.

    Поэтому открываем файл настройки OpenSSH сервера sudo mcedit1 /etc/ssh/sshd_config и кое-что там изменяем/добавляем.

    Находим опцию Subsystem и придаём ей следующий вид:

    Subsystem sftp internal-sftp

    Плюс добавляем следующие опции:

    Match User test
    ChrootDirectory %h
    ForceCommand internal-sftp


    Теперь перезапускаем OpenSSH sudo service ssh restart и вроде бы готово.
    Game Over?

    NO!

    Как Вы наверное уже догадались, право входа в систему по протоколу SFTP будут иметь пользователи которые имеют системные2 учётные записи. Поэтому необходимо создать учётную запись, под которой будут осуществляться манипуляции с файлами. Поскольку выше было написано Match User test создавать необходимо учётную запись пользователя test.

    adduser test
    Создается пользователь, задаётся пароль, домашний каталог по умолчанию — /home/test ...

    Теперь можно попробовать соединиться с сервером, и передать файлы. Предварительно заходим в логи, что бы наблюдать за процессом…
    tail -f /var/log/auth.log
    timestamp host sshd[2558]: Accepted password for test from IP_адрес port 59667 ssh2
    timestamp host sshd[2558]: pam_unix(sshd:session): session opened for user test by (uid=0)
    timestamp host sshd[2596]: fatal: bad ownership or modes for chroot directory "/home/test"
    timestamp host sshd[2558]: pam_unix(sshd:session): session closed for user test

    Как видите, в логах написано:
    — сессия открыта для пользователя test используя UID=0, то есть идентификатор пользователя root
    — неправильные права собственности для того, что бы chroot-нуться в /home/test

    Всё дело в том, что для каталога /home/test необходимо назначить владельцем пользователя root, что мы и делаем:
    sudo chown root /home/test

    Подключается и наблюдаем в логах:
    timestamp host sshd[2630]: Accepted password for test from IP_адрес port 50152 ssh2
    timestamp host sshd[2630]: pam_unix(sshd:session): session opened for user test by (uid=0)
    timestamp host sshd[2669]: subsystem request for sftp

    Mission complete


    Подробности


    В настройках OpenSSH мы описывали опцию Match User test, что само собой означает доступ отдельного, конкретного пользователя!

    — А если таковых много?

    Описание каждого пользователя — как минимум не кошерно… Короче, я хочу рассказать про то, что можно задействовать группы пользователей используя Match Group.

    И тогда конфиг может выглядеть приблизительно так:

    Match Group sites
    ChrootDirectory /srv/www%h
    ForceCommand internal-sftp

    А учётные записи пользователей в /etc/passwd так:
    <output omitted>
    site1:x:5000:10003::/example.com/:/bin/false
    site2:x:5001:1000::/example.org/:/bin/false
    site3:x:5002:1000::/example.net/:/bin/false
    <output omitted>

    Как видно из примера, у пользователей относительный домашний каталог, то есть в корне / нет каталогов /example.com/ и т.д.
    Эти каталоги есть в /srv/www/ и OpenSSH должен отработать следующим образом:
    — Домашний каталог пользователя, из /etc/passwd добавить к /srv/www и в итоге получить /srv/www/example.com и т.д.

    Не забываем, что владельцем каталога в который будут chroot-иться пользователи должен быть root. Группой владельцев, необходимо поставить sites и разрешить полный доступ.
    Также рекомендуется в качестве shell-а пользователя ставить /bin/false, что бы предотвратить доступ пользователя к командной строке.

    Пояснения:
    1 - mcedit - Мой любимый текстовый редактор.
    2 - системные учётные записи - читать как: Созданные в системе пользователи.
    3 - 1000 - всего лишь пример идентификатора группы sites.


    Mission Complete & Game Over
    Поделиться публикацией

    Комментарии 18

      0
      Очень хороший пост, спасибо. Можно я дополню: для ограничения пользователя до scp, sftp, rdist, rsync, cvs можно воспользоватся rssh. Им заменяется /bin/false в конфигурации, а сам доступ управляется параметрами allowscp, allowsftp, allowcvs, allowrdist, allowrsync в /etc/rssh.conf
        0
        Пост хороший!
        Я тоже мечтаю отказаться от FTP, но вот беда — SFTP неудобен виндовым пользователям :( FTP работает прям из проводника, а вот с SFTP засада. Что бы вы посоветовали обычным пользователям. Обычным — это значит ленивым, которым неохота разбираться со всякими путтями :-) Есть в винде какие-нибудь хорошие штатные или околоштатные средства?
          0
          WinSCP
          Filezilla — кстати я её упомянул в статье.
          Всё OpenSource.
            0
            +1 за WinSCP

            на своих серверах и VDS вообще вырубил FTP, чтобы трояны не записывали всякую фигню (были случаи)

            сам WinSCP напоминает Total Commander, так что все должно быть привычно ;-)
              0
              Это всё хорошо, но нашему дизайнеру очень хотелось получить доступ к удалённым файлам из фотошопа…
              Я перерыл всё, что можно было накопать по этой теме и ничего реально удобного не нашёл, к сожалению. Что-то глючило, что-то вообще не работало, что-то тормозило безбожно, в что-то плюс ко всему ещё и денег стоило… Плохо всё на этом поприще.
              Ещё пробовал NFS… Но там сразу образовались траблы с кодировками, которые было не решить — винда упорно не хотела понимать utf-8.
                0
                Побуду чуток некрофилом, но статья хорошо заиндекстирована, так что если вдруг кому понадобится для этого есть www.netdrive.net/ — позволяет SFTP держать как обычный диск.
              0
              Far Manager еще
              вот только вопрос — давно ли вы видели ленивых виндовых пользователей, который из проводника лезут куда-то на FTP?
                0
                FastSCP как вариант
                0
                Для FTP есть FTPS — FTP с использованием TLS.
                  0
                  Есть, но наверное проще чуть чуть поковырять OpenSSH, чем устанавливать дополнительное ПО.

                  А вообще, я забыл упомянуть в статье, что теперь, когда я отказался от FTP у меня стало на 2 порта меньше (20,21) — куда перестали ломиться боты.
                  — Вы, конечно, можете сказать — Что боты ломяться на 22, но на хабре уже были статьи как защитить 22 порт.

                  Вот: Защищаем SSH от брутфорса на любом порту
                  0
                  хотел спросить по теме. недавно прикупил себе впс. установил убунту на него. обновился. поставил ссх апач и прочее, поставил свой именной сайт и т.п.
                  вопрос в том что когда через зенд коннектишься по ссх, то папки очень долго открываются, ощущение что каждый раз авторизация занова происходит
                    0
                    Думаю, что можно попробовать в /etc/ssh/sshd_config найти/прописать опцию UseDNS no (по умолчанию yes)
                      0
                      /etc/ssh/sshd_config line 80: Directive 'UseDNS' is not allowed within a Match block
                        0
                        Вы допустили ошибку, поднимите UseDNS no выше блока Match.

                        Subsystem sftp /usr/lib/openssh/sftp-server
                        UsePAM yes
                        UseDNS no <---Выше блока Match
                        Match user root
                    0
                    Что-то менять владельца home-папки на root как-то не очень комильфо, как же ему потом разрешить создавать там папки и т.п.? Если только под каждого юзера делать свою группу и права давать через запись в группу. Плюс ещё может какие проблемы потом вылезут…
                      0
                      Кстати, можно наверно указать папку /home как корневую, к файлам /etc/passwd и т.п. тогда не доберутся юзеры, а в home-папки других юзеров тоже не пролезут — прав нету. Единственный минус — увидят список юзеров на серваке по названиям папок в /home.
                      Ну и, теоретически, смогут выцепить какие-нибудь вкусные файлы других юзеров, которым те юзеры сгоряча проставят права чтения для other.
                      0
                      Автор не затронул тему с авторизацией по ключам, которая мало того, что позволит вообще не трогать конфиги sshd, но и даст возможность пользователям с разными ключами ходить под одним UIDом.
                      А для этого всего-то нужно добавить пользователю в файл /home/username/.ssh/authorized_keys такую строчку
                      command="/usr/libexec/sftp-server",no-port-forwarding ssh-rsa AAAA<здесь открытый ключ>== user@host
                        0
                        Тоже использую sftp, но по-умолчанию скорость по sftp мала, особенно для больших файлов. Например, когда качаешь со своего компьютера фильмы по локальной сети своего провайдера скорость неприлична низка.
                        Я меняю всегда алгоритм шифрования на blowfish-cbc как более быстрый.
                        Вообщем, рекомендую…

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

                        Самое читаемое