Я установил простой SFTP-сервер в Ubuntu 18.04. У меня 10 пользователей, которые должны иметь доступ только к файлам в своих домашних каталогах, и они не должны иметь возможность выйти из своего домашнего каталога.
У нас есть API, который записывает файлы в свои домашние каталоги.
Все идет нормально.
Пользователи могут входить в систему, получать файлы и ограничиваться своими собственными каталогами. Однако они не могут удалить файлы. Любая команда 'rm' возвращает ошибку разрешений - Не удалось удалить файл: в разрешении отказано.
Пользователь / группа для папки root: www-data. Если я изменю его на user: www-data SFTP сломается - они не смогут войти. Я создал группу sftp, но опять же, если я добавлю пользователя в группу sftp, измените домашний каталог на user: sftp, они не могут войти в систему.
Вот как выглядит домашняя папка:
drwxr-xr-x 2 root www-data 172032 Feb 6 14:19 29
drwxr-xr-x 2 root www-data 135168 Feb 6 14:17 52
drwxr-xr-x 4 root www-data 69632 Feb 6 14:15 44
drwxr-xr-x 2 root www-data 36864 Feb 6 14:14 68
Моя конфигурация sftp из / etc / ssh / sshdconfig:
Match group sftp
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Мои пользователи настроены так:
29:x:1002:1001::/home/26:/bin/sh
44:x:1003:1003::/home/44:/bin/sh
52:x:1004:1004::/home/52:/bin/sh
68:x:1005:1005::/home/29:/bin/sh
Моя группа sftp:
sftp:x:1001:26,44
Помимо проблема именования пользователей, который следует исправить, но, вероятно, не влияет на ваш вариант использования, ваша конфигурация должна удовлетворять двум несовместимым ограничениям:
ChrootDirectory Задает путь к каталогу, в который после аутентификации будет использоваться chroot (2). Все компоненты имени пути должны быть корневые каталоги которые не записывается любым другим пользователем или группой. После chroot sshd (8) меняет рабочий каталог на домашний каталог пользователя.
Поэтому вам нужно создать каталог внутри /home/user
, который будет принадлежать пользователю. Главный выбор - /home/user/home/user
которому sftp пойдет после входа в систему.
Подводя итог, если у вас есть такие пользователи:
u29:x:1002:1001::/home/u26:/bin/sh
u44:x:1003:1003::/home/u44:/bin/sh
u52:x:1004:1004::/home/u52:/bin/sh
u68:x:1005:1005::/home/u29:/bin/sh
вам просто нужно создать несколько каталогов:
for user in u29 u44 u52 u68; do
home=/home/$user
# Create the chroots owned by root
mkdir -p $home
# Create the homes inside the chroots
mkdir -p $home$home
# Fix ownership
chgrp www-data -R $home
chown root -R $home
chown $user -R $home$home
# Fix directory permissions
find $home -type d -exec chmod 755 {} +
find $home$home -type d -exec chmod 2770 {} +
done
В Setgid в домах пользователей может быть полезно для ваших скриптов (которые запускаются как www-data
Я предполагаю). Вы также можете подумать о настройке umask
для sftp:
ForceCommand internal-sftp -u 0002
PS: Не могу понять, почему многие настаивают на том, чтобы административно запретить пользователям доступ к домашним каталогам друг друга. Разрешение на звук по умолчанию для домашнего каталога (например, 700
) и umask (077
) должно быть достаточно. Те, кто знает, что делают, могут изменить свои разрешения.