Несколько месяцев я задавался вопросом — как организовать 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»
ждём статьи «sftp chroot vs. ispmanager», т.к. мы тоже эту панельку используем. Спасибо.
a aka potom sdelat chtob vse novye faily i papki byli 770?
man umask или вроде того.
Приветствую! В Wheezy не работает ваш способ, кидает в корневую папку /
А далее в /home не пускает…
Конфиги показывайте.
Ссылка для скачивания файла: 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
В командной строке на самом сервере та же ошибка, если подключаться по sftp
Почему-то он смотрит папку /
И, кстати, правильно команда
sftp -P XX user@host (большая P и перед юзером)
Так, как указано у вас в посте, выдает ошибку тоже.
Нужно ли создавать такое?
/home/username/home/username
Или мы работаем с реальными папками (в моем примере — реальные папки)? Такое впечатление, что проблема именно с правами на папки…
Брррр…
ls -la /home
ls -la /home/username
Показывайте.
И на hastebin.com какой-нибудь, а не файлообменники.
> (большая P и перед юзером)
Вот там как раз всё верно.
И хомяк смените пользователю, что ли.
sshd_config вроде правильный.
Сменил юзеру папку на /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
Ошибка: Превышено время ожидания соединения
Ошибка: Не могу получить список каталогов!