Installation de Proftpd avec base de données Mysql + TLS et gestion des users virtuel à l'aide de proftpdadmin
Proftpd + Mysql + TLS + proftpdadmin
je ne réinvente pas la roue. Ce tuto est dérivé de plusieurs tutos existants. J'ai grandement modifié le proftpd.conf pour avoir la meilleure protection possible.
on commence par installer les paquets utiles
apt-get install proftpd-basic proftpd-mod-mysql
Une fois les paquets installés, passez à l'installation des tables MySql
root@bougnat:# mysql -u root -pmon-mot-de-passe
.....
mysql> CREATE DATABASE proftpd;
....
mysql> USE proftpd;
.....
mysql> 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';
......
mysql> 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';
......
mysql> 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';
......
mysql> 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'
......
Création d'un nouvel utilisateur possédant seulement les droits de lire les données de la base proftpd. Remplacer "password" par votre mot de passe perso
mysql> GRANT USAGE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
.....
mysql> FLUSH PRIVILEGES;
.....
mysql> exit;
Gestion des quotas
Pour activer les quotas, ouvrez le fichier /etc/proftpd/modules.conf et dé-commenter la ligne correspondant à leur gestion.
LoadModule mod_quotatab_sql.c
La table ftpquotalimits contient la description des quotas.
La table ftpquotatotal contient les statistiques d'utilisation correspondant aux règles des quotas défini dans la table ftpquotalimits.
Pour définir un quota, exécuter la requête suivante en renseignant les champs selon votre bon vouloir
INSERT INTO `ftpquotalimits` ( `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` )
VALUES ( 'NOM' , 'TYPE', 'SESSION', 'LIMIT_TYPE', 'B_UP', 'B_DOWN', 'B_TRANS', 'F_UP', 'F_DOWN', 'F_TRANS');
NOM : Nom de l'utilisateur, du groupe ou de la règle selon la valeur de TYPE.
TYPE : user si le quota s'applique à un utilisateur, group à un groupe, class à une classe (ici inutile), all à tous les utilisateurs.
SESSION : true si les quotas doivent être remis à zéro à chaque nouvelle session, false sinon. ('false' est conseillé).
LIMIT_TYPE : soft pour une mesure logicielle de la taille, hard pour une mesure hardware.
B_UP : Taille (en Mbytes) autorisé à être transférée sur le serveur.
B_DOWN : Taille (en Mbytes) autorisé à être téléchargée à partir du serveur.
B_TRANS : Taille (en Mbytes) autorisé à transférée sur et à partir du serveur (upload+download).
F_UP : Nombre de fichiers autorisés à être transférés sur le serveur.
F_DOWN : Nombre de fichiers autorisés à être téléchargés à partir du serveur.
F_TRANS : Nombre de fichiers autorisés à transférés sur et à partir du serveur (upload+download).
Pour définir un quota illimité à un des champs, mettez une valeur négative ou nulle.
ATTENTION : Les quotas de type all, class ou group ne définissent pas un quota pour chaque utilisateur mais un quota partagé pour tous les utilisateurs concernés par cette règle.
Pour réinitialiser les quotas, il suffit de supprimer l'entrée correspondante à la règle devant être réinitialisée. Par exemple si on veut effacer les règles de quota de l'utilisateur test, on exécute la requête SQL suivante :
DELETE FROM `ftpquotatotal` WHERE `name`='test';
Pour réinitialiser tous les quotas, par exemple tous les mois, faites une tâche cron se connectant sur le serveur et exécutant la requête suivante :
TRUNCATE TABLE `ftpquotatotal`;
Le gros du morceau : proftpd.conf
commencer par faire une sauvegarde du fichier d'origine
root@bougnat:# cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.sos
et ouvrez le fichier. Les commentaires sont dans le fichier de conf
root@bougnat:# vi /etc/proftpd/proftpd.conf
- /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
- To really apply changes reload proftpd after modifications.
- Includes DSO modules
Include /etc/proftpd/modules.conf
- Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6 off
- If set on you can experience a longer connection delay in many cases.
IdentLookups off
ServerName "Charbon Ltd"
ServerType standalone
ServerIdent on "Serveur FTP de Charbon Ltd."
DeferWelcome off
MultilineRFC2228 on
DefaultServer on
- on cache les liens symboliques
ShowSymlinks off
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
DisplayLogin welcome.msg
DisplayChdir .message true
- On limite le nombre de tentatives de login à 3.
MaxLoginAttempts 3
- nombre de connections par client
MaxClientsPerHost 3
- nombres de clients max
MaxClients 10
- TRES IMPORTANT : permettra de cacher les fichiers cachés :o)
- ListOptions "-l"
ListOptions "" strict
DenyFilter \*.*/
- On chroot tous les users dans leur home
DefaultRoot ~
- On désactive le login root
RootLogin off
- directive qui n'affiche pas les fichiers cachés
<Directory />
HideFiles ^\..*
<Limit ALL>
IgnoreHidden On
</Limit>
</Directory>
- Pas de shell pour les users
RequireValidShell off
- Port 21 is the standard FTP port.
Port 210
- In some cases you have to specify passive ports range to by-pass
- firewall limitations. Ephemeral ports can be used for that, but
- feel free to use a more narrow range.
PassivePorts 53000 54000
- If your host was NATted, this option is useful in order to
- allow passive tranfers to work. You have to use your public
- address and opening the passive ports used on your firewall as well.
- MasqueradeAddress www.mondomaine.fr
- This is useful for masquerading address with dynamic IPs:
- refresh any configured MasqueradeAddress directives every 8 hours
<IfModule mod_dynmasq.c>
- DynMasqRefresh 28800
</IfModule>
- To prevent DoS attacks, set the maximum number of child processes
- to 30. If you need to allow more than 30 concurrent connections
- at once, simply increase this value. Note that this ONLY works
- in standalone mode, in inetd mode you should use an inetd server
- that allows you to limit maximum number of processes per service
- (such as xinetd)
MaxInstances 30
- Set the user and group that the server normally runs at.
User proftpd
Group nogroup
- Umask 022 is a good standard umask to prevent new files and dirs
- (second parm) from being group and world writable.
Umask 022 022
- Normally, we want files to be overwriteable.
AllowOverwrite on
- Autorise la reprise des téléchargements.
AllowRetrieveRestart on
- Autorise les clients à reprendre les Uploads vers vous.
AllowStoreRestart on
- Autorise seulement les noms de fichiers normaux (caractères alphanumérique)
PathAllowFilter "[a-zA-Z0-9]"
- Refuse l'upload de fichiers .ftpaccess ou .htaccess
PathDenyFilter "(\.ftp)|(\.hta)[a-z]+$"
- N'autorise pas de passer des printf-Formats.
AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
DenyFilter "%"
- Récupère l'ip de la machine de l'utilisateur
IdentLookups on
- Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
- PersistentPasswd off
- This is required to use both PAM-based authentication and local passwords
- AuthOrder mod_auth_pam.c* mod_auth_unix.c
- Be warned: use of this directive impacts CPU average load!
- Uncomment this if you like to see progress and transfer rate with ftpwho
- in downloads. That is not needed for uploads rates.
- UseSendFile off
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
- pour la gestions des users
<IfModule mod_sql.c>
SQLBackend mysql
</IfModule>
<IfModule mod_quotatab.c>
QuotaEngine on
</IfModule>
<IfModule mod_ratio.c>
Ratios off
</IfModule>
- Delay engine reduces impact of the so-called Timing Attack described in
- http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
- It is on by default.
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine on
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
AdminControlsEngine on
</IfModule>
- Alternative authentication frameworks
- Include /etc/proftpd/ldap.conf
- Include /etc/proftpd/sql.conf
- This is used for FTPS connections
Include /etc/proftpd/tls.conf
- Useful to keep VirtualHost/VirtualRoot directives separated
- Include /etc/proftpd/virtuals.conf
- Mod MySQL
- =========
- Les mots de passe sont cryptés dans la base avec la fonction ENCRYPT (MySQL)
SQLAuthTypes Crypt
SQLAuthenticate users* groups*
- Modifiez cette ligne selon l'utilisateur et le mot de passe defini plus tôt
SQLConnectInfo proftpd@localhost proftpd mon-mot-de-passe
- On donne à ProFTPd le nom des colonnes de la table usertable
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLUserWhereClause "LoginAllowed = 'true'"
- On donne à ProFTPd le nom des colonnes de la table "grouptable"
SQLGroupInfo ftpgroup groupname gid members
- Création automatique du répertoire de l'utilisateur si il n'existe pas
CreateHome on
- Met à jour les compteurs à chaque connection d'un utilisateur
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
- Met à jour les compteurs à chaque upload ou download d'un utilisateur
SQLLog STOR,RETR modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
- Mod quota
- =========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
- Définit les requetes SQL pour que ProFTPd récupère les infos sur les 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
- Gestion des logs
- ================
- Enregistre les requêtes SQL dans /var/log/proftpd/mysql.log
SQLLogFile /var/log/proftpd/mysql.log
- Enregistre les authentifications
LogFormat auth "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/auth.log AUTH auth
- Enregistre les accès aux fichiers
LogFormat write "%h %l %u %t \"%r\" %s %b"
ExtendedLog /var/log/proftpd/access.log WRITE,READ write
Installation & configuration de proftpdadmin
positionnez-vous dans /var/www
et prenez le paquet modifié de proftpadmin. Car celui d'origine a quelques petits problèmes avec le TLS
on trouvera le paquet modifié à l'adresse ci-dessous
http://www.rt74.eu/public/dl/proftpdadmin.tar.gz
lancer les commandes suivantes:
root@bougnat:# wget -c http://www.rt74.eu/public/dl/proftpdadmin.tar.gz
root@bougnat:# gunzip *.gz
root@bougnat:# tar xvf *.tar
root@bougnat:# chown -R www-data.www-data proftpdadmin
Création du virtualhost
root@bougnat:# vi /etc/apache2/sites-available/proftpdadmin.conf
insérez les lignes suivantes dedans
Alias /ftpadmin "/var/www/proftpdadmin"
<VirtualHost *:80>
ServerName proftpdadmin
ServerAlias ftpadmin
ServerAdmin webmaster@mondomaine.fr
DocumentRoot /var/www/proftpdadmin
<Directory /var/www/proftpdadmin>
Options +FollowSymLinks
AllowOverride All
order allow,deny
allow from all
</Directory>
- protection du repertoir config/
<Directory /var/www/proftpdadmin/config>
Options -FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
relancer apache : root@bougnat:# apachectl restart
vérifiez l'accessibilité à votre site
http://mondomaine.fr/ftpadmin/ ou http://mon-IP/ftpadmin/
Sécurisons, un peu tout ça
dans un premier temps, occupons nous de l'accés. Comme on peut le voir l'accés se fait en direct et en http:// .Pour éviter que des petits malins impose leur compte, nous allons restreindre l'accès, en forcant l'admin à entrer un couple login/password.
mettez-vous à la racine du compte proftpdadmin et créez le fichier .htaccess
root@bougnat:# vi /var/www/proftpdadmin/.htaccess
et inscrivez dedans les lignes suivantes
AuthName "Acces prive"
AuthType Basic
AuthUserFile "/var/www/proftpdadmin/.htpasswd"
AuthGroupFile /dev/null
<Limit GET POST>
order deny,allow
require valid-user
</Limit>
<IfModule mod_rewrite.c>
<IfModule mod_ssl.c>
RewriteEngine on
RewriteCond %{HTTPS} !^on$ [NC]
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
RewriteRule (.*) https://www.mondomaine.fr/ftpadmin/ [L]
</IfModule>
</IfModule>
La 1ér partie, concerne l'accès privé
La 2ème partie, concerne la redirection en https
Une fois terminé, il va falloir autoriser un user à accéder à la gestion du ftp pour cela on va créer le fichier .htpasswd qui contiendra le couple login/password
pour les fainéants nous avons : http://www.websiteout.fr/htpasswd.php ou pire http://www.clockwatchers.com/htaccess_tool.html
et pour les puristes tapez la commande ci-dessous et répondez aux questions
root@bougnat:# htpasswd -c /var/www/proftpdadmin/.htpasswd le-user-autorisé
relancer apache : root@bougnat:# apachectl restart
revérifiez l'accessibilité à votre site
un login/password vous sera demandé et vous êtes en https:// et non plus en http://
Connectons nous
Pour vous connectez avec filezilla ou tout autre client ftp utilisez pour le chiffrement
connecxion FT EXPLICITE sur TLS
Vérifions
Statut : Connexion à 192.168.1.2:210...
Statut : Connexion établie, attente du message d'accueil...
Réponse : 220 Serveur FTP de Charbon Ltd.
Commande : AUTH TLS
Réponse : 234 AUTH TLS exécuté avec succès
Statut : Initialisation de TLS...
Statut : Vérification du certificat...
Commande : USER tuto
Statut : Connexion TLS/SSL établie.
Réponse : 331 Mot de passe requis pour tuto
Commande : PASS ***********
Réponse : 230 Utilisateur tuto authentifié
Commande : SYST
Réponse : 215 UNIX Type: L8
Commande : FEAT
Réponse : 211-Features:
Réponse : LANG fr-FR.UTF-8*;fr-FR
Réponse : MDTM
Réponse : MFMT
Réponse : TVFS
Réponse : AUTH TLS
Réponse : UTF8
Réponse : MFF modify;UNIX.group;UNIX.mode;
Réponse : MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
Réponse : PBSZ
Réponse : PROT
Réponse : SITE MKDIR
Réponse : SITE RMDIR
Réponse : SITE UTIME
Réponse : SITE SYMLINK
Réponse : REST STREAM
Réponse : SIZE
Réponse : 211 Fin
Commande : OPTS UTF8 ON
Réponse : 200 UTF-8 activé
Commande : PBSZ 0
Réponse : 200 PBSZ 0 exécuté avec succès
Commande : PROT P
Réponse : 200 Protection set to Private
Statut : Connecté
Statut : Récupération du contenu du dossier...
Commande : PWD
Réponse : 257 "/" est le répertoire courant
Commande : TYPE I
Réponse : 200 Type paramétré à I
Commande : PASV
Réponse : 227 Entering Passive Mode (192,168,1,2,210,201).
Commande : MLSD
Réponse : 150 Ouverture d'une connexion de données en mode ASCII pour MLSD
Réponse : 226 Téléchargement terminé
Statut : Contenu du dossier affiché avec succès