Как настроить виртуальных пользователей для vsftpd с доступом к определенной подкаталоге?
Мне нужно иметь возможность добавить виртуальных пользователей в vsftpd, которые имеют доступ только к подпапке. Причина, по которой я хочу использовать виртуальных пользователей, заключается в том, что я хочу, чтобы на сервере был только один реальный пользователь.
Структура FTP:
www
website_name1
sub_folder1
website_name2
sub_folder2
sub_folder3
website_name3
website_name4
Основная учетная запись имеет доступ к папке www и всем подкаталогам, и я хочу добавить виртуального пользователя, который может иметь доступ к sub_folder1 и только sub_folder1
Также, чтобы избежать путаницы, я бы также потребовал, чтобы другой пользователь имел доступ к sub_folder3 и только к sub_folder3. Моя точка зрения заключается в том, что мне нужно иметь возможность выбирать, какие папки и подпапки для пользователя для каждого пользователя.
Я нашел способы добавления пользователей для просмотра целого Strucutre или настройки именованных папок, обе из которых мне не нужны.
Я нашел похожий вопрос, размещенный здесь:
Как настроить VSFTPD для нескольких пользователей, включая добавление определенных каталогов
но рекомендует proftpd
который я, хотя был в целом менее безопасным.
Или я здесь упустил смысл?
3 ответа
Немного поиграв, мне удалось придумать полу-решение (не идеальное, но достаточно хорошее)
используя ответ 2707974 и информацию, которую я получил в другом месте, где я смог получить то, что мне нужно.
Сначала вам нужно установить vsftp и PAM
apt-get install vsftpd libpam-pwdfile
Отредактируйте /etc/vsftpd.conf
nano /etc/vsftpd.conf
затем вставьте следующее
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
local_root=/var/www
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES
#virutal user settings
user_config_dir=/etc/vsftpd_user_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd
Редактируйте в соответствии с вашими потребностями. Самый важный бит для виртуальных пользователей - это все после комментария к настройкам виртуального пользователя
Создание пользователя
Вы можете использовать базу данных или htpasswd
я нашел htpasswd
быстрее и проще в использовании.
создать каталог для хранения ваших пользователей
mkdir /etc/vsftpd
htpasswd -cd /etc/vsftpd/ftpd.passwd user1
добавление дополнительных пользователей просто опустите -c
htpasswd -d /etc/vsftpd/ftpd.passwd user2
Мне только удалось заставить его работать, используя CRYPT, который ограничивает до 8 символов, чтобы использовать более 8 символов, используя openssl для генерации совместимого хэша и передачи напрямую в htpasswd
htpasswd -c -p -b /etc/vsftpd/ftpd.passwd user1 $(openssl passwd -1 -noverify password)
После того, как ваши пользователи созданы, вы можете изменить свой конфигурационный файл PAM.
nano /etc/pam.d/vsftpd
и удалите все внутри этого файла и замените следующим
auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
Это позволит войти в систему для ваших виртуальных пользователей, определенных в /etc/vsftpd/ftpd.passwd
и отключит локальных пользователей
Далее нам нужно добавить пользователя для использования этими виртуальными пользователями. Эти пользователи не будут иметь доступа к оболочке и будут называться vsftpd
useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
пользователь должен соответствовать guest_username=vsftpd
в файле конфигурации vsftpd
Определение доступа к каталогу
Важная строка здесь следующая
user_config_dir=/etc/vsftpd_user_conf
это означает, что когда user1
в логах он будет искать следующий файл
/etc/vsftpd_user_conf/user1
этот файл такой же, как vsftpd.conf
так что вы можете определить новый local_root
возвращаясь к вопросу, который мы хотим user1
иметь доступ только к var/www/website_name1/sub_folder1
так что нам нужно создать vsftpd_user_conf
папка:
mkdir /etc/vsftpd_user_conf
Теперь создайте файл пользователя:
nano /etc/vsftpd_user_conf/user1
и введите следующую строку
local_root=/var/www/website_name1/sub_folder1
Теперь перезапустите vsftp
service vsftpd restart
Теперь вы сможете войти в систему как user1, который сможет видеть только var/www/website_name1/sub_folder1
и любая папка и файл внутри него.
Теперь вы можете добавить столько пользователей, сколько захотите, и ограничить их доступ к любой папке.
важно помнить, что если вы не создадите файл conf пользователя, он по умолчанию будет находиться в папке var / www от имени пользователя root (в приведенном выше примере)
Если подпапка предназначена для изменения пользователем, может потребоваться изменить владельца общей подпапки:
chown vsftpd:nogroup /var/www/website_name1/sub_folder1
Попробуйте с этим руководством. Может быть, будет работать для вас.
Как это сделать
Установите vsftpd и библиотеку PAM
редактировать /etc/vsftpd.conf
а также /etc/pam.d/vsftpd
Создавайте учетные записи пользователей с помощью пользовательских каталогов (например, в /var/www/)
Установите каталоги с правильными chmod
а также chown
Создать администратора с полным доступом к серверу
- устанавливать
vsftpd
(Очень безопасный FTP Deamon) иlibpam-pwdfile
создавать виртуальных пользователей
Я хотел создать пользователей FTP, но не хотел добавлять локальных пользователей Unix (без доступа к оболочке, без домашнего каталога и т. Д.). PAM (Pluggable Authentication Modules) поможет вам создать виртуальных пользователей.
sudo apt-get install vsftpd libpam-pwdfile
- редактировать
vsftpd.conf
Сначала вам нужно сделать резервную копию исходного файла
sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak
Затем создайте новый
sudo vim /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=/var/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd
- Зарегистрировать виртуальных пользователей
Для регистрации пользователя вы используете htpasswd
так что я полагаю, у вас есть apache2
работает на вашем сервере. Создать vsftpd
затем поместите в него файлы конфигурации.
sudo mkdir /etc/vsftpd
затем
sudo htpasswd -cd /etc/vsftpd/ftpd.passwd user1
-c означает, что мы создадим файл, если он еще не существует -d форсирует MD5, он нужен вам в Ubuntu 12.04, просто используйте его всегда
Команда запросит пароль.
Если вы хотите добавить новых пользователей впоследствии:
sudo htpasswd -d /etc/vsftpd/ftpd.passwd user2
- Настройте PAM в
/etc/pam.d/vsftpd
Опять же, вам нужно создать резервную копию оригинального файла
sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
и создать новый
sudo vim /etc/pam.d/vsftpd
Скопируйте и вставьте эти 2 строки (это должен быть единственный контент). Я настаиваю только на этих двух строках, я потратил много времени на сохранение оригиналов и просто добавил их.
auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
- Создать локального пользователя без доступа к оболочке
sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
Вы можете проверить, что он был создан с помощью команды id: id vsftpd. Мы определяем пользователя с помощью оболочки /bin/false из-за параметра check_shell (даже если вы его не используете). Когда конечный пользователь подключается к FTP-серверу, они будут использоваться для прав и собственности:
chmod
а также chown
,
- Запустить снова
vsftpd
Обычный способ - использовать init.d, как и все остальные.
sudo /etc/init.d/vsftpd restart
sudo service vsftpd restart
- Создать каталоги
Согласно конфигурации все пользователи будут помещены в эту папку: /var/www/user1.
Вам нужно создать их с определенными правами: корневая папка не может быть доступна для записи!
/ [root = /var/www/user1] => 555
www [ /var/www/user1/www ] => 755
docs [ /var/www/user1/docs ] => 755
Примечание: пользователь не может создавать файлы или папки в корневом каталоге.
В vsftpd.conf
у нас есть chroot_local_user=YES
поэтому пользователь не может видеть ничего за пределами своей папки. Для него сервер выглядит так:
Так что просто запустите эти команды:
mkdir /var/www/user1`
chmod -w /var/www/user1
mkdir www/user1/www
chmod -R 755 /var/www/user1/www
chown -R vsftpd:nogroup /var/www/user1
/var/www/user1
папка ДОЛЖНА существовать, иначе соединение не будет установлено.
Прямо сейчас вы можете попробовать подключиться к вашему FTP
- Создайте пользователя-администратора для доступа ко всему серверу
Чтобы создать пользователя с правами администратора, нам нужно зарегистрировать нового пользователя в htpasswd
,
Прежде чем мы сделаем это, я советую вам проверить в /etc/ftpusers
файл, определяющий определенных пользователей, которым запрещено подключаться по FTP. Я думаю, что это только для локальных пользователей, а не виртуальных пользователей, но на всякий случай не выбирайте имя, содержащееся в этом файле.
sudo htpasswd -d /etc/vsftpd/ftpd.passwd theadmin
Теперь нам нужно добавить новую строку в /etc/vsftpd.conf
chroot_list_enable=YES
Это означает, что ваш пользователь будет помещен в их папку (в качестве тюрьмы), КРОМЕ пользователей в / etc /
vsftpd.chroot_list
Давайте создадим этот файл и добавим нашего пользователя, файл представляет собой простую строку, содержащую "theadmin". Добавьте по одному пользователю в строке. Это означает, что вам не нужно создавать /var/www/theadmin
папку, пользователь войдет в систему и начнется в /home/vsftpd
,
Перезагрузите сервер, и все готово!
В дополнение к ответам @Avenyet и @2707974 вы можете использовать более безопасный способ создания файла паролей виртуальных пользователей (/etc/vsftpd/ftpd.passwd
). Вместо использованияhtaccess
вы можете использовать команду mkpasswd
команда из whois
пакет (по крайней мере, на Ubuntu). mkpasswd
не обновляет файл паролей для вас htaccess
, он только генерирует хэш пароля. Поэтому вам нужно будет создать и обновить файл паролей самостоятельно.
К счастью, синтаксис файла паролей очень прост, он просто состоит из имени пользователя и хэша пароля, разделенных двоеточием, и по одной строке для каждого пользователя. Пример:
user1:6Gshac7jdk01U
Это пароль foo
, с основным хешированием крипты.
Linux crypt поддерживает лучшие алгоритмы хеширования, чем базовый des crypt, используемый htaccess
и md5, используемый openssl passwd
команда. Использоватьmkpasswd -m help
чтобы увидеть список алгоритмов вашего crypt
поддерживает. В современных системах лучшими являются SHA-256 или SHA-512. В отличие от хеширования шифров по умолчанию (котороеhtaccess
также использует), в них используются все символы пароля, и в отличие от des и openssl passwd
у них есть настраиваемое количество раундов.
Чем больше раундов, тем больше времени требуется для вычисления хэша и тем сложнее становится отменить хэш, если злоумышленник получает доступ к хешам паролей. Для сервера, который не находится в общедоступном Интернете, я бы сказал, чтобы количество раундов было как можно большим, но без заметного времени хеширования, то есть менее 0,1 секунды. Если сервер находится в Интернете, это может стать вектором отказа в обслуживании, так как кто-то может попробовать много логинов со случайными паролями и использовать ресурсы ЦП. Если это представляет риск для вашей конфигурации, вам следует использовать более низкое значение.
Значение по умолчанию для вариантов SHA - 5000, что довольно мало. Я использую 100000 в своей установке (которая не является общедоступной).
Чтобы сгенерировать такой хеш, введите mkpasswd -m sha-512 -R 100000
. Вам будет предложено ввести пароль и распечатать хэш. Используйте хеш в файле passwd вместо простых хешей крипт, как это:
user1:$6$rounds=100000$HRZdUPD8$GVBmHg91rjNm.WlcMCcLp41Ewz6XXJ1ktKzS8Zmr8cmyVGR28URVY1A9N3Nz4W9zl6lDGjwVbz94N/JQVSGOh/
Тип хеша и количество раундов встроены в хеш-значение, поэтому crypt
можно увидеть, какой метод использовать для проверки пароля. Можно даже смешивать разные типы хэшей в одном файле passwd. Эти файлы passwd можно использовать в/etc/vsftpd/ftpd.passwd
для высочайшего уровня безопасности crypt
в настоящее время может предложить. Для остальной части конфигурации я ссылаюсь на другие ответы.
(Я все еще жду crypt
для поддержки лучшего алгоритма хеширования паролей, такого как scrypt или один из вариантов Argon2.)
Да , вы можете, и для гибкости создать каталог и файл userconfig, mkdir /var/www/userconfs
или что вы хотите изменить имя userconfs, а затем создать конкретный файл
vi /var/www/userconfigs/ftpuseraccount
внутренний тип, local_root=/var/www
(или что бы вы не хотели получить доступ через dir)guest_username=www-data
(владелец Ubuntu файла top edit
после обновления вы vsftpd.conf добавив user_config_dir=/var/www/userconfigs
(или как вы его заменили, эта учетная запись будет иметь доступ к любому указанному sdir yo)