Installation de Proftpd avec base de données Mysql + TLS et gestion des users virtuel à l'aide de proftpdadmin

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

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

  1. /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
  2. To really apply changes reload proftpd after modifications.
  1. Includes DSO modules

Include /etc/proftpd/modules.conf

  1. Set off to disable IPv6 support which is annoying on IPv4 only boxes.

UseIPv6 off

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

  1. on cache les liens symboliques

ShowSymlinks off

TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200

DisplayLogin welcome.msg DisplayChdir .message true

  1. On limite le nombre de tentatives de login à 3.

MaxLoginAttempts 3

  1. nombre de connections par client

MaxClientsPerHost 3

  1. nombres de clients max

MaxClients 10

  1. TRES IMPORTANT : permettra de cacher les fichiers cachés :o)
  2. ListOptions "-l"

ListOptions "" strict

DenyFilter \*.*/

  1. On chroot tous les users dans leur home

DefaultRoot ~

  1. On désactive le login root

RootLogin off

  1. directive qui n'affiche pas les fichiers cachés

<Directory />

 HideFiles ^\..*
 <Limit ALL>
   IgnoreHidden On
 </Limit>

</Directory>

  1. Pas de shell pour les users

RequireValidShell off

  1. Port 21 is the standard FTP port.

Port 210

  1. In some cases you have to specify passive ports range to by-pass
  2. firewall limitations. Ephemeral ports can be used for that, but
  3. feel free to use a more narrow range.

PassivePorts 53000 54000

  1. If your host was NATted, this option is useful in order to
  2. allow passive tranfers to work. You have to use your public
  3. address and opening the passive ports used on your firewall as well.
  4. MasqueradeAddress www.mondomaine.fr
  1. This is useful for masquerading address with dynamic IPs:
  2. refresh any configured MasqueradeAddress directives every 8 hours

<IfModule mod_dynmasq.c>

  1. DynMasqRefresh 28800

</IfModule>

  1. To prevent DoS attacks, set the maximum number of child processes
  2. to 30. If you need to allow more than 30 concurrent connections
  3. at once, simply increase this value. Note that this ONLY works
  4. in standalone mode, in inetd mode you should use an inetd server
  5. that allows you to limit maximum number of processes per service
  6. (such as xinetd)

MaxInstances 30

  1. Set the user and group that the server normally runs at.

User proftpd Group nogroup

  1. Umask 022 is a good standard umask to prevent new files and dirs
  2. (second parm) from being group and world writable.

Umask 022 022

  1. Normally, we want files to be overwriteable.

AllowOverwrite on

  1. Autorise la reprise des téléchargements.

AllowRetrieveRestart on

  1. Autorise les clients à reprendre les Uploads vers vous.

AllowStoreRestart on

  1. Autorise seulement les noms de fichiers normaux (caractères alphanumérique)

PathAllowFilter "[a-zA-Z0-9]"

  1. Refuse l'upload de fichiers .ftpaccess ou .htaccess

PathDenyFilter "(\.ftp)|(\.hta)[a-z]+$"

  1. N'autorise pas de passer des printf-Formats.

AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$" DenyFilter "%"

  1. Récupère l'ip de la machine de l'utilisateur
IdentLookups 			on
  1. Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
  2. PersistentPasswd off
  1. This is required to use both PAM-based authentication and local passwords
  2. AuthOrder mod_auth_pam.c* mod_auth_unix.c
  1. Be warned: use of this directive impacts CPU average load!
  2. Uncomment this if you like to see progress and transfer rate with ftpwho
  3. in downloads. That is not needed for uploads rates.
  4. UseSendFile off

TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log

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


  1. Delay engine reduces impact of the so-called Timing Attack described in
  2. http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
  3. 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>

  1. Alternative authentication frameworks
  2. Include /etc/proftpd/ldap.conf
  3. Include /etc/proftpd/sql.conf
  1. This is used for FTPS connections

Include /etc/proftpd/tls.conf

  1. Useful to keep VirtualHost/VirtualRoot directives separated
  2. Include /etc/proftpd/virtuals.conf
  1. Mod MySQL
  2. =========
  3. Les mots de passe sont cryptés dans la base avec la fonction ENCRYPT (MySQL)

SQLAuthTypes Crypt SQLAuthenticate users* groups*

  1. Modifiez cette ligne selon l'utilisateur et le mot de passe defini plus tôt

SQLConnectInfo proftpd@localhost proftpd mon-mot-de-passe

  1. On donne à ProFTPd le nom des colonnes de la table usertable

SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLUserWhereClause "LoginAllowed = 'true'"

  1. On donne à ProFTPd le nom des colonnes de la table "grouptable"

SQLGroupInfo ftpgroup groupname gid members

  1. Création automatique du répertoire de l'utilisateur si il n'existe pas

CreateHome on

  1. Met à jour les compteurs à chaque connection d'un utilisateur

SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

  1. Met à jour les compteurs à chaque upload ou download d'un utilisateur

SQLLog STOR,RETR modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

  1. Mod quota
  2. =========

QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on

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

  1. Gestion des logs
  2. ================
  3. Enregistre les requêtes SQL dans /var/log/proftpd/mysql.log

SQLLogFile /var/log/proftpd/mysql.log

  1. Enregistre les authentifications

LogFormat auth "%v [%P] %h %t \"%r\" %s" ExtendedLog /var/log/proftpd/auth.log AUTH auth

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