Niveau : Expert

Serveur FTP avec Proftpd

Mise en place d'un serveur FTP avec Proftpd

Tutoriel par (Alsacréations, Strasbourg)
Créé le , mis à jour le (79479 lectures)
Tags : développement, ftp, serveur

Proftpd

Serveur FTP

ProFTPd est un serveur FTP libre très puissant, bien documenté avec une configuration simple d'accès, possédant une syntaxe proche de celle d'Apache.

Proftpd

Installation

apt-get install proftpd

Configuration

Edition de la configuration :

vi /etc/proftpd/proftpd.conf

Nous allons modifier les options suivantes :

UseIPv6 off
Ne pas utiliser IPv6 si ce n'est pas nécessaire
DefaultRoot ~
Le répertoire de destination par défaut des utilisateurs est leur propre home directory.
IdentLookups off
Désactive l'identification distante
RequireValidShell off
Permet la connexion des utilisateurs qui ne possèdent pas d'accès shell (cas de ce tutoriel)
IdentLookups off
Désactive l'identification distante
ServerIdent on "FTP Server ready."
Message minimaliste affiché à la connexion
ShowSymlinks off
Ne pas afficher les liens symboliques
AllowStoreRestart on
Autoriser la reprise d'un upload de fichier (resuming)
AllowRetrieveRestart on
Autoriser la reprise d'un téléchargement de fichier

Si vous ne parvenez pas à vous connecter, une parade consiste à désactiver le module SQL postgres, en commentant avec # la ligne correspondante dans le fichier /etc/proftpd/modules.conf :

vi /etc/proftpd/modules.conf

# LoadModule mod_sql_postgres.c

Redémarrer le tout :

/etc/init.d/proftpd restart

Proftpd-mysql

Par défaut, les comptes FTP sont ceux des utilisateurs de la machine. Dans le cas d'un serveur d'hébergement, il peut être intéressant de gérer les utilisateurs et groupes indépendamment. Le module proftpd-mysql permet de stocker ces informations dynamiquement dans une base de données MySQL.

Attention Si vous utilisez un panel d'administration (tel que DTC), cette étape est facultative, car elle sera gérée par le panel lui-même (le tutoriel prend donc fin ici).

Proftpd-mysql s'installe grâce à APT et au paquet du même nom :

apt-get install proftpd-mysql

Il faut ensuite créer la structure de la base de données. Connectez-vous en root pour définir les droits d'accès :

CREATE DATABASE `proftpd`;
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost'
IDENTIFIED BY motdepasse_proftpd;
FLUSH PRIVILEGES;

Puis mettre en place les tables :

USE proftpd;
CREATE TABLE `ftpgroup` (
`groupname` varchar(16) NOT NULL default '',
`gid` smallint(6) NOT NULL default '5500',
`members` varchar(16) NOT NULL default '',
KEY `groupname` (`groupname`)
) TYPE=MyISAM COMMENT='Table des groupes ProFTPD';

CREATE TABLE `ftpquotalimits` (
`name` varchar(30) default NULL,
`quota_type` enum('user','group','class','all') NOT NULL default 'user',
`par_session` enum('false','true') NOT NULL default 'false',
`limit_type` enum('soft','hard') NOT NULL default 'soft',
`bytes_up_limit` float NOT NULL default '0',
`bytes_down_limit` float NOT NULL default '0',
`bytes_transfer_limit` float NOT NULL default '0',
`files_up_limit` int(10) unsigned NOT NULL default '0',
`files_down_limit` int(10) unsigned NOT NULL default '0',
`files_transfer_limit` int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM COMMENT='Table des quotas ProFTPD';

CREATE TABLE `ftpquotatotal` (
`name` varchar(30) NOT NULL default '',
`quota_type` enum('user','group','class','all') NOT NULL default 'user',
`bytes_up_total` float NOT NULL default '0',
`bytes_down_total` float NOT NULL default '0',
`bytes_transfer_total` float NOT NULL default '0',
`files_up_total` int(10) unsigned NOT NULL default '0',
`files_down_total` int(10) unsigned NOT NULL default '0',
`files_transfer_total` int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM COMMENT='Table des compteurs des quotas ProFTPD';

CREATE TABLE `ftpuser` (
`id` int(10) unsigned NOT NULL auto_increment,
`userid` varchar(32) NOT NULL default '',
`passwd` varchar(32) NOT NULL default '',
`uid` smallint(6) NOT NULL default '5500',
`gid` smallint(6) NOT NULL default '5500',
`homedir` varchar(255) NOT NULL default '',
`shell` varchar(16) NOT NULL default '/bin/false',
`count` int(11) NOT NULL default '0',
`accessed` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`LoginAllowed` enum('true','false') NOT NULL default 'true',
PRIMARY KEY (`id`)
) TYPE=MyISAM COMMENT='Table des utlisateurs ProFTPD'

Editez /etc/proftpd/proftpd.conf pour activer le support MySQL en vérifiant les identifiants de connexion :

# Cryptage
SQLAuthTypes Crypt
SQLAuthenticate users* groups*

# Identifiants de connexion
SQLConnectInfo proftpd@localhost proftpd motdepasse_proftpd

# Colonnes utilisées pour les utilisateurs
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLUserWhereClause "LoginAllowed = 'true'"

# Colonnes utilisées pour les groupes
SQLGroupInfo ftpgroup groupname gid members

# Créer le répertoire home par défaut
CreateHome on

# Mise à jour des compteurs de connexion
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Mise à jour des compteurs de trafic
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# Quota
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

# Requêtes SQL relatives aux quotas

SQLNamedQuery get-quota-limit SELECT "name, quota_type, par_session, limit_type, bytes_up_limit, bytes_down_limit, bytes_transfer_limit, files_up_limit, files_down_limit, files_transfer_limit FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_up_total, bytes_down_total, bytes_transfer_total, files_up_total, files_down_total, files_transfer_total FROM ftpquotatotal WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_up_total = bytes_up_total + %{0}, bytes_down_total = bytes_down_total + %{1}, bytes_transfer_total = bytes_transfer_total + %{2}, files_up_total = files_up_total + %{3}, files_down_total = files_down_total + %{4}, files_transfer_total = files_transfer_total + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatotal

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatotal

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally;

Redémarrez le service :

/etc/init.d/proftpd restart

La gestion des utilisateurs dans ces tables étant relativement explicite d'après leur structure, celle-ci ne sera pas développée pour le moment. Reportez-vous à la Documentation Ubuntu Francophone si nécessaire.

Ajoutez un enregistrement dans la table ftpuser pour chaque utilisateur, le mot de passe étant encrypté par la fonction mysql ENCRYPT. Ajoutez un enregistrement dans la table ftpgroup pour chaque groupe. Le champ members contenant les logins (en texte) des membres de ce groupe.