У меня есть VSFTPD, интегрированный с pam_mysql, что позволяет мне успешно входить на FTP-сервер, используя учетные записи, хранящиеся в базе данных mysql.
Мне нужно автоматически создать каталог для пользователя, если он впервые заходит на сервер. Я видел предложения использовать pam_script или pam_exec для достижения этой цели.
В качестве теста я изменил мою /etc/pam.d/vsftpd
конфигурацию, добавив в нее следующую строку:
account optional pam_exec.so debug log=/tmp/pam_exec.log /etc/pam-script/test.sh
Скрипт просто повторяет пользователя:
#!/bin/sh
echo $PAM_USER
В /var/log/auth.log
Я вижу, что скрипт вызывается:
Jan 16 17:15:44 ip-172-31-8-61 vsftpd: pam_exec(vsftpd:auth): Calling /etc/pam-script/dir.sh ...
Однако вход по FTP не завершен. Связь висит. Все последующие подключения завершаются неудачно, и мне нужно перезапустить службу, чтобы она ответила.
Я исключил проблемы с конфигурацией / скриптом, также настроив конфигурацию PAM для входа в SSHD, похоже, это работает нормально.
Я также проверил это с помощью модуля pam_script и получил аналогичные результаты при вызове скрипта pam_script_auth
.
Кажется, проблема в том, что VSFTP не может завершить вход в систему, если в конфигурации PAM есть дополнительные шаги. Я пробовал разные настройки (авторизация, учетная запись) и разные уровни требований (необязательно, обязательно), но безуспешно.
У кого-нибудь есть идеи?
Обновление: Ubuntu 12.04. Использование подправленной версии VSFTP, как описано здесь
Проверьте ваши журналы suexec. Возможно, ваша структура каталогов находится в нестандартном месте для vsftpd. Кроме того, я думаю, что вам нужно больше в вашем файле конфигурации PAM.
Вот как выглядит моя конфигурация pam:
cat /etc/pam.d/vsftpd
#%PAM-1.0
# Auth in MySQL
auth requisite pam_mysql.so user=readonly passwd=readonly host=somehost db=somedb table=accounts usercolumn=username passwdcolumn=pass crypt=3
auth required pam_script.so onerr=success dir=/etc/pam-script
# Account in MySQL
account required pam_mysql.so user=readonly passwd=readonly host=somehost db=somedb table=accounts usercolumn=username passwdcolumn=pass crypt=3
$ cat /etc/pam-script/pam_script_auth
#!/bin/sh
# Purpose: create the users's homedir and default message
#
# The evnironment variable $PAM_USER is passed on from PAM
# layer to this script via pam_script.so
if [ ! -d "/opt/ftp/$PAM_USER" ]; then
/bin/su - ftp -s /bin/sh -c "/usr/bin/env mkdir /opt/ftp/$PAM_USER"
/bin/su - ftp -s /bin/sh -c "/usr/bin/env chmod 751 /opt/ftp/$PAM_USER"
/bin/su - ftp -s /bin/sh -c "/usr/bin/env cat /etc/vsftpd /vsftpd.banner.homedir.txt > /opt/ftp/$PAM_USER/.message"
/bin/su - ftp -s /bin/sh -c "/usr/bin/env cat /etc/vsftpd/vsftpd.banner.homedir.txt > /opt/ftp/$PAM_USER/README.first"
fi
$ cat /etc/vsftpd/vsftpd.int.21.conf
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
message_file=.message
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=ftp
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/vsftpd/ssl/
guest_enable=YES
guest_username=ftp
local_root=/opt/ftp/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf
banner_file=/etc/vsftpd/vsftpd.banner.server.txt
pasv_min_port=20005
pasv_max_port=30005
pasv_address=10.10.10.10
## FTPS (21) Config Changes
listen_port=21
ftp_data_port=20
listen_address=10.10.10.123
Прошло много времени с тех пор, как я смотрел на это, поэтому надеюсь, что это поможет.
Я знаю, что этот вопрос задавали некоторое время назад, но я столкнулся с похожими проблемами в Debian, а именно с зависанием процесса vsftpd при добавлении pam_exec в цепочку. Для меня проблема заключалась в том, что было недостаточно добавить
session_support=YES
в конфигурационный файл vsftpd, но также поместить
@include common-session
в /etc/pam.d/vsftpd
, который я прокомментировал после некоторых руководства о виртуальных пользователях для vsftpd. Таким образом, полный файл pam для меня выглядит следующим образом:
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth required pam_pwdfile.so pwdfile=/etc/ftppasswd
account required pam_permit.so
session optional pam_exec.so type=close_session log=/var/log/session.log /etc/pam_session.sh
@include common-session
(Мой вариант использования - обработка загруженных файлов после выхода из системы определенного пользователя ftp)
Я подтверждаю, что это ошибка в Debian / Ubuntu и нативных версиях vsftpd. Любой модуль PAM, вызывающий подпроцесс, будет блокировать или зависать vsftpd (например, pam_exec, pam_script, пользовательский модуль pam, включающий системные вызовы или вызовы popen).
Я решил эту проблему путем создания источников Centos в своем Debian:
apt-get install vsftpd
cd /usr/local/src
git clone https://git.centos.org/git/centos-git-common.git
cp ./centos-git-common/*.sh /usr/local/sbin
git clone https://git.centos.org/git/rpms/vsftpd
cd /usr/local/src/vsftpd
git checkout c7
get_sources.sh
cd SOURCES
tar xvzf vsftpd-3.0.2.tar.gz
mv vsftpd-3.0.2/* .
git apply *-3.0.2-*.patch
sed -i -e 's/vsf_findlibs.sh`/vsf_findlibs.sh` -lcap/g' Makefile
sed -i -e 's/undef VSF_BUILD_SSL/define VSF_BUILD_SSL/g' builddefs.h
make
cp vsftpd /usr/sbin
vsftpd больше не будет зависать, и вы сможете вызывать функцию system () из ваших модулей PAM. fork и exec по-прежнему не будут работать должным образом по какой-либо причине.