Назад | Перейти на главную страницу

разрешения vsftpd для виртуальных пользователей с совместимостью с Apache SUexec

Я запускаю Linux-сервер с Apache + SUexec, где все папки virtualhosts htdocs принадлежат конкретным пользователям:

# ls /www/sites
drwxr-xr-x  4 vhost-sitea.com   vhost-sitea.com   4096 Oct 13 16:45 www.sitea.com/
drwxr-xr-x  3 vhost-siteb.com   vhost-siteb.com   4096 May 14 20:09 www.siteb.com/
drwxr-xr-x  5 vhost-sitec.com   vhost-citec.com   4096 Nov 22  2013 www.sitec.com
drwxr-xr-x  3 vhost-sited.com   vhost-sited.com   4096 Oct 25  2014 www.sited.com/

Я хочу, чтобы владельцы этих веб-сайтов могли подключаться через VSFTPD и управлять своими собственными папками. Для этого каждому виртуальному пользователю присваивается имя «user_a», «user_b» (...) в зависимости от его веб-сайта.

Моя конфигурация VSFTPD, основанная на пользователях Chroot и Virtual, следующая:

# cat /etc/vsftpd.conf
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/home/vsftpd/users/$USER  # Overridden by user_config_dir below
chroot_local_user=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/vsftpd_user_conf

и файл конфигурации пользователя (пример с user_a для веб-сайта www.sitea.com):

# cat /etc/vsftpd/vsftpd_user_conf/user_a
local_root=/www/sites/www.sitea.com
write_enable=YES

Теперь моя проблема заключается в том, что когда этот пользователь пытается загрузить файл, VSFTPD использует пользователя unix vsftpd, что не удается, потому что папка и подпапки www.sitea.com принадлежат конкретному пользователю vhost-sitea.com (согласно Конфигурация SUexec).

Вы должны понимать, что в SUexec пользователь Apache «www-data» вообще не используется в отношении прав на виртуальную папку www, поэтому я не могу просто использовать его в директиве «guest_username».

Есть ли способ указать пользователя демона VSFTP для каждого виртуального пользователя, который входит в систему, чтобы демон VSFTPd записывал файлы под пользователем «vhost-sitea.com», когда виртуальный пользователь «user_a» подключен к VSftp?

Спасибо за помощь, Кен.

Вам необходимо настроить виртуальную пользовательскую систему vsftpd, соединяющую каждого виртуального пользователя с другим системным пользователем, поэтому guest_username должны быть разными для каждого виртуального пользователя, а не уникальный.

Вы должны определить guest_username в файле конфигурации каждого виртуального пользователя, а не в основном файле конфигурации. Кроме его значение должно быть системным пользователем, которого вы используете в конфигурации suEXEC.для этого конкретного виртуального хоста.

Например, для виртуального пользователя virtual_user, подключенного к системному пользователю local_user, у которого есть виртуальный хост Apache в / www / sites / local_user, /etc/vsftpd.conf будет:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/www/sites/$USER
chroot_local_user=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf

/etc/vsftpd/vsftpd_user_conf/virtual_user будет содержать всего одну строку:

guest_username=local_user

Чтобы упростить настройку, я назвал папку, содержащую виртуальный хост Apache, файлом local_user. Таким образом, вы можете установить local_root только один раз в /etc/vsftpd.conf и удалить его из каждого файла конфигурации виртуального пользователя.

Что касается записей, отвечу самому себе: использование bindfs и принудительное использование владельца файла кажется интересным обходным путем, поскольку я получил следующее:

# bindfs -u vsftpd /www/sites/www.sitea.com/ /home/vsftpd/users/user_a/mnt-www.sitea.com/

Вот перма в каталоге для монтирования:

# ll /www/sites/www.sitea.com/
total 20
drwxr-xr-x  5 vhost-sitea.com   vhost-sitea.com 4096 Nov 10 20:42 ./
drwxr-xr-x 23 root              root        4096 Nov  8 20:37 ../
drwx------  2 vhost-sitea.com   vhost-sitea.com 4096 Nov  8 20:43 .cache/
drwxr-xr-x  5 vhost-sitea.com   vhost-sitea.com 4096 Nov 10 20:52 html/
drwxr-xr-x  2 vhost-sitea.com   vhost-sitea.com 4096 Nov 10 20:42 packages/

Теперь посмотрим завивки на смонтированной точке:

# ll /home/vsftpd/users/user_a/mnt-www.sitea.com/
total 20
drwxr-xr-x 5 vsftpd vhost-sitea.com 4096 Nov 10 20:42 ./
dr-xr-xr-x 3 root   root        4096 Nov 10 22:12 ../
drwx------ 2 vsftpd vhost-sitea.com 4096 Nov  8 20:43 .cache/
drwxr-xr-x 5 vsftpd vhost-sitea.com 4096 Nov 10 20:52 html/
drwxr-xr-x 2 vsftpd vhost-sitea.com 4096 Nov 10 20:42 packages/

Однако было бы интересно, если бы у кого-нибудь из вас было гораздо лучшее решение - скажем, менее «быстрое и грязное» :)

++