vsftpd зависает при использовании pam_exec или pam_script

У меня есть 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, как описано здесь

1
задан 16 January 2014 в 21:46

3 ответа

Проверьте ваши журналы 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

Прошло много времени с тех пор, как я смотрел на это, поэтому надеюсь, что это поможет.

0
ответ дан 16 January 2014 в 21:46

Я знаю, что этот вопрос задавали некоторое время назад, но я столкнулся с похожими проблемами в 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)

0
ответ дан 16 January 2014 в 21:46

Я подтверждаю, что это ошибка в 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 по-прежнему не будут работать должным образом по какой-либо причине.

0
ответ дан 16 January 2014 в 21:46

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

Похожие вопросы: