SFTP-only доступ в BitrixEnv (CentOS): chroot без доступа “выше”
Как выдать подрядчику доступ “только по SFTP” к DOCUMENT_ROOT в Bitrix Environment?
Кирилл Новожилов
Автор
Содержание
Иногда нужно выдать подрядчику доступ “только по 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"
/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/".
/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, - выдавать права на запись максимально точечно (не “на всё”, если нет необходимости).