Table des matières

pure-ftpd

Description

Pure-ftpd est un serveur FTP que j’aime bien et qui est simple à configurer.
Pour s’identifier on peut utiliser soit les comptes unix de la machine soit une base de données indépendantes.

Dans notre cas, nous allons utiliser le ftp pour ce connecter en tant que www-data qui est le compte d’apache et pour cela nous n’allons pas utiliser la base de données d’utilisateur unix (pam). Nous allons créer notre propre base de données utilisateur.

Installation

Classique

aptitude install pure-ftpd-common

Le message suivant peut apparaître

update-rc.d: warning: pure-ftpd stop runlevel arguments (1) do not match LSB Default-Stop values (0 1 6)
Starting ftp server: Running: /usr/sbin/pure-ftpd -l pam -O clf:/var/log/pure-ftpd/transfer.log -E -u 1000 -8 UTF-8 -B

Ne pas en tenir compte…

Configuration

Avec l'outil dpkg-reconfigure

On peut utiliser

dpkg-reconfigure pure-ftpd-common

Lancement de pure-ftpd

Serveur autonome

Pure-ftpwho doit-il s’exécuter avec les droits du superutilisateur ?

Non  si vous en avant pas besoin sinon Oui

Faut-il activer les environnement fermés (« chroots ») virtuels ?

Non  sauf si vous n'avez pas de lien symbolique dans vos dossiers utilisateurs, mettez plutot Oui par sécurité

Voila les seules choses configurable via cet outils…

Avec les fichiers de config

Tous les paramètres de configuration se trouvent dans le man de pure-ftpd-wrapper, c’est une spécificité de debian.

Passons aux fichiers de configuration à modifier dans notre cas

Créer un fichier PassivePortRange dans /etc/pure-ftpd/conf/ :

~$ vi /etc/pure-ftpd/conf/PassivePortRange

Lui entrer deux valeur numériques entre 1024 et 65535. Exemple :

40000 40100

Pure-ftp utilisera alors un port entre 40000 et 40100 pour le transport de données.

Dans le mode FTP passif , le client demande au serveur de choisir un port aléatoire sur lequel ce dernier se mettra à l’écoute en attente de la connexion de données. Le serveur communique au client le port qu’il a choisi pour le transfert des données.

Créer un fichier NATmode dans /etc/pure-ftpd/conf/ :

~$ vi /etc/pure-ftpd/conf/NATmode

Lui entrer la valeur :

no

Priorité au mode passif.

Redémarrer pure-ftp :

~$ /etc/init.d/pure-ftpd restart
Restarting ftp server: Running: /usr/sbin/pure-ftpd -l pam -O clf:/var/log/pure-ftpd/transfer.log -E -u 1000 -p 40000:40100 -8 UTF-8 -B

On constate que nos ports ont été ajouté à la ligne de commande ci-dessus.

Règle du firewall mais je suis sur de rien, c’est pour le mode passif

iptables -A INPUT -p tcp -i eth0 --dport 40000:40100 -j ACCEPT
iptables -A OUTPUT -p tcp -o eth0 --sport 40000:40100 -j ACCEPT

Configuration du système d'authentification

Pour s’assurer que pure-ftpd va bien utiliser la base d’utilisateur puredb assurez-vous de ce qui suit.

Vérifier le fichier de config qui définie l’emplacement de la base PureDB

cat /etc/pure-ftpd/conf/PureDB 
/etc/pure-ftpd/pureftpd.pdb 

Vérifiez donc l’existence de ce fichier.

# ls
auth  conf  db  pureftpd-dir-aliases

Et bien non, par défaut il n’existe pas… Nous vérifierons plus tard.

Nous allons faire en sorte que cette base soit pris en compte lors du lancement du serveur FTP

# cd /etc/pure-ftpd/auth
# ls -l
# total 0
lrwxrwxrwx 1 root root 26 2005-11-08 10:24 65unix -> ../conf/UnixAuthentication
lrwxrwxrwx 1 root root 25 2005-11-08 10:24 70pam -> ../conf/PAMAuthentication

Par défaut il n’y a que les 2 autorisations des utilisateurs systèmes. Il n’y a pas notre base d’utilisateurs virtuels.

# rm * Supprimons ces autorisations.
# ln -s /etc/pure-ftpd/conf/PureDB 75puredb 

On crée un lien symbolique vers notre fichier de config. Cela permet au programme de prendre en compte notre base de données.

Par défaut, pureftpd autorise seulement les utilisateurs qui ont pour UID une valeur minimum de 1000.
Notre utilisateur www-data a pour UID 33 ce qui va nous poser problème.
Pour résoudre ce problème,mettez la valeur à 33.

Redémarrons maintenant le serveur

# /etc/init.d/pure-ftpd restart
Restarting ftp server: /usr/sbin/pure-ftpd-wrapper: Invalid configuration file /etc/pure-ftpd/auth/../conf/PureDB: "/etc/pure-ftpd/pureftpd.pdb": No such file

Et la c’est la CATA, le fichier /etc/pure-ftpd/pureftpd.pdb n’existe pas !!

Pour créer ce fichier, il va falloir ajouter au moins un utilisateur en suivant le chapitre qui suit.

Administration

Ajouter un utilisateur

Dans cet exemple, je vais créer une liste d’utilisateur virtuel c’est à dire des utilisateurs qui n’existe pas dans le system.
Nous allons donc utiliser une database de pure-ftpd appelé puredb
Créons maintenant un utilisateur toto qui aura les droits de l’utilisateur totounix qui doit exister dans votre système unix :

pure-pw useradd toto -u totounix -d /home/totounix -m

L’utilisateur toto est maintenant créé et aura les mêmes droit que l’utilisateur local totounix.
L’option -d définit le répertoire de l’utilisateur.

-d ne permet pas à l’utilisateur de remonter au dela de son répertoire
contrairement à
-D qui permet cette possibilité.

L’argument -m permet de mettre à jour la base de données puredb.
Si on oublie -m on peut toujours mettre à jour la puredb par cette commande :

pure-pw mkdb

Restreindre par ip un user existant (bien penser à remettre les ip existante)

pure-pw usermod toto -r 192.168.0.0/24,10.0.0.1 -m

Vérification

Maintenant que vous avez créé vos utilisateurs, démarrons le serveur.

# /etc/init.d/pure-ftpd restart
Restarting ftp server: Running: /usr/sbin/pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -O clf:/var/log/pure-ftpd/transfer.log -E -u 33 -p 40000:40100 -8 UTF-8 -B

On voit que la ligne de commande a complètement changé, notre fichier de base de données utilisateur est bien le fichier /etc/pure-ftpd/pureftpd.pdb

Exécuter un script à la réception d'un fichier

vi /etc/default/pure-ftpd-common

Renseigner la variable UPLOADSCRIPT

# UPLOADSCRIPT: if this is set and the daemon is run in standalone mode,
# pure-uploadscript will also be run to spawn the program given below
# for handling uploads. see /usr/share/doc/pure-ftpd/README.gz or
# pure-uploadscript(8)
 
# example: UPLOADSCRIPT=/usr/local/sbin/uploadhandler.pl
UPLOADSCRIPT=/root/script/test.bash

Les variables suivantes sont accessible dans votre script bash

Du coup vous pouvez exécuter une commande en fonction de l’utilisateur

if [ "$UPLOAD_USER" = "toto" ]; then
        echo -e `date "+%Y-%m-%d %H:%M:%S"` >> /var/log/toto.log
        echo -e "Contenu du fichier envoyé : "`cat $1` | mail -s "L'utilisateur toto a envoyé un fichier" Votre_email@toto.com
fi

ou en fonction du fichier

if [ "$1" = "/home/ftp/fichier.txt" ]; then
        echo -e `date "+%Y-%m-%d %H:%M:%S"` >> /var/log/toto.log
        echo -e "Contenu du fichier envoyé : "`cat $1` | mail -s "Un fichier fichier.txt a été envoyé" Votre_email@toto.com
fi