Как настроить виртуальных пользователей для vsftpd с доступом к определенному подкаталогу?

Мне нужно иметь возможность добавлять виртуальных пользователей в vsftpd, которые имеют доступ только к вложенной папке. Причина, по которой я хочу использовать виртуальных пользователей, заключается в том, что я хочу иметь только 1 реального пользователя на сервере.

Структура FTP такова:

  • www
    • website_name1
      • sub_folder1
    • website_name2
      • sub_folder2
      • sub_folder3
    • website_name3
    • website_name4

Основная учетная запись имеет доступ к папке www и всем подкаталогам, и я хочу добавить виртуального пользователя, который может иметь доступ к вложенная папка 1 и только вложенная папка 1

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

Я нашел способы добавлять пользователей, чтобы видеть всю структуру или настраивать папки с именами пользователей, которые мне не нужны.

Я нашел аналогичный вопрос, размещенный здесь:

Как настроить VSFTPD для нескольких пользователей, включая добавление определенных каталогов

но он рекомендует proftpd который, как я думал, был в целом менее безопасным.
Или я упустил здесь главное?

Немного поиграв, мне удалось найти полурешение (не идеальное, но достаточно хорошее).

используя ответ 2707974 и информацию, которую я получил в другом месте, я смог получить то, что мне нужно.

Сначала вам нужно установить vsftp и PAM

apt-get install vsftpd libpam-pwdfile

Редактировать /etc/vsftpd.conf

nano /etc/vsftpd.conf

затем вставьте следующее

listen=YESanonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022local_root=/var/wwwchroot_local_user=YESallow_writeable_chroot=YEShide_ids=YES#virutal user settingsuser_config_dir=/etc/vsftpd_user_confguest_enable=YESvirtual_use_local_privs=YESpam_service_name=vsftpdnopriv_user=vsftpdguest_username=vsftpd

Отредактируйте в соответствии с вашими точными потребностями самое важное для виртуальных пользователей - это все, что находится после комментария к настройкам виртуального пользователя

Создание пользователя

Вы можете либо использовать базу данных, либо htpasswd Я нашел htpasswd быстрее и проще в использовании.

создайте каталог для хранения ваших пользователей

mkdir /etc/vsftpdhtpasswd -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.passwdaccount required pam_permit.so

Это позволит войти в систему для ваших виртуальных пользователей, определенных в /etc/vsftpd/ftpd.passwd и отключит локальных пользователей

Далее нам нужно добавить пользователя для использования этими виртуальными пользователями. Эти пользователи не будут иметь доступа к оболочке и будут вызваны vsftpd

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

пользователь должен соответствовать guest_username=vsftpd в файле vsftpd conf

Определение Доступа к каталогу

Важная строка здесь заключается в следующем

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

теперь вы должны иметь возможность войти в систему как пользователь1, который сможет видеть только var/www/website_name1/sub_folder1 и любая папка и файл внутри него.

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

важно помнить, что если вы не создадите файл user 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

Создайте пользователя-администратора с полным доступом к серверу

  1. Устанавливать vsftpd (Очень безопасный FTP-демон) и libpam-pwdfile для создания виртуальных пользователей

Я хотел создать пользователей FTP, но я не хотел добавлять локальных пользователей unix (нет доступа к оболочке, нет домашнего каталога и так далее). PAM (Подключаемые модули аутентификации) поможет вам создавать виртуальных пользователей.

sudo apt-get install vsftpd libpam-pwdfile

  1. Редактировать vsftpd.conf

Сначала вам нужно создать резервную копию исходного файла

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak

Затем создайте новый

sudo vim /etc/vsftpd.conf

Скопируйте и вставьте следующие строки. Файл должен содержать ТОЛЬКО эти строки:

listen=YESanonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022nopriv_user=vsftpdvirtual_use_local_privs=YESguest_enable=YESuser_sub_token=$USERlocal_root=/var/www/$USERchroot_local_user=YEShide_ids=YESguest_username=vsftpd
  1. Регистрация виртуальных пользователей

Для регистрации пользователя вы используете 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

  1. Настройте PAM в /etc/pam.d/vsftpd

Опять же, вам необходимо создать резервную копию исходного файла

sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

и создайте новый

sudo vim /etc/pam.d/vsftpd

Скопируйте и вставьте эти 2 строки (это должно быть единственное содержимое). Я настаиваю только на этих 2 строках, я потратил много времени на сохранение оригиналов и просто добавил их.

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwdaccount required pam_permit.so
  1. Создайте локального пользователя без доступа к оболочке

sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

Вы можете проверить, что он был создан с помощью команды id: id vsftpd. Мы определяем пользователя с помощью оболочки /bin/false из-за параметра check_shell (даже если вы его не используете). Когда конечный пользователь подключается к FTP-серверу, они будут использоваться для получения прав и владения:

chmod и chown.

  1. Перезапуск vsftpd

Обычный способ - использовать init.d, как и все deamon

sudo /etc/init.d/vsftpd restart

sudo service vsftpd restart

  1. Создание каталогов

В соответствии с конфигурацией все пользователи будут помещены в эту папку: /var/www/user1.

Вам нужно создать их с определенными правами: корневая папка не может быть доступна для записи!

 / [root = /var/www/user1] => 555www [ /var/www/user1/www ] => 755docs [ /var/www/user1/docs ] => 755

Примечание: пользователь не может создавать файлы или папки в корневом каталоге.

В vsftpd.conf у нас есть chroot_local_user=YES таким образом, пользователь не может видеть ничего за пределами своей папки. Для него сервер выглядит следующим образом:

Так что просто запустите эти команды:

mkdir /var/www/user1`chmod -w /var/www/user1mkdir www/user1/wwwchmod -R 755 /var/www/user1/wwwchown -R vsftpd:nogroup /var/www/user1

То /var/www/user1 папка ДОЛЖНА существовать, иначе соединение завершится ошибкой.

Прямо сейчас вы можете попробовать подключиться к своему FTP

  1. Создайте пользователя-администратора для доступа ко всему серверу

Чтобы создать пользователя-администратора, нам нужно зарегистрировать нового пользователя с помощью 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. В отличие от хэширования крипты des по умолчанию (которое htaccess также использует) они используют все символы в пароле, и в отличие от des и openssl passwd у них есть настраиваемое количество раундов.

Чем больше раундов, тем больше времени требуется для вычисления хэша, и тем сложнее становится отменить хэш, если злоумышленник получит доступ к хэшам паролей. Для сервера, который не находится в общедоступном Интернете, я бы посоветовал выбрать как можно большее количество раундов, но без того, чтобы хэширование занимало заметное время, то есть менее 0,1 секунды. Если сервер находится в Интернете, это может привести к отказу в обслуживании, поскольку кто-то может попробовать множество входов в систему со случайными паролями и использовать ресурсы процессора. Если это представляет риск для вашей конфигурации, вам следует использовать более низкое значение.

Значение по умолчанию для вариантов SHA равно 5000, что довольно мало. Я использую 100000 в своей установке (которая не является общедоступной).

Чтобы сгенерировать такой хэш, введите mkpasswd -m sha-512 -R 100000. При этом вам будет предложено ввести пароль и распечатать хэш. Используйте хэш в файле passwd вместо простых хэшей crypt, подобных этому:

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(или все, к чему вы хотите получить доступ по каталогу)guest_username=www-data(владелец ubuntu верхнего редактирования файла

после обновления вы vsftpd.conf, добавив user_config_dir=/var/www/userconfigs(или как бы вы его ни заменили, эта учетная запись получит доступ к любому указанному вами sdir)

У меня была проблема с аутентификацией в течение самого долгого времени, пока я не нашел это ftp - vsftpd will not accept passwords encrypted with MD5 - Server Fault Очевидно, у ПЭМ есть проблемы с хэшем MD5. Это руководство решает эту проблему.