Proftpd est un serveur FTP offrant de nombreuses fonctions. Ci dessous est expliquée l'intallation d'un FTP utilisant une authentification LDAP ou Mysql.
Il existe de nombreux serveur FTP sous Linux, l'intérêt de Proftpd réside dans ses fonctionnalités et ses modules complémentaires :
Pour l'installation sous Debian testing, il suffit d'ajouter les packages :
ne pas installer le paquet “proftpd” utilisé en lenny.
Lors de l'installation, il est possible de choisir le type d'exécution :
L'exécution depuis inetd est conseillée pour les serveurs recevant peu de connexion afin de minimiser les ressources utilisée.
L'exécution indépendante est plus efficace lorsque le serveur reçoit plusieurs connexions.
Personnellement j'utilise le mode “Indépendant”.
En option, installer les modules suivants :
La version actuelle de Proftpd en testing utilise plusieurs fichiers séparés :
Après une installation standard, voici quelques paramètres à modifier dans /etc/proftpd/proftpd.conf
ServerName "ftp.bouthors.fr"
AllowStoreRestart on
AllowForeignAddress on
Cette commande autorise une IP différente pour le canal Data et le canal Commande. Attention, cela est un risque de sécurité et peut également être bloqué par les firewalls.
DefaultRoot ~
Si vous souhaitez toutefois donner accès à d'autres répertoires, voir monter_des_repertoires_vituels.
PassivePorts 55000 56000
Voici quelques paramètres utiles pour le contrôle d'accès :
Umask 006 007
Cet exemple définit rw- rw- — pour les fichier et rwx rwx — pour les répertoires.
<Directory /ftp> Hidegroup root </Directory>
<Directory /> HideNoAccess on </Directory>
<Directory /ftp> <Limit ALL> IgnoreHidden on </Limit> </Directory>
L'activation du FTPS est relativement facile :
/etc/proftpd# openssl genrsa -out ftp.bouthors.fr.key 1024 Generating RSA private key, 1024 bit long modulus .................................................................++++++ ........................................++++++ e is 65537 (0x10001) /etc/proftpd# openssl req -new -x509 -days 365 -key ftp.bouthors.fr.key -out ftp.bouthors.fr.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:France Locality Name (eg, city) []:St Cyr Organization Name (eg, company) [Internet Widgits Pty Ltd]:Matthieu Bouthors Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:ftp.bouthors.fr Email Address []:matthieu@bouthors.fr /etc/proftpd# /etc/proftpd# chmod og-r ftp.bouthors.fr.* /etc/proftpd#
Include /etc/proftpd/tls.conf
TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23
TLSVerifyClient off
TLSRSACertificateFile /etc/proftpd/ftp.bouthors.fr.crt TLSRSACertificateKeyFile /etc/proftpd/ftp.bouthors.fr.key
Attention : il faut autoriser les ports passifs dans iptables pour autoriser les connexions FTPS. Je vous conseille de désactiver iptables pour les premiers tests de connexion.
Pour un exemple de configuration de client ftp en ftps, voir FileZilla.
Un mise à jour récente provoque un blocage de la négociation TLS.
Message d'erreur : mod_tls/2.2.2: client-initiated session renegotiation detected, aborting connection
Solution : ajouter l'option “TLSOptions AllowClientRenegotiations”
Plus d'info : http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=558597
Le module mod_ldap permet d'authentifier les utilisateurs dans un annuaire.
Pour l'installation d'un annuaire LDAP, ainsi que le schéma utilisé, voir OpenLDAP.
Cet exemple consiste à utiliser l'authentification LDAP uniquement (désactivation de l'authentification du système Linux).
Pour pouvoir utiliser l'authentification LDAP, installer le paquet proftpd-mod-ldap.
Dans /etc/proftpd/modules.conf, décommenter :
LoadModule mod_ldap.c
Dans /etc/proftpd/proftpd.conf, décommenter :
Include /etc/proftpd/ldap.conf
Dans /etc/proftpd/proftpd.conf, effectuer la configuration suivante :
AuthOrder mod_ldap.c
AuthPAM off
RequireValidShell off
Dans /etc/proftpd/ldap.conf, effectuer la configuration suivante :
LDAPServer localhost:389
LDAPDNInfo "cn=proftpd,ou=services,dc=bouthors,dc=fr" "***"
LDAPAttr uid cn
LDAPDoAuth on "dc=bouthors, dc=fr" "(&(cn=%v)(objectclass=mboUser))"
LDAPDoGIDLookups on "dc=bouthors, dc=fr" "(&(cn=%u)(objectclass=posixGroup))" "(&(gidNumber=%u)(objectclass=mboGroup))" "(&(uniqueMember=cn=%v,ou=users,dc=bouthors,dc=fr)(objectclass=mboGroup))"
Le GroupLookup de proftpd cherche à identifier le nom du groupe correspondant au GID de l'utilisateur. Pour cela proftpd génère 3 requêtes LDAP paramétrables avec LDAPDoGIDLookups.
La requête ”(&(gidNumber=%u)(objectclass=mboGroup))” retrouve un groupe si l'utilisateur et le groupe ont le même attribut GID.
De plus, dans mon annuaire LDAP, les groupes contiennent la liste des utilisateurs dans le champ multivalué uniqueMember.
La requête ”(&(uniqueMember=cn=%v,ou=users,dc=bouthors,dc=fr)(objectclass=mboGroup))” permet ainsi de détecter les groupes qui contiennent l'utilisateur.
Il n'est pas possible d'utiliser le DN de l'utilisateur dans le GroupLookup, c'est pourquoi tous les utilisateurs doivent être dans la même branche.
Remarques :
En utilisant les directives Directory et Limit, il est possible de limiter les accès au serveur FTP dans /etc/proftpd/proftpd.conf.
Voici un exemple simple qui limite l'accès au serveur FTP aux seuls membres du groupe “ftp” :
<Directory /> <Limit ALL> AllowGroup ftp DenyAll </Limit> </Directory>
proftpd.conf
... RequireValidShell off ... AuthPAM off ... AuthOrder mod_ldap.c <Directory /> <Limit ALL> AllowGroup ftp DenyAll IgnoreHidden on </Limit> HideNoAccess on </Directory> <Directory /ftp/upload> Umask 006 007 </Directory>
ldap.conf
# # Proftpd sample configuration for LDAP authentication. # # (This is not to be used if you prefer a PAM-based SQL authentication) # <IfModule mod_ldap.c> # # This is used for ordinary LDAP connections, with or without TLS # #LDAPServer ldap://ldap.example.com #LDAPDNInfo "cn=admin,dc=example,dc=com" "admin_password" #LDAPDoAuth on "dc=users,dc=example,dc=com" LDAPServer localhost:389 LDAPDNInfo "cn=proftpd,ou=services,dc=bouthors,dc=fr" "***" LDAPAttr uid cn LDAPDoAuth on "dc=bouthors, dc=fr" "(&(cn=%v)(objectclass=mboUser))" LDAPDoGIDLookups on "dc=bouthors, dc=fr" "(&(cn=%u)(objectclass=posixGroup))" "(&(gidNumber=%u)(objectclass=mboGroup))" "(&(uniqueMember=cn=%v,ou=users,dc=bouthors,dc=fr)(objectclass=mboGroup))" # # To be set on only for LDAP/TLS on ordinary port, for LDAP+SSL see below #LDAPUseTLS on # # # This is used for encrypted LDAPS connections # #LDAPServer ldaps://ldap.example.com #LDAPDNInfo "cn=admin,dc=example,dc=com" "admin_password" #LDAPDoAuth on "dc=users,dc=example,dc=com" # </IfModule>
Paragraphe archivé non mis à jour.
Cette partie décrit comment configurer l'authentification SQL. Etant donné que j'utilise actuellement LDAP, il se peut que la configuration différe dans les nouvelles versions.
Afin d'activer le support de mysql, il faut ajouter le paquet :
Concernant la création des utilisateurs, voir Utiliser une base sql pour l'authentification.
Dans /etc/proftpd/modules.conf, décommenter :
LoadModule mod_sql.c
Dans /etc/proftpd/proftpd.conf, décommenter :
Include /etc/proftpd/sql.conf
Dans /etc/proftpd/proftpd.conf, effectuer la configuration suivante :
AuthOrder mod_sql.c mod_auth_unix.c
mod_auth_unix.c est utilisé pour récupérer le nom des groupes ainsi que pour authentifier les utilisateurs du système.
AuthPAM off
RequireValidShell off
Dans /etc/proftpd/sql.conf, effectuer la configuration suivante :
SQLConnectInfo users@localhost proftpd ***password***
SQLUserInfo auth username password uid gid homedir shell
SQLAuthTypes Crypt
SQLAuthenticate users* usersetfast
Dans cet exemple, on demande une authentification uniquement des utilisateurs (sans table de groupe) en indiquant une optimisation des requetes SQL au détriment de la mémoire.
SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" auth SQLNamedQuery count SELECT "count from auth where username='%u'"
Updatecount réalise l'incrémentation du champ “count” de l'utilisateur.
Count renvoie le champ count de l'utilisateur.
Par exemple, l'option suivante exécute la requête updatecount lorsque l'utilisateur se connecte :
SQLLog PASS updatecount
Par exemple, la ligne suivante indique le nombre de connexions de l'utilisateur :
SQLShowInfo PASS "230" "Vous vous êtes logué(e) %{count} fois, %u"
SQLMinID 499
SQLDefaultUID 500
SQLDefaultGID 500
SQLDefaultHomedir /ftp
Archive ! à adapter !
Fichier /etc/proftpd.conf
# # /etc/proftpd.conf -- This is a basic ProFTPD configuration file. # To really apply changes reload proftpd after modifications. # ServerType standalone DeferWelcome off MultilineRFC2228 on DefaultServer on ShowSymlinks on ############################################################# # Personnalisation # Matthieu Bouthors le 11/11/05 # Nom du serveur ServerName "ftp.bouthors.fr" # Désactive le protocole ident IdentLookups off #Pour le FXP AllowForeignAddress on #Pour autoriser la reprise des uploads AllowStoreRestart on #Limiter les utilisateurs à leur home avec chroot DefaultRoot ~ #Désactiver la validation du shell RequireValidShell off #Remplacer l'authentification par une authentification SQL seuleument AuthPAM off AuthOrder mod_sql.c mod_auth_unix.c # Configuration de l'authentification SQL ## Connexion à la base de données SQLConnectInfo users@localhost proftpd ***** ## Format de la table des utilisateurs SQLUserInfo auth username password uid gid homedir shell ## Type de cryptage du mot de passe SQLAuthTypes Crypt ## Définition des requêtes à réaliser, usersetfast optimise cette requete SQLAuthenticate users* usersetfast # Compte les connexions des utilisateurs : incrément du champ count à chaque connexion SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" auth SQLLog PASS updatecount # Affichage du nombre de connexions après l'authentification SQLNamedQuery count SELECT "count from auth where username='%u'" SQLShowInfo PASS "230" "Vous vous êtes logué(e) %{count} fois, %u" # Valeurs par défaut SQLMinID 499 SQLDefaultUID 500 SQLDefaultGID 500 SQLDefaultHomedir /ftp <Directory /ftp> Hidegroup root </Directory> ################################################################## TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayFirstChdir .message ListOptions "-l" DenyFilter \*.*/ # Uncomment this if you are using NIS or LDAP to retrieve passwords: #PersistentPasswd off # Uncomment this if you would use TLS module: #TLSEngine on # Uncomment this if you would use quota module: #Quotas on # Uncomment this if you would use ratio module: #Ratios on # Port 21 is the standard FTP port. Port 21 # 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 nobody 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 Umask 066 077 # Normally, we want files to be overwriteable. AllowOverwrite on # 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. #DelayEngine off # A basic anonymous configuration, no upload directories. # <Anonymous ~ftp> # User ftp # Group nogroup # # We want clients to be able to login with "anonymous" as well as "ftp" # UserAlias anonymous ftp # # Cosmetic changes, all files belongs to ftp user # DirFakeUser on ftp # DirFakeGroup on ftp # # RequireValidShell off # # # Limit the maximum number of anonymous logins # MaxClients 10 # # # We want 'welcome.msg' displayed at login, and '.message' displayed # # in each newly chdired directory. # DisplayLogin welcome.msg # DisplayFirstChdir .message # # # Limit WRITE everywhere in the anonymous chroot # <Directory *> # <Limit WRITE> # DenyAll # </Limit> # </Directory> # # # Uncomment this if you're brave. # # <Directory incoming> # # # Umask 022 is a good standard umask to prevent new files and dirs # # # (second parm) from being group and world writable. # # Umask 022 022 # # <Limit READ WRITE> # # DenyAll # # </Limit> # # <Limit STOR> # # AllowAll # # </Limit> # # </Directory> # # </Anonymous>
Voici quelques éléments supplémentaires propres au serveur Projet Bender.
Optionnellement vous pouvez modifier le message d'accueil /ftp/welcome.msg :
Bienvenue %U@%R ! Date : %T Bonne journée ;-)
Voici un script qui réalise les taches suivantes :
valeur | droits | |
---|---|---|
utilisateur | matthieu | r w X |
groupe | ftp | r - X |
autre | - - - |
Pour cela j'ai fait un script /home/scripts/maintenance_ftp démarré tous les matins :
#!/bin/sh # # Script de maintenance FTP # # Matthieu Bouthors # MAJ : 20/07/09 # Traitement sur tous les répertoires for rep in /ftp/dir1 /ftp/dir2 /ftp/dir3 do #Supprime les SFV de la racine rm -f $rep/*.sfv #Crée un historique (trié par ordre de création) find $rep -type d > $rep/history #Crée un index (trié par nom) find $rep -type d | sort > $rep/index #Crée le nouveau SFV cfv -p $rep -C > /dev/null #Force le propriétaire /bin/chown -R matthieu:ftp $rep #Force les droits /bin/chmod -R u=rwX,g=rX,o= $rep done
pour lancer le script, il suffit de l'ajouter au répertoire /etc/cron.daily :
# cd /etc/cron.daily # ln -s /home/scripts/maintenance_ftp
La rotation des logs est gérée par /etc/logrotate.de/proftpd-basic, qui contient par défaut :
/var/log/proftpd/proftpd.log /var/log/proftpd/controls.log /var/log/proftpd/xferlog /var/log/proftpd/xferreport { weekly missingok rotate 7 compress delaycompress notifempty create 640 root adm sharedscripts postrotate # reload could be not sufficient for all logs, a restart is safer invoke-rc.d proftpd restart 2>/dev/null >/dev/null || true endscript }
Pour conserver les logs 1 an, il suffit de modifier la ligne rotate :
rotate 12
Pour mettre proftpd en mode debug, lancer le en ligne de commande ainsi :
proftpd -nd6