2 votes

vsftpd se bloque lors de l'utilisation de pam_exec ou pam_script

J'ai intégré VSFTPD avec pam_mysql, ce qui me permet de me connecter avec succès à un serveur FTP en utilisant des comptes conservés dans une base de données mysql.

Je dois créer automatiquement un répertoire pour l'utilisateur si c'est la première fois qu'il se connecte au serveur. J'ai vu des suggestions d'utiliser pam_script ou pam_exec pour y parvenir.

À titre d'essai, j'ai révisé mon /etc/pam.d/vsftpd pour inclure la ligne suivante :

account optional pam_exec.so debug log=/tmp/pam_exec.log /etc/pam-script/test.sh

Le script fait juste écho à l'utilisateur :

#!/bin/sh
echo $PAM_USER

Sur /var/log/auth.log Je peux voir que le script est appelé :

Jan 16 17:15:44 ip-172-31-8-61 vsftpd: pam_exec(vsftpd:auth): Calling /etc/pam-script/dir.sh ...

Cependant, la connexion FTP ne se fait pas. La connexion se bloque. Toutes les connexions suivantes échouent et je dois redémarrer le service pour qu'il réponde.

J'ai exclu les problèmes avec la configuration/script en modifiant également la configuration PAM pour les connexions SSHD, ce qui semble fonctionner correctement.

J'ai également testé cela en utilisant le module pam_script et j'obtiens des résultats similaires lorsque le module pam_script_auth script est appelé.

Le problème semble être que VSFTP n'est pas capable de terminer une connexion s'il y a des étapes supplémentaires dans la configuration de PAM. J'ai essayé différents paramètres (auth, account) et différents niveaux d'exigence (optional, required) sans succès.

Quelqu'un a une idée ?

Mise à jour : Ubuntu 12.04. En utilisant une version modifiée de VSFTP comme décrit ici

1voto

ozbob Points 11

Je sais que cette question a été posée il y a un certain temps mais j'ai rencontré des problÃ?mes similaires sous Debian, à savoir le blocage du processus vsftpd lors de l'ajout de pam_exec à la chaîne. Pour moi, le problème était qu'il n'était pas suffisant d'ajouter

session_support=YES

au fichier de configuration de vsftpd mais aussi de mettre

@include common-session

en /etc/pam.d/vsftpd que j'avais commenté en suivant certains guides sur les utilisateurs virtuels pour vsftpd. Le fichier pam complet ressemble donc à ceci pour moi :

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

(Mon cas d'utilisation est de traiter les fichiers téléchargés une fois qu'un utilisateur ftp spécifique se déconnecte).

1voto

Je confirme que c'est un bogue sur Debian / Ubuntu et les versions natives de vsftpd. Tout module PAM appelant un sous-processus bloquera ou suspendra vsftpd (par exemple pam_exec, pam_script, module pam personnalisé impliquant des appels système ou popen).

J'ai résolu le problème en construisant les sources de centos sur ma 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 ne se bloquera plus et vous pourrez appeler la fonction system() depuis vos modules PAM. fork et exec ne fonctionneront toujours pas correctement pour une raison quelconque.

0voto

RAbraham Points 1117

Vérifiez vos journaux suexec. Peut-être que votre structure de répertoire est dans un emplacement non standard pour vsftpd. Aussi, je pense que vous avez besoin de plus dans votre fichier de configuration pam.

Voici à quoi ressemble ma configuration 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

Cela fait un moment que je n'ai pas regardé cela, alors j'espère que cela vous aidera.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X