Debian.pro/

Про Debian


sshfs/sftp chroot

Несколько месяцев я задавался вопросом — как организовать chroot для sftp на сервере. И долгое время не мог этого сделать — приходилось обходиться средствами FTP-демонов. В одном из последних релизов openssh-server эта возможность появилась, с чем я поздравляю всех хостеров (да и просто администраторов). В то время, пока Red Hat’овцы всё ещё мучаются с jail — мы пойдём настраивать chroot встроенными средствами ssh-демона.

Для начала определимся для чего нужен SFTP. Сам sftp призван заменить архаичный scp — старое средство передачи файлов по ssh. Преимущества вполне очевидны — файлы передаются по зашифрованному туннелю, пароль из сети перехватить невозможно. Но тут же всплывают и минусы — увеличенная нагрузка на CPU (и на сервере, и на клиенте), медленная скорость передачи файлов по сравнению с FTP. Но в целом — sshfs достаточно давно используется и зарекомендовала себя как отличная замена FTP-демонам.

Из плюсов так же стоит отметить простоту конфигурации — любой пользователь в системе, который может зайти на сервер по ssh, уже может зайти по sftp на сервер. С другой стороны это было и минусом — любой пользователь по sftp мог скачать любые файлы, к которым у него есть доступ. Но сейчас мы это будем исправлять.

Если sshd ещё не установим — поставим его:

aptitude install openssh-server

Текущий openssh в Debian 5 уже поддерживает весь необходимый нам функционал.

По умолчанию у всех пользователей есть домашние каталоги /home/$USER. Но, к сожалению, openssh chroot() требует, чтобы каталог, в который мы будем собственно загонять пользователей, принадлежал пользователю root. С одной стороны вы можете отдать корректные права на /home руту, а домашним каталогам раздать права 770. С другой стороны, если вы используете sftp именно для файлообмена, можно передать все домашние каталоги пользователей root’у, а в каждом домашнем каталоге уже создать каталог, в который пользователь будет иметь полный доступ.

Второй способ позволяет пренебрегать ошибками в конфигурировании прав на каталоги, поэтому воспользуемся им.

Для примера возьмём пользователя inky. Он уже создан в системе и вы можете зайти этим пользователем по ssh.

Создаём нужные каталоги:

mkdir -p /home/inky/data

И назначаем корректные права доступа:

chown -R root:root /home/inky && chmod -R 700 /home/inky && chown -R inky:inky /home/inky/data && chmod -R 770 /home/inky/data

Некоторые скажут, что такие права ужасны и их ни в коем случае нельзя использовать, но в нашем случае они обеспечивают необходимую степень безопасности. К тому же мы всё уже проверили.

Если существует необходимость запускать что-либо в дальнейшем от пользователя — вы можете изменить ему домашний каталог, например, на /home/inky/data. Сделать это можно в файле /etc/passwd

Теперь приступим к настройке самого sshd.

Открываем наш любимый текстовый редактор и дописываем туда следующее:

Subsystem sftp /usr/lib/openssh/sftp-server
Match user inky
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no

Если у вас была какая-либо другая строка Subsystem sftp — закомментируйте её.

Теперь немного пояснений:

Match user inky — последующие опции будут применены для пользователя inky

ChrootDirectory /home/%u — зайдя по фтп пользователь попадёт в каталог /home/inky. %u — подставляет имя пользователя в имя каталога. Можно также использовать %h — домашний каталог пользователя и %g — имя группы авторизации пользователя.

ForceCommand internal-sftp — запрещаем пользователю входить на сервер по ssh. При попытке ввести любой символ после авторизации по ssh — сервер откажет пользователю в соединении. Тем не менее, все возможности sftp будут работать корректно.

AllowTcpForwarding no — запрещаем пользователю использовать возможности туннелинга, пробрасывания портов и подобное. Так же сейчас мы выключили ему возможность использовать «Instant socks proxy over SHH» — я раскажу в одной из следующих статей что это такое.

После этого перезагружаем sshd:
/etc/init.d/sshd restart

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

Теперь проверим работу sftp. Самый простой способ — в адресную строку наутилуса вводим приблизительно следующее:

sftp://user@host:port

Наутилус спросит пароль, вводим его и попадаем в указанный в sshd каталог.

Из командной строки мы можем попасть на sftp сервер вполне ожидаемой командой:
sftp user@host -p XX

XX заменяем на необходимый номер порта, снова попадаем на сервер в указанный нами каталог.

Также для доступа к SFTP серверам можно использовать FileZilla — её преимущество в том, что мы сможем заливать (и скачивать файлы) в несколько потоков, увеличивая тем самым скорость (но и нагрузку на CPU).

sftp chroot правила можно также применять и к определенным группам пользователей, но об этом я расскажу в следующей статье, под названием «sftp chroot vs. ispmanager»


Комментарии (10):

  1. ждём статьи «sftp chroot vs. ispmanager», т.к. мы тоже эту панельку используем. Спасибо.

  2. 4rt8mi5 :

    a aka potom sdelat chtob vse novye faily i papki byli 770?

  3. man umask или вроде того.

  4. seobmen :

    Приветствую! В Wheezy не работает ваш способ, кидает в корневую папку /
    А далее в /home не пускает…

  5. Конфиги показывайте.

  6. seobmen :

    Ссылка для скачивания файла: http://rusfolder.com/35847974 — конфиг sshd — там взял просто конфиг по умолчанию и добавил ваши строки.

    На папке /home = 40755 roor:root
    Папка созданного юзера alex — 40700 root:root
    В ней папка data — 40770 alex:alex

    Сейчас по sftp:

    Получение списка каталогов…
    Команда: pwd
    Ответ: Current directory is: «/»
    Команда: ls
    Статус: Listing directory /
    Ошибка: Unable to open .: permission denied

  7. seobmen :

    В командной строке на самом сервере та же ошибка, если подключаться по sftp
    Почему-то он смотрит папку /

    И, кстати, правильно команда

    sftp -P XX user@host (большая P и перед юзером)

    Так, как указано у вас в посте, выдает ошибку тоже.

  8. seobmen :

    Нужно ли создавать такое?
    /home/username/home/username
    Или мы работаем с реальными папками (в моем примере — реальные папки)? Такое впечатление, что проблема именно с правами на папки…

  9. Брррр…
    ls -la /home
    ls -la /home/username
    Показывайте.

    И на hastebin.com какой-нибудь, а не файлообменники.

    > (большая P и перед юзером)
    Вот там как раз всё верно.

    И хомяк смените пользователю, что ли.

    sshd_config вроде правильный.

  10. seobmen :

    Сменил юзеру папку на /opt/alex — в ней папка data

    Итого такие изменения.

    1. В sshd_config указал:

    ChrootDirectory /opt/%u

    2. ls -la /opt

    total 16
    drwxr-xr-x 4 root root 4096 Apr 5 20:47 .
    drwxr-xr-x 22 root root 4096 Mar 30 14:57 ..
    drwx—— 3 root root 4096 Apr 7 13:15 alex
    lrwxrwxrwx 1 root root 18 Mar 30 17:29 iredapd -> /opt/iRedAPD-1.4.0
    drwx—— 5 iredapd iredapd 4096 Mar 30 17:37 iRedAPD-1.4.0

    3. ls -la /opt/alex

    total 12
    drwx—— 3 root root 4096 Apr 7 13:15 .
    drwxr-xr-x 4 root root 4096 Apr 5 20:47 ..
    drwxrwx— 2 alex alex 4096 Apr 5 20:47 data

    4. При подключении:

    Статус: Получение списка каталогов…
    Команда: pwd
    Ответ: Current directory is: «/»
    Команда: ls
    Статус: Listing directory /
    Ошибка: Unable to open .: permission denied
    Ошибка: Превышено время ожидания соединения
    Ошибка: Не могу получить список каталогов!

Написать комментарий