Как настроить виртуальных пользователей для 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

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

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

Я хотел создать пользователей FTP, но не хотел добавлять локальных пользователей Unix (без доступа к оболочке, без домашнего каталога и т. Д.). PAM (Pluggable Authentication Modules) поможет вам создать виртуальных пользователей.

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=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
  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 строки (это должен быть единственный контент). Я настаиваю только на этих двух строках, я потратил много времени на сохранение оригиналов и просто добавил их.

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account 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, как и все остальные.

sudo /etc/init.d/vsftpd restart

sudo service vsftpd restart

  1. Создать каталоги

Согласно конфигурации все пользователи будут помещены в эту папку: /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

  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. В отличие от хеширования шифров по умолчанию (которое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)

Другие вопросы по тегам