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.
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.