Utiliser proftpd avec une base de données PostgreSQL

Par défaut, lorsque l’on installe un serveur ftp sous linux, les autorisations et répertoires racines sont basées sur les utilisateurs système. Chaque fois que l’on veut ouvrir un accès, il faut ajouter un utilisateur. Cela peut commencer à devenir problématique quand vous voulez ouvrir des accès différents qui utilisent le même répertoire racine (par exemple pour gérer le VirtualHost d’un serveur apache ?). Proftpd est un serveur ftp très efficace, facile à configurer, et qui peut se lier à une base de données pour la gestion des utilisateurs. Nous allons voir ici comment l’utiliser avec PostGreSQL, mais i est tout a fait possible d’utiliser une autre base de données (MySql par exemple).

Les exemples ci dessous sont testés avec un ubuntu server 10.04, à adapter selon votre distribution.

1 – Installation des prérequis

sudo apt-get install proftpd-basic proftpd-mod-pgsql

Si vous souhaitez une autre base de données, il suffit de changer le proftpd-mod-pgsql par celui de la base que vous souhaitez (proftpd-mod-ldap, proftpd-mod-mysql, proftpd-mod-sqlite, ou même proftpd-mod-odbc qui permet via le connecteur odbc de se connecter à n’importe quelle base de données).

Lors de l’installation, on va vous demander si vous souhaitez lancer proftpd par inetd ou en indépendamment.

  • inetd : proftpd est appelé à chaque connection sur le port 21. Aucun démon proftpd ne tourne sur le machine. Une instance est ouvert à chaque appel. Ce mod convient aux sites qui n’ont pas énormément de connections simultanées (30 maximum)
  • indépendamment : le démon proftpd tourne en permanence, c’est le mode conseillé pour les sites qui ont un fort trafic ftp simultané.

Vous pourrez changer ce mode plus tard en tapant la commande

sudo dpkg-reconfigure proftpd-basic

2 – Structure de la base de données

Il faut créer deux tables dans la base de données, en voici les sources :


CREATE TABLE ftp_groups
(groupname text NOT NULL,
gid integer,
members text );
CREATE TABLE ftp_users
(userid text NOT NULL,
passwd text NOT NULL,
uid integer NOT NULL,
gid integer NOT NULL,
home text NOT NULL,
shell text,
CONSTRAINT ftp_users_pkey PRIMARY KEY (userid) )

Dans notre exemple, nous allons les mettre dans une base appelée ftp, accessible par un utilisateur ftp, dont le mot de passe est ftppassword.

Vous pouvez bien entendu modifier la structure de ces tables, ou utiliser des tables existantes si vous avez déjà une méthode d’authentification. Il faudra dans ce cas adapter la suite du tutoriel à votre cas.

3 – Paramétrage de proftpd pour utiliser ces bases

Tous les fichiers à configurer se trouvent dans /etc/proftpd. Bien entendu, il est recommandé de faire des sauvegardes de ces fichiers avant modification, et toutes les modifications doivent être faites par un superutilisateur.

Le fichier modules.conf

Il faut décomment si besoin les lignes :
LoadModule mod_sql.c (permat d’activer le module sql de proftpd)
LoadModule mod_sql_postgres.c (permet d’activer le module postgres de proftpd, à adapter selon vos besoins.

Le fichier sql.conf

IL doit ressembler à ça (j’ai supprimé les lignes de commentaire pour plus de clarté) :



SQLBackend postgres
SQLEngine on
SQLAuthenticate on
#
# Use both a crypted or plaintext password
SQLAuthTypes Crypt Plaintext
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection
#SQLConnectInfo ftppd@sql.example.com proftpd_user proftpd_password
SQLConnectInfo ftp ftp ftppassword
#
# Describes both users/groups tables
#
SQLUserInfo ftp_users userid passwd uid gid home shell
SQLGroupInfo ftp_groups groupname gid members
#
;

Explication de texte :

  • SQLBackend postgres : on explicite le type de connexion sql utilisé. Bien entendu, à adapter selon votre configuration (mysql, etc…)
  • SQLEngine on : le moteur sql est activé
  • SQLAuthenticate on : l’authentification se fera par sql
  • SQLAuthTypes Crypt Plaintext : le mot de passe en sql n’est pas crypté
  • SQLConnectInfo ftp ftp ftppassword : décrit la connection sql, dans l’ordre : nom de la base, nom utilisateur, mot de passe de l’utilisateur
  • SQLUserInfo ftp_users userid passwd uid gid home shell : on décrit la table des users. Dans l’ordre : nom de la table, champ contient le nom utilisateur, champ qui contient le mot de passe utilisateur, champ qui contient le user id de l’utilisateur, champ qui contient le group id de l’utilisateur, répertoire personnel, shell. Ceci correspond aux tables créer précédemment. Si vous avez déjà une structure existante, vous pouvez adapter cette ligne facilement.
  • SQLGroupInfo ftp_groups groupname gid members : Même chose avec la table des groupes (non utilisé pour le moment)

Le fichier proftpd.conf

C’est lui qui contient la configuration globale de proftpd. Il y a beaucoup de choses à ne pas changer, je ne vais insister que sur les lignes importantes :

  • DefaultRoot ~ : Cette ligne est commentée par défaut, ce qui me semble être un trou de sécurité potentiel. En la décommentant, vous "bloquez" les utilisateurs à leur répertoire racine, ce qui les empêche de remonter l’arborescence et d’aller voir tous vos fichiers de configuration. Il y a quand même le contrôle des droits unix, mais quand même. Je recommande largement d’enlever le commentaire de cette ligne
  • # RequireValidShell off : En revanche, il est important de laisser cette ligne commentée, ou de mettre cette valeur à on. Cela empêche les utilisateurs n’ayant pas de shell valide (typiquement, les utilisateurs ayant nolgin ou false dans le /etc/passwd, c’est à dire des utilisateurs système ne devant pas se connecter directement sur la machine). Les utilisateurs système ne pourront donc pas faire de ftp.
  • Include /etc/proftpd/sql.conf  : il faut bien sur décommenter cette ligne pour inclure le fichier sql.conf édité précédemment.

Fin de configuration

A ce niveau, proftpd est configuré pour utiliser PostGreSQL pour l’authentification. Si vous avez choisi le lancement par inetd, il n’est pas nécessaire de relancer quoi que ce soit. En revanche, si vous avez choisi le lancement indépendant, il faudra relancer le démon proftpd :

sudo service proftpd restart

pour une Ubuntu >= 10.04 ou

sudo /etc/init.d/proftpd restart

pour les versions antérieurs.

4 – Ajout d’un utilisateur et tests

Supposons que vous vouliez ajouter un utilisateur qui doit pouvoir modifier des fichiers dans le répertoire public_html de l’utilisateur stephane (/home/stephane/public_html), qui a pour un uid/gid de 1000/1000 (rappel, pour voir quels sont les uid et uid d’un utilisateur, on utilise la commande id utilisateur). Cet utilisateur a pour nom ftpsteph et pour mot de passe passwdsteph.
Il faut rentrer ces valeurs dans la table ftp_users en sql (en passant par pagadmin3, ou sql, la méthode qui vous convient le mieux) :


insert into ftp_users (userid, passwd, uid, gid, home, shell)
values ('ftpsteph','passwdsteph',1000,1000,'/home/steph/public_html','/bin/sh')

Vous pouvez ensuite tester votre configuration en tapant :

ftp 127.0.0.1

Et renseigner les noms d’utilisateur et mot de passe avec les valeurs remplies précédemment. Si il y a des anomalies, vous avez normalement toutes les informations nécessaires dans le fichier de log : /var/log/proftpd/proftpd.log.

One thought on “Utiliser proftpd avec une base de données PostgreSQL

Laisser un commentaire