Нормальная схема такая:

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

9. Проверка через FileZilla