Это руководство предоставляет пошаговые инструкции по настройке доступа SFTP для конкретного пользователя (ftpuser), ограниченного конкретной папкой (например, /var/www/mobile_proxy/tmp/test_folder/) на Rocky Linux. Оно включает конфигурацию SSH chroot jail, разрешения и диагностику распространенных проблем.
Мне понадобилось, когда внутри корпоративной сети на сервере с приложениями потребовалось предоставить ограниченный доступ сотруднику в конкретную папку (изначально просили FTP!) для загрузки туда файла apk.
Предварительные требования
- Установленный Rocky Linux с SSH-сервером (
openssh-server). - Доступ root или sudo.
- Целевая папка существует (например,
/var/www/mobile_proxy/tmp/test_folder/).
Шаг 1: Создание пользователя SFTP
Создайте выделенного пользователя для доступа SFTP без разрешения входа в оболочку для безопасности.
Что такое "Создание пользователя без оболочки"?
Это означает создание учетной записи пользователя, которая не может войти в полную оболочку (командную строку) на сервере. Установив оболочку на /sbin/nologin, пользователь может использовать только SFTP для передачи файлов, не выполнять команды или взаимодействовать с системой. Это повышает безопасность, ограничивая возможности пользователя.
# Создание пользователя без оболочки
sudo useradd -m -s /sbin/nologin ftpuser
# Установка пароля
sudo passwd ftpuser
Шаг 2: Настройка SSH для SFTP Chroot
Отредактируйте /etc/ssh/sshd_config, чтобы включить SFTP chroot для пользователя.
Что такое SFTP Chroot и зачем он нужен?
SFTP Chroot (Change Root) — это функция безопасности, которая ограничивает пользователя конкретным каталогом (jail) при входе, предотвращая доступ к остальной файловой системе. Он нужен для безопасности: без chroot пользователь мог бы перемещаться в чувствительные области, такие как /etc или /home. Для SFTP это гарантирует, что пользователь может только загружать/скачивать файлы в своей назначенной папке, снижая риски от скомпрометированных учетных данных.
# Резервная копия конфига
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# Редактирование конфига SSH
sudo nano /etc/ssh/sshd_config
Добавьте или измените следующие строки:
# Разрешить только конкретных пользователей (добавить ftpuser)
# AllowUsers: Ограничивает вход SSH только перечисленными пользователями для безопасности. Без этого любой пользователь с паролем может подключиться.
# Замените 'another_user' на ваше имя администратора; 'ftpuser' — пользователь SFTP.
AllowUsers another_user ftpuser
# Подсистема SFTP
# Subsystem: Определяет, как обрабатывается SFTP. 'internal-sftp' использует встроенный SFTP-сервер SSH (безопасно, без внешних зависимостей).
# Альтернатива: Внешний sftp-server, но internal предпочтительнее для chroot.
Subsystem sftp internal-sftp
# Chroot для ftpuser
# Match User: Применяет следующие правила только к указанному пользователю (ftpuser).
# ChrootDirectory: Устанавливает корень chroot jail на /var/www/mobile_proxy/tmp/ (пользователь видит это как /).
# ForceCommand: Принуждает пользователя использовать только SFTP, без доступа к оболочке (мера безопасности).
# AllowTcpForwarding no: Отключает TCP-туннелирование (предотвращает эксплойты перенаправления портов).
# X11Forwarding no: Отключает перенаправление X11 GUI (не нужно для SFTP, уменьшает поверхность атаки).
Match User ftpuser
ChrootDirectory /var/www/mobile_proxy/tmp/
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Перезапускаем службу SSH:
sudo systemctl restart sshd
sudo systemctl status sshd
Шаг 3: Установка разрешений для каталога Chroot
Для работы chroot все родительские каталоги должны принадлежать root с ограниченными разрешениями (755). Только финальная папка может принадлежать пользователю.
Что такое каталог Chroot и почему только финальная папка может принадлежать пользователю?
ChrootDirectory — это корневой каталог, который пользователь видит после входа — все вне него скрыто. SSH требует, чтобы все родительские каталоги (до точки chroot) принадлежали root и имели разрешения 755 (читаемые/исполняемые всеми, записываемые только владельцем) по соображениям безопасности. Если любой родитель принадлежит другому пользователю или имеет более свободные разрешения, SSH отклоняет chroot, чтобы предотвратить повышение привилегий. Только финальная папка (где работает пользователь) может принадлежать пользователю, позволяя ему читать/писать файлы там.
# Проверить текущие разрешения
namei -l /var/www/mobile_proxy/tmp/test_folder/
# Исправить владение и разрешения
sudo chown root:root /var/www/
sudo chmod 755 /var/www/
sudo chown root:root /var/www/mobile_proxy/
sudo chmod 755 /var/www/mobile_proxy/
sudo chown root:root /var/www/mobile_proxy/tmp/
sudo chmod 755 /var/www/mobile_proxy/tmp/
# Финальная папка для пользователя
sudo chown ftpuser:ftpuser /var/www/mobile_proxy/tmp/test_folder/
sudo chmod 755 /var/www/mobile_proxy/tmp/test_folder/
Шаг 4: Тестирование подключения SFTP
Используйте SFTP-клиент (например, FileZilla, WinSCP) или командную строку:
# С другой машины
sftp ftpuser@your-server-ip
# Введите пароль
# Вы должны быть chroot'нуты в /var/www/mobile_proxy/tmp/ и видеть только test_folder/
Диагностика типичных проблем
1. Аутентификация отклонена ("Access denied")
- Причина: Пользователь не в AllowUsers или неправильный пароль.
- Проверка:
bash sudo grep -i "AllowUsers" /etc/ssh/sshd_config - Исправление: Добавьте пользователя в AllowUsers и перезапустите SSH.
bash sudo nano /etc/ssh/sshd_config # Добавить: AllowUsers youradmin ftpuser sudo systemctl restart sshd
2. Ошибка владения/режимов каталога Chroot
- Причина: Родительские каталоги не принадлежат root или разрешения слишком открыты.
- Проверка:
bash sudo journalctl -u sshd -f # Искать "bad ownership or modes" namei -l /var/www/mobile_proxy/tmp/ChZnak/ - Исправление: Убедитесь, что все родители — root:root 755, как в Шаге 3.
3. Подключение не удается или таймаут
- Причина: Файрвол, SSH не слушает или ошибка синтаксиса конфига.
- Проверка:
bash sudo systemctl status sshd sudo netstat -tlnp | grep :22 sudo sshd -t # Тест синтаксиса конфига - Исправление: Откройте порт 22 в файрволе (
sudo firewall-cmd --permanent --add-service=ssh; sudo firewall-cmd --reload).
4. Пользователь может получить доступ вне Chroot
- Причина: Неправильный ChrootDirectory или разрешения.
- Проверка:
bash sudo grep -A5 "Match User ftpuser" /etc/ssh/sshd_config - Исправление: Проверьте, что ChrootDirectory указывает на родителя папки пользователя.
5. Отказано в разрешении на операции с файлами
- Причина: Разрешения финальной папки или SELinux.
- Проверка:
bash ls -la /var/www/mobile_proxy/tmp/ChZnak/ sudo getenforce # Проверить SELinux - Исправление: Настройте разрешения или отключите SELinux при необходимости (
sudo setenforce 0для тестирования).
6. Логи для отладки
- Причина: Общая диагностика.
- Проверка:
bash sudo journalctl -u sshd -f - Исправление: Просмотрите логи на ошибки и примените исправления на основе сообщений.