11.02.2026 15 мин чтения

SFTP-only доступ в BitrixEnv (CentOS): chroot без доступа “выше”

Как выдать подрядчику доступ “только по SFTP” к DOCUMENT_ROOT в Bitrix Environment?

Кирилл Новожилов

Кирилл Новожилов

Автор

SFTP-only доступ в BitrixEnv (CentOS): chroot без доступа “выше”

Иногда нужно выдать подрядчику доступ “только по SFTP” к сайту в Bitrix Environment так, чтобы:

  • не было SSH/shell
  • не было доступа вне /home/bitrix/www
  • при этом не ломать BitrixEnv (важный нюанс: /home/bitrix обычно не root:root)

Ниже — рабочая схема для CentOS (OpenSSH): internal-sftp + ChrootDirectory + bind-mount.

Подходит для всего семейства RHEL: CentOS / RHEL / Rocky Linux / AlmaLinux и т.д. (команды через dnf, конфиги OpenSSH одинаковые).

Цель

Сделать так, чтобы пользователь sftp_user при подключении попадал в /www и видел там содержимое /home/bitrix/www, но не мог выйти “выше” из-за chroot.

Создаём группу и пользователя без shell

        sudo groupadd -r sftp_only
sudo useradd -r -g sftp_only -s /sbin/nologin -M sftp_user
sudo passwd sftp_user

    

Готовим chroot в /var (root:root, 755)

        sudo mkdir -p /var/sftp-chroot/sftp_user/www
sudo chown -R root:root /var/sftp-chroot
sudo chmod 755 /var/sftp-chroot /var/sftp-chroot/sftp_user /var/sftp-chroot/sftp_user/www

    

Bind-mount: показываем /home/bitrix/www внутри chroot как /www

Одноразово:

        sudo mount --bind /home/bitrix/www /var/sftp-chroot/sftp_user/www

    

Постоянно через /etc/fstab:

        echo "/home/bitrix/www /var/sftp-chroot/sftp_user/www none bind 0 0" | sudo tee -a /etc/fstab
sudo mount -a

    

Проверка:

        mount | grep "sftp-chroot"

    
Важно mount-propagation (иначе можно “сломать” сайт) Bind-mount делает /var/sftp-chroot/sftp_user/www “представлением” реального /home/bitrix/www. Если вы начнёте делать дополнительные mount’ы (“маски”) внутри /var/sftp-chroot/sftp_user/www/..., то при стандартных настройках Linux/systemd они могут пропагироваться обратно и стать видимыми как mount’ы на /home/bitrix/www/.... Итог: вы “прячете папку только от SFTP”, а на деле она пропадает и для самого Bitrix.

Перед тем как настраивать “маски”, сделайте bind-mount приватным (делать нужно на mountpoint’е /var/sftp-chroot/sftp_user/www):

        sudo mount --make-rprivate /var/sftp-chroot/sftp_user/www

    

Настраиваем sshd: только internal-sftp + chroot

На CentOS (и в целом на RHEL-like системах) удобно класть отдельным файлом в /etc/ssh/sshd_config.d/.

        sudo tee /etc/ssh/sshd_config.d/90-sftp-only.conf >/dev/null <<'EOF'
Match Group sftp_only
    ChrootDirectory /var/sftp-chroot/%u
    ForceCommand internal-sftp -d /www
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no
    PermitTTY no
EOF

    

Применяем:

        sudo sshd -t
sudo systemctl reload sshd

    

Права на запись: “всё можно менять” через группу bitrix

Если вам нужно, чтобы SFTP-пользователь мог менять всё в /home/bitrix/www, самый практичный вариант — добавить его в группу bitrix и выдать группе права.

        sudo usermod -aG bitrix sftp_user
id sftp_user

    

Выставить группу и права на весь webroot:

        sudo chgrp -R bitrix /home/bitrix/www
sudo chmod -R g+rwX /home/bitrix/www

    

Чтобы новые директории наследовали группу:

        sudo find /home/bitrix/www -type d -exec chmod g+s {} \;

    

Чтобы новые файлы/папки гарантированно получали права для группы bitrix — default ACL:

        sudo setfacl -R -m g:bitrix:rwx /home/bitrix/www
sudo setfacl -R -d -m g:bitrix:rwx /home/bitrix/www

    

Скрываем/запрещаем папку bitrix (или любую другую) только для SFTP (маска через bind-mount)

internal-sftp не умеет “скрывать по имени”, но мы можем замаскировать каталоги только в chroot пользователя: подмонтировать “заглушку” поверх /www/bitrix.

⚠️ Делайте mount только в /var/sftp-chroot/... (chroot-путь), не в /home/bitrix/www/.... И убедитесь, что вы уже выполнили mount --make-rprivate /var/sftp-chroot/sftp_user/www из шага 3, иначе “маска” может всплыть на реальном webroot и сломать сайт.

        sudo mkdir -p /var/sftp-chroot/sftp_user/.masked_bitrix
sudo chown root:root /var/sftp-chroot/sftp_user/.masked_bitrix
sudo chmod 000 /var/sftp-chroot/sftp_user/.masked_bitrix

sudo mount --bind /var/sftp-chroot/sftp_user/.masked_bitrix /var/sftp-chroot/sftp_user/www/bitrix
echo "/var/sftp-chroot/sftp_user/.masked_bitrix /var/sftp-chroot/sftp_user/www/bitrix none bind 0 0" | sudo tee -a /etc/fstab

    

После этого SFTP пользователь будет получать Permission denied при попытке зайти в /www/bitrix, при этом реальный /home/bitrix/www/bitrix останется на месте с прежними доступами для остальных пользователей.

Проверка (маска должна быть видна только в /var/..., а не в /home/...):

        sudo findmnt /var/sftp-chroot/sftp_user/www/bitrix
sudo findmnt /home/bitrix/www/bitrix || true

    

Проверка

С клиентской машины:

        sftp sftp_user@SERVER

    

Ожидаемо:

  • логин проходит
  • стартовая директория — /www
  • выше /www выйти нельзя
  • по SSH shell не даётся:
        ssh sftp_user@SERVER

    

Если “Connection reset by peer” после ввода пароля

Смотрим лог sshd — там обычно прямой ответ:

        sudo journalctl -u sshd -n 200 --no-pager

    

Полезные проверки:

        sudo sshd -T -C user=sftp_user,host=localhost,addr=127.0.0.1 | egrep 'chrootdirectory|forcecommand'
sudo namei -l /var/sftp-chroot/sftp_user

    

Откат (быстро)

        sudo rm -f /etc/ssh/sshd_config.d/90-sftp-only.conf
sudo systemctl reload sshd

sudo sed -i '\|/home/bitrix/www /var/sftp-chroot/sftp_user/www none bind 0 0|d' /etc/fstab || true
sudo sed -i '\|/var/sftp-chroot/sftp_user/.masked_bitrix /var/sftp-chroot/sftp_user/www/bitrix none bind 0 0|d' /etc/fstab || true

sudo umount /var/sftp-chroot/sftp_user/www/bitrix 2>/dev/null || true
sudo umount /var/sftp-chroot/sftp_user/www 2>/dev/null || true

sudo userdel sftp_user 2>/dev/null || true
sudo groupdel sftp_only 2>/dev/null || true
sudo rm -rf /var/sftp-chroot

    

Если вы случайно замаскировали каталоги на реальном пути (/home/bitrix/www/...), их тоже нужно размонтировать:

        sudo umount /home/bitrix/www/bitrix 2>/dev/null || true
sudo umount /home/bitrix/www/.git 2>/dev/null || true

    

Про “два одинаковых mount’а”

Если вы несколько раз выполняли mount --bind ... и/или mount -a, можно получить “слои” (в findmnt один и тот же TARGET показывается дважды). Почти всегда причина — дубли строк в /etc/fstab или повторное выполнение bind-mount без umount. Проверьте /etc/fstab на дубли и размонтируйте до “чистого” состояния, затем смонтируйте один раз через mount -a.

Почему нельзя chroot’ить в /home/bitrix/...

OpenSSH для ChrootDirectory проверяет каждый компонент пути chroot. Все каталоги по пути должны быть:

  • владельцем root:root
  • не writable (обычно 755)

В BitrixEnv каталог /home/bitrix почти всегда не соответствует этому требованию, поэтому при попытке зайти по SFTP получаем:

fatal: bad ownership or modes for chroot directory component "/home/bitrix/".

Решение chroot держим в “root-owned” месте (например /var/sftp-chroot/...), а внутрь chroot подмонтируем /home/bitrix/www.
Заключение

Схема internal-sftp + ChrootDirectory + bind-mount позволяет выдать SFTP-only доступ к сайту в BitrixEnv так, чтобы пользователь:

  • попадал сразу в /www (то есть в /home/bitrix/www внутри chroot),
  • не мог выйти выше webroot,
  • не получал shell по SSH.

Мини-чеклист после настройки:

  • sshd -t проходит, systemctl reload sshd без ошибок
  • sftp sftp_user@SERVER открывает /www, cd / выше не даёт
  • ssh sftp_user@SERVER не даёт shell
  • bind-mount присутствует после ребута (запись в /etc/fstab, mount -a без ошибок)

Если доступ выдаётся подрядчику, имеет смысл дополнительно:

  • отключить пароль и использовать ключи (PasswordAuthentication no для конкретного Match, если подходит под вашу политику),
  • ограничить вход по IP (Match Address ...) или через firewall,
  • выдавать права на запись максимально точечно (не “на всё”, если нет необходимости).
Опубликовано 3 дня назад
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.