Вопрос или проблема
Я хочу настроить сервер VSFTP на Ubuntu 22.04.4 с MySQL в качестве базы данных для хранения пользователей.
Я использовал этот гид для его настройки (он предназначен для CentOS, но за исключением части о pam_mysql.so
, он применим и к Ubuntu).
Вот моя конфигурация:
- /etc/vsftpd.conf
anonymous_enable=NO
pasv_addr_resolve=YES
pasv_address=ftp.company.com
pasv_min_port=40000
pasv_max_port=41000
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
#user_config_dir=/etc/vsftpd/vsftpd_user_conf
allow_writeable_chroot=YES
pasv_enable=YES
- /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=mypassword host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
account required pam_mysql.so user=vsftpd passwd=mypassword host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
- Таблица аккаунтов MySQL
mysql> select * from accounts;
+----+-----------------------------------+----------------------------------+
| id | username | pass |
+----+-----------------------------------+----------------------------------+
| 1 | [email protected] | [passwordhash] |
+----+-----------------------------------+----------------------------------+
1 row in set (0.00 sec)
На локальном тестовом сервере в VirtualBox всё работает нормально, однако когда я использую ту же конфигурацию на производственном сервере, я получаю следующую ошибку при подключении к FTP-серверу с помощью winSCP:
OOPS: cannot read user list file:/etc/vsftpd.user_list
Поэтому, по всей видимости, vsftp не использует подключение к MySQL для извлечения пользователей, а ищет файл userlist, который, конечно, отсутствует.
Пока что я проверил следующее:
- Убедился, что
libpam-mysql
и mysql-client установлены - Проверил возможность подключения к базе данных MySQL с учетными данными vsftpd
- Отключил iptables, чтобы это не мешало подключению к базе данных
Но пока я не смог решить эту проблему. Разочаровывает то, что это работает на моем экземпляре VirtualBox, но я не вижу никакой разницы между этим экземпляром и производственным экземпляром.
Как мне устранить неполадки в соединении между vsftpd
и MySQL
?
Моя производственная среда:
- Ubuntu 22.04.4
- MySQL 8.0.36
- vsftpd 3.0.5
- iptables v1.8.7
При дальнейшей проверке я заметил следующую ошибку в /var/log/auth.log
pam_mysql - MySQL error (Access denied for user 'vsftpd'@'localhost' (using password: YES))
Как я и думал, vsftpd не может подключиться к базе данных MySQL. Я, похоже, решил это, создав нового пользователя: vsftpd_user
и новую базу данных vsftpd_db
, а затем воссоздав привилегии и таблицы для vsftpd. У меня не было никаких дальнейших проблем с подключением vsftpd к MySQL таким образом, поэтому, вероятно, возникла некоторая путаница из-за использования одного и того же имени для базы данных и пользователя.
Ответ или решение
Чтобы решить ошибку OOPS: cannot read user list file:/etc/vsftpd.user_list при использовании VSFTP с MySQL в качестве бэкенда пользователей, необходимо учитывать несколько ключевых аспектов конфигурации и подключения к базе данных.
1. Проблема с доступом к MySQL
Ошибка, которую вы увидели в /var/log/auth.log
:
pam_mysql - MySQL error (Access denied for user 'vsftpd'@'localhost' (using password: YES))
указывает на то, что учетная запись ‘vsftpd’ не имеет прав доступа к базе данных. Для решения этой проблемы вы уже предприняли шаги по созданию нового пользователя и базы данных, что является правильным решением. Однако, если вы все еще работаете с учетной записью ‘vsftpd’, убедитесь, что она создана и ей предоставлены необходимые привилегии. Ваша команда для предоставления прав может выглядеть следующим образом:
GRANT ALL PRIVILEGES ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'mypassword';
FLUSH PRIVILEGES;
2. Убедитесь в правильности конфигурации pam.d
Ваш файл /etc/pam.d/vsftpd
выглядит корректно, но важно, чтобы pam_mysql.so
был установлен и правильно настроен. Убедитесь, что у вас установлены все необходимые зависимости, и что пакет libpam-mysql
корректно сконфигурирован.
3. Параметры конфигурации VSFTP
Согласно вашей конфигурации /etc/vsftpd.conf
, параметр userlist_enable=YES
будет заставлять сервер проверять наличие файла /etc/vsftpd.user_list
для списка разрешенных пользователей. Если у вас нет этого файла, вы можете либо создать его и добавить туда пользователей, либо установить параметр userlist_enable=NO
, если вы полностью полагаетесь на MySQL для аутентификации.
4. Проверка логов
Если сервер все еще не работает, внимательно посмотрите другие логи, такие как /var/log/vsftpd.log
и /var/log/syslog
, чтобы получить более детальную информацию о проблемах.
5. Перезапуск службы
После внесения всех изменений в конфигурацию не забудьте перезапустить службу VSFTPD:
sudo systemctl restart vsftpd
6. Тестирование подключения
После настройки и перезапуска службы вы можете протестировать подключение к FTP-серверу с помощью клиента, такого как WinSCP, чтобы убедиться, что все работает как задумано.
Заключение
Если вы соблюдаете все вышеперечисленные шаги и проблемы все еще сохраняются, рекомендуется проверить настройки SELinux, если они включены, или другие элементы безопасности, которые могут мешать соединению между VSFTP и MySQL. Кроме того, убедитесь, что сервер может корректно разрешать DNS-имя, если это применимо, и что сеть настроена корректно без ограничений на порты, используемые сервером (например, 21 для FTP).