Нормальная схема такая:
1. Задаём переменные
Для примера пользователь будет den1.
USER_NAME="den1"
REAL_DIR="/var/www/binom/DEN1"
JAIL_DIR="/home/$USER_NAME"
MOUNT_DIR="$JAIL_DIR/DEN1"
2. Создаём пользователя без обычного shell
useradd -m -d "$JAIL_DIR" -s /usr/sbin/nologin "$USER_NAME"
passwd "$USER_NAME"
3. Добавляем пользователя в www-data
usermod -aG www-data "$USER_NAME"
4. Создаём реальную папку
mkdir -p "$REAL_DIR"
Лучший практический вариант — сделать пользователя владельцем папки, а группу оставить www-data:
chown -R "$USER_NAME":www-data "$REAL_DIR"
chmod -R u+rwX,g+rwX,o-rwx "$REAL_DIR"
chmod 2775 "$REAL_DIR"
Что это даёт:
den1 — может создавать, редактировать, удалять файлы
www-data — тоже имеет доступ для сайта/трекера
2775 — новые папки внутри наследуют группу www-data
5. Подготавливаем chroot-папку
Важный момент: папка, в которую делается ChrootDirectory, не должна быть writable для пользователя. Она должна принадлежать root.
chown root:root "$JAIL_DIR"
chmod 755 "$JAIL_DIR"
Создаём точку монтирования:
mkdir -p "$MOUNT_DIR"
chown root:root "$MOUNT_DIR"
chmod 755 "$MOUNT_DIR"
6. Связываем папки через bind mount
mount --bind "$REAL_DIR" "$MOUNT_DIR"
Проверяем:
mount | grep "$MOUNT_DIR"
ls -la "$MOUNT_DIR"
Теперь /home/den1/DEN1 — это фактически /var/www/binom/DEN1.
7. Делаем bind mount постоянным после перезагрузки
Открой /etc/fstab:
nano /etc/fstab
Добавь строку:
/var/www/binom/DEN1 /home/den1/DEN1 none bind 0 0
Проверь, что fstab не сломан:
mount -a
Если ошибок нет — всё нормально.
8. Настраиваем SFTP-изоляцию в SSH
Открой конфиг:
nano /etc/ssh/sshd_config
Внизу добавь:
Match User den1
ChrootDirectory /home/den1
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
Проверь конфиг:
sshd -t
Если ошибок нет:
systemctl reload ssh
systemctl reload sshd