Вопрос или проблема
Я уже использую оболочку для ограничения SSH пользователей только некоторыми командами, особенно для borg serve
в целях резервного копирования.
Теперь я хотел добавить возможность использовать SFTP в chroot каталоге. Как я уже прочитал на Stack Overflow, я не могу использовать директиву Subsystem sftp internal-sftp
в конфигурации sshd, потому что команда internal-sftp не распознается вне sshd (в оболочке).
Поэтому я попробовал использовать другую подсистему /usr/lib/openssh/sftp-server
и добавил это как случай в мою оболочку следующим образом:
case "$SSH_ORIGINAL_COMMAND" in
"/usr/lib/openssh/sftp-server")
/usr/lib/openssh/sftp-server -d / -l VERBOSE
Это сработало мгновенно, без каких-либо ошибок. Но chroot отсутствует. Поэтому я подготовил каталоги chroot с необходимыми правами и монтированием в /etc, /bin, /lib, /lib64 и /usr.
Это не сработало. Прежде чем я, возможно, что-то испортил с окружением chroot, я решил протестировать это, используя chroot в /
.
Выполнение этой команды вручную не вызывает ошибок, но также не дает вывода:
/usr/sbin/chroot / /usr/lib/openssh/sftp-server -d / -l VERBOSE
Я также изменил строку в оболочке на /usr/sbin/chroot / /usr/lib/openssh/sftp-server -d / -l VERBOSE
, но соединение SFTP не работает.
На клиентской стороне я сразу получаю
Connection closed
Connection closed.
и никаких дополнительных логов.
Я не знаю, что попробовать дальше, чтобы это заработало…
Ответ или решение
Для того чтобы создать chroot окружение для sftp-server с использованием обертки (wrapper script), вам необходимо выполнить несколько шагов и убедиться, что вся структура chroot окружения правильно настроена. Вот пошаговая инструкция, как это сделать:
-
Настройка chroot среды:
Убедитесь, что у вас есть корректное chroot окружение с необходимыми директориями и файлами. Стандартное место, где хранятся скомпилированные бинарные файлы и библиотеки для sftp-server, включает:bin/
— для бинарных файлов (например,bash
,mkdir
, и т.д.).lib/
иlib64/
— для библиотек, необходимых для работы бинарных файлов.etc/
— для конфигурационных файлов.dev/
— для устройств, если это необходимо.
Например:
mkdir -p /path/to/chroot/{bin,etc,lib,lib64,usr/{bin,lib,lib64}} cp /usr/lib/openssh/sftp-server /path/to/chroot/usr/lib/openssh/ cp /bin/bash /path/to/chroot/bin/ # если необходимо cp -r /lib/x86_64-linux-gnu/* /path/to/chroot/lib/ # копируйте необходимые библиотеки cp -r /lib64/* /path/to/chroot/lib64/
-
Проверка прав доступа:
Убедитесь, что директория chroot и все её родительские директории имеют правильные права доступа. Пользователь, который будет использовать chroot, должен иметь права доступа только на директорию chroot.chown root:root /path/to/chroot chmod 755 /path/to/chroot
-
Изменение обертки (wrapper script):
Измените ваш wrapper script так, чтобы он использовал командуchroot
. Пример:case "$SSH_ORIGINAL_COMMAND" in "/usr/lib/openssh/sftp-server") exec /usr/sbin/chroot /path/to/chroot /usr/lib/openssh/sftp-server -d / -l VERBOSE ;; *) # Обработка других команд ;; esac
Обратите внимание, что функция
exec
заменяет текущий процесс на новый, что предотвращает возможные проблемы с управлением PID. -
Проверка логов:
Если после изменений оно все еще не работает, просмотрите логи SSH:tail -f /var/log/auth.log
Это может дать информацию о том, что именно идет не так при попытке подключения.
-
Тестирование:
Попробуйте подключиться к серверу SFTP и посмотрите, работает ли ваш новый chroot подход. Убедитесь, что клиент использует правильный адрес и порт, и что у вас есть правильные учетные данные. -
Обработка ошибок:
Если вы все еще сталкиваетесь с проблемами после выполнения этих шагов, попробуйте выключить SELinux или AppArmor (если они включены), чтобы исключить проблемы с безопасностью.
Эти шаги должны помочь вам правильно настроить chroot окружение для sftp-server. Если у вас есть специфические ошибки или дополнительные проблемы, сообщите об этом, и мы сможем рассмотреть их более детально.