Aller au contenu | Aller au menu | Aller à la recherche


Serveur FTP authentifié via Mysql

Comment faire un serveur FTP avec des utilisateurs virtuels déclarés sous Mysql ?

Pure-FTPd MySQL sous Debian Lenny (5.0.3)

Les paquets du serveur FTP : pure-ftpd

~# apt-cache search pure-ftp
pure-ftpd - Pure-FTPd FTP server
pure-ftpd-common - Pure-FTPd FTP server (Common Files)
pure-ftpd-ldap - Pure-FTPd FTP server with LDAP user authentication
pure-ftpd-mysql - Pure-FTPd FTP server with MySQL user authentication
pure-ftpd-postgresql - Pure-FTPd FTP server with PostgreSQL user authentication

Installation

~# apt-get install pure-ftpd-mysql
Les paquets supplémentaires suivants seront installés :
  pure-ftpd-common
Paquets recommandés :
  pure-ftpd
Les NOUVEAUX paquets suivants seront installés :
  pure-ftpd-common pure-ftpd-mysql

Note : historiquement pour la gestion des fichiers supérieurs à 2Go, il fallait compiler avec

--with-largefile
Support des fichiers de plus de 2 go. (elle est implémentée par défaut à partir de la version 1.0.21)

Mais heureusement pour nous les versions de Debian incluent une version de pure ftpd supérieure à la version 1.0.21

Configuration

Lecture de la doc depuis la documentation Pure-FTPd, section MySQL authentication, ou depuis les fichiers locaux :

cd /usr/share/doc/pure-ftpd-mysql
zcat README.MySQL.gz > README.MySQL.txt
vim README.MySQL.txt
/// 
 
!! Configuration des accès au serveur MySQL depuis Pure-FTPd
 
Créer l'utilisateur MySQL, sa base et sa table : 
 
///[sql]
CREATE TABLE users (
  User VARCHAR(16) BINARY NOT NULL,
  Password VARCHAR(64) BINARY NOT NULL,
  Uid INT(11) NOT NULL default '-1',
  Gid INT(11) NOT NULL default '-1',
  Dir VARCHAR(128) BINARY NOT NULL,
  PRIMARY KEY  (User)
);

Modifier le fichier de configuration pureFTPd mysql.conf pour spécifier nos accès :

~# vim /etc/pure-ftpd/db/mysql.conf
Options de configuration

Pour que chaque utilisateur puisse uniquement accéder au dossier qui lui est attribué, nous allons le chrooter.

~# vim /etc/pure-ftpd/conf/ChrootEveryone

Et entrez simplement "yes", sauvegardez et quittez.

Afficher et accéder aux fichiers commençant par un point. Il suffit de créer un fichier /etc/pure-ftpd/conf/DisplayDotFiles et d'y inscrire : "yes"

Aussi ,dans le cas où le répertoire associé à l'utilisateur virtuel n'existe pas, au lieu de provoquer une erreur, nous allons demander à pure-ftpd de le créer en mettant "yes" dans le nouveau fichier /etc/pure-ftpd/conf/CreateHomeDir

Options de lancement

On configure que serveur en mode "standalone" à la place de "inetd", sans quoi on ne peut pas le lancer via /etc/init.d/pure-ftpd-mysql start

~# vim /etc/default/pure-ftpd-common
# STANDALONE_OR_INETD
# valid values are "standalone" and "inetd".
# Any change here overrides the setting in debconf.
STANDALONE_OR_INETD=inetd
STANDALONE_OR_INETD=standalone

Lancement du serveur en standalone

~#  /etc/init.d/pure-ftpd-mysql start
Restarting ftp server: Running: /usr/sbin/pure-ftpd-mysql -l mysql:/etc/pure-ftpd/db/mysql.conf -l pam -A -O clf:/var/log/pure-ftpd/transfer.log -u 1000 -E -B
Lancement automatique de pure-ftpd au démarrage du système
~# update-rc.d pure-ftpd-mysql defaults
 System startup links for /etc/init.d/pure-ftpd-mysql already exist.

Erreur : pure-ftpd: (?@?) [ERROR] Unable to start a standalone server: [Invalid argument]

Au lancement du serveur Pure-FTPd, vous aurez peut être :

pure-ftpd: (?@?) [ERROR] Unable to start a standalone server: [Invalid argument]

Les deux modes de fonctionnement “démon” et processus se confronteraient, l’un empêchant l’autre de se lancer. Résolu en stoppant le processus lié à /usr/sbin/inetd.

Pour prévenir la répétition du problème au prochain lancement du serveur, commentaire de la ligne concernant le service FTP pure-ftpd dans /etc/inetd.conf

#:STANDARD: These are standard services.
#ftp    stream  tcp     nowait  root    /usr/sbin/tcpd /usr/sbin/pure-ftpd-wrapper

Pure-FTPd MySQL avec DEBIAN ETCH (4.0)

J'ai tester cela avec succès sous DEBIAN ETCH avec pure-ftpd-mysql.

#Installation
apt-get install-mysql

# Lecture de la doc
cd /usr/share/doc/pure-ftpd-common
gzip -d README.MySQL.gz
vim README.MySQL

# Configuration d'accès myqsl
vim /etc/pure-ftpd/db/mysql.conf

Création de la base de donnée et de la table avec la structure définie dans le fichier de doc. Ensuite ajout des utilisateurs dans cette table.

Puis lancement définitif en standalone après les erreurs rencontrées reportées par syslog :

  • Le serveur ne se lance pas. Dans le fichier /etc/default/pure-ftpd-common j'ai modifié la ligne STANDALONE_OR_INETD=inetd par STANDALONE_OR_INETD=standalone et du coup /etc/init.d/pure-ftpd-mysql start fonctionne !
  • [WARNING] Wrong SQL parameters : [SELECT Password FROM users WHERE User="www-data"]

La table n'était pas encore crée.

  • [WARNING] Can't login as [www-data]: account disabled

Côté client : 530 Sorry, but I can't trust you Il faut passer le /etc/pure-ftpd/conf/MinUID à une valeur au minimum égale à votre user web.

  • [INFO] www-data is now logged in

Ah quelle joie quand tout fonctionne !

D'autres infos sur les sites :

Il suffit de créer un fichier /etc/pure-ftpd/conf/DisplayDotFiles et d'y inscrire : "yes"

Identiquement, pour bloquer les utilisateurs dans leur home (chroot), rajouter le fichier /etc/pure-ftpd/conf/ChrootEveryone dont le contenu est "yes"

Pure-FTPd MySQL avec SUSE 10

J'ai tester cela avec succès sous SUSE 10 avec pure-ftpd.

Installez avec yast votre serveur FTP : pure-ftpd

5. Support de MySQL Le support de MySQL apporte la possibilité d'assurer l'authentification des utilisateurs via une base de donnée.

5.1. Prérequis

MySQL doit être installé afin d'activer cette fonctionnalité. Pure-FTPd nécessite également d'être compilé avec l'option --with-mysql.

5.2. Configuration de Pure-FTPd

vi pure-ftpd.conf
# MySQL configuration file (see README.MySQL)
# MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf
# If you want to enable PAM authentication, uncomment the following line
#PAMAuthentication             yes

# If you want simple Unix (/etc/passwd) authentication, uncomment this
# UnixAuthentication            yes

Nous allons créer un fichier de configuration afin d'y placer toutes les options pour le support de MySQL.

vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLServer monserveurmysql.mondomaine.com
MYSQLPort 3306
#MYSQLSocket /tmp/mysql.sock
MYSQLUser root
MYSQLPassword rootpw
MYSQLDatabase pureftpd
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"

PureFTPd utilise des variables pour ses requêtes SQL, comme \L dans l'exemple: \L désigne le login de l'utilisateur. \I désigne l'adresse IP a laquelle le client se connecte. \P désigne le port auqel le client se connecte. \R désigne l'adresse IP du client. \D désigne l'adresse IPv4 du client au format décimal.

Il suffit maintenant de lancer Pure-FTPd avec l'option -l mysql:

/usr/sbin/pure-ftpd -l mysql:/etc/pure-ftpd/pureftpd-mysql.conf &

ou plus simplement

/etc/init.d/pure-ftpd restart

Notez qu'il est possible de mixer plusieurs méthodes d'authentification qui se compléteront les unes aux autres. 5.3. Strucures des tables MySQL

On commence par créer une base pureftpd (via phpmyadmin par exemple).

Ensuite on crée la table users:

CREATE TABLE users (
User varchar(16) NOT NULL default '',
Password varchar(64) NOT NULL default '',
Uid int(11) NOT NULL default '-1',
Gid int(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
PRIMARY KEY (User)
);

Vous pouvez dès lors rajouter des utilisateurs dans la base et profiter de votre serveur FTP. N'oubliez pas de définir le Uid et Gid.

Ensuite pour connaître les utilisateurs définis sur votre serveur, utilisez la commande :

pure-ftpwho

Article réalisé selon l'explication de pure ftpd par supinfo sûrement lui même réalisé suivant how to forge : pure ftpd mysql et relatifs aux articles :

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet