Ceci est une ancienne révision du document !


Proftpd

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.

Utilisé pour le Projet Bender.

Principaux avantages

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 :

  • Contrôle fin des partages et des droits
  • Support des authentification externe (LDAP, SQL, …)
  • Support du FTPS
  • limitation d'accès via chroot
  • support des quotas

Installation

Pour l'installation sous Debian testing, il suffit d'ajouter les packages :

  • proftpd-basic

:!: ne pas installer le paquet “proftpd” utilisé en lenny.

Lors de l'installation, il est possible de choisir le type d'exécution :

  • Indépendamment : fonctionne en permanence sous forme de service
  • Depuis inetd : démarré à la demande lorsque quelqu'un se connecte sur le port 21

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 :

  • proftpd-doc : documentation
  • proftpd-mod-ldap : authentification LDAP
  • proftpd-mod-mysql : authentification MySQL
  • proftpd-mod-pgsql : authentification PostgreSQL
  • proftpd-mod-odbc : authentification ODBC
  • proftpd-mod-sqlite : authentification SQLite

Structure de configuration

La version actuelle de Proftpd en testing utilise plusieurs fichiers séparés :

  • proftpd.conf : fichier de configuration principal, faisant référence à d'autres fichiers pour certaines parties
  • modules.conf : choix des modules actifs
  • ldap.conf : configuration spécifique pour le ldap
  • tls.conf : configuration spécifique pour le FTPS

Configuration générale

Après une installation standard, voici quelques paramètres à modifier dans /etc/proftpd/proftpd.conf

  • modifier le nom du serveur :
ServerName                      "ftp.bouthors.fr"
  • pour autoriser les utilisateurs à reprendre un upload interrompu, ajouter la commande :
AllowStoreRestart               on
  • pour activer le FXP, ajouter la commande :
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.

  • limiter les utilisateurs à leur répertoire home via chroot (augmente la sécurité de manière importante) :
DefaultRoot                     ~

Si vous souhaitez toutefois donner accès à d'autres répertoires, voir monter_des_repertoires_vituels.

  • si vous utilisez iptables, fixer les ports passifs à autoriser et les ajouter à iptables, par exemple :
PassivePorts                  55000 56000

Configuration des droits d'accès

Voici quelques paramètres utiles pour le contrôle d'accès :

  • définir les droits sur les fichiers et répertoires uploadés :
Umask                           006  007

Cet exemple définit rw- rw- — pour les fichier et rwx rwx — pour les répertoires.

  • HideGroup permet de cacher les fichiers/répertoires en fonction de leur groupe. Cela est notamment utile pour cacher “lost+found”.
<Directory /ftp>
        Hidegroup                       root
</Directory>
  • HideNoAccess permet de cacher les fichiers/répertoires auxquels l'utilisateur n'a pas accès
<Directory />
        HideNoAccess                    on
</Directory>
  • IgnoreHidden permet de considérer les fichiers inaccessibles comme innexistants. Le message d'erreur est donc “fichier introuvable” plutôt que “accès interdit”. Utilisable uniquement dans un <Limit>.
<Directory /ftp>
<Limit ALL>
        IgnoreHidden                    on
</Limit>
</Directory>

Activation du FTPS

L'activation du FTPS est relativement facile :

  • générer un certificat SSL autosigné (pour plus de détails voir OpenSSL) :
/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#
  • editier /etc/proftpd/proftpd.conf et décommenter la ligne :
Include /etc/proftpd/tls.conf
  • dans /etc/proftpd/tls.conf, décommenter les lignes :
TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             SSLv23
TLSVerifyClient                         off
  • toujours dans /etc/proftpd/tls.conf, indiquer les fichiers de clef et de certificat :
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.

Authentification LDAP

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

Installation

Pour pouvoir utiliser l'authentification LDAP, installer le paquet proftpd-mod-ldap.

Activation de le LDAP

Dans /etc/proftpd/modules.conf, décommenter :

LoadModule mod_ldap.c

Dans /etc/proftpd/proftpd.conf, décommenter :

Include /etc/proftpd/ldap.conf

Configuration

Dans /etc/proftpd/proftpd.conf, effectuer la configuration suivante :

  • AuthOrder active et définit l'ordre les authentifications.
AuthOrder                       mod_ldap.c
  • Pour désactiver le PAM (qui permet d'utiliser l'authentification classique du Linux), ajouter l'option suivante :
AuthPAM                         off
  • Si vous utilisez des shells invalides, désactiver la validation du shell pour le FTP en décommentant :
RequireValidShell               off

Dans /etc/proftpd/ldap.conf, effectuer la configuration suivante :

  • Nom/IP du serveur ldap avec LDAPServer :

LDAPServer ldap://localhost

  • Identifiant de connexion au serveur LDAP avec LDAPDNInfo

LDAPDNInfo “cn=proftpd,ou=services,dc=bouthors,dc=fr” “*” * Activation de l'authentification et définition du filtre de recherche des utilisateurs avec LDAPDoAuth : LDAPDoAuth on “dc=bouthors, dc=fr” ”(&(cn=%v)(objectclass=person))” === LDAPAttr === Pour personnaliser les attributs utilisés dans l'annuaire, utilisez LDAPAttr : LDAPAttr uid cn Remarque : LDAPAttr dois être positionné avant les LDAPDO* === LDAPAuthBinds === Pour indiquer à proftpd de valider l'utilisateur avec un BIND plutôt que par lecture de son mot de passe, il est important d'ajouter : LDAPAuthBinds on === LDAPDoGIDLookups === Activation de la recherche des groupes et définition du filtre de recherche des groupes : 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 genè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.
Remarque : 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. ==== Configuration des restrictions ==== En utilisant les directives Directory et Limit, il est possible de limiter les accès au serveur FTP. Voici un exemple simple qui limite l'accès au serveur FTP aux seuls membres du groupe “ftp” : <file> <Directory /> <Limit ALL> AllowGroup ftp DenyAll </Limit> </Directory> </file> ==== Exemple de configuration ==== <file> RequireValidShell off AuthPAM off AuthOrder mod_ldap.c LDAPServer “localhost:389” LDAPDNInfo “cn=proftpd,ou=services,dc=bouthors,dc=fr” “
” LDAPAuthBinds on 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))” <Directory /> <Limit ALL> AllowGroup ftp DenyAll IgnoreHidden on </Limit> HideNoAccess on </Directory> <Directory /ftp/upload> Umask 006 007 </Directory> </file> ===== Authentification SQL ===== 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. ==== Installation ==== Afin d'activer le support de mysql, il faut ajouter le paquet : * proftpd-mysql Concernant la création des utilisateurs, voir Utiliser une base sql pour l'authentification. ==== Configuration ==== === RequireValidShell === Si vous utilisez des shells invalides pour vos utilisateurs ftp (pour éviter qu'ils se loguent), désactivez la validation du shell : RequireValidShell off === AuthPAM === Pour désactiver le PAM (qui permet d'utiliser l'authentification classique du Linux), utilisez l'option suivante : AuthPAM off === AuthOrder === AuthOrder active et définit l'ordre les authentifications. 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. === SQLConnectInfo === SQLConnectInfo définit la connexion SQL : le serveur, la base de données, l'utilisateur et son mot de passe. SQLConnectInfo users@localhost proftpd *password* === SQLUserInfo === SQLUserInfo définit la table qui contient les utilisateurs : - le nom de la table - la colonne des utilisateurs - la colonne des mots de passe - la colonne des UID - la colonne des GID - la colonne des répertoires utilisateurs - la colonne des shells+ SQLUserInfo auth username password uid gid homedir shell === SQLAuthTypes === SQLAuthTypes définit le type de cryptage utilisé pour les mots de passe : SQLAuthTypes Crypt === SQLAuthenticate === SQLAuthenticate définit comment le mod SQL doit authentifier : 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 === SQLNamedQuery permet de définir des requêtes SQL utilisée par les options ci-après : 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. === SQLLog === SQLLog permet d'exécuter une requête SQL en fonction des actions de l'utilisateur : Par exemple, l'option suivante exécute la requête updatecount lorsque l'utilisateur se connecte : SQLLog PASS updatecount === SQLShowInfo === SQLShowInfo permet d'afficher des informations à l'utilisateur en utilisant un requête SQL. 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 === SQLMinID définit les valeurs par défaut pour UID et GID : SQLMinID 499 === SQLDefaultUID === SQLDefaultUID définit la valeur par défaut de UID : SQLDefaultUID 500 === SQLDefaultGID === SQLDefaultGID définit la valeur par défaut de GID : SQLDefaultGID 500 === SQLDefaultHomedir === SQLDefaultHomedir définit le répertoire home par défaut : SQLDefaultHomedir /ftp ==== Exemple de configuration complète ==== Fichier /etc/proftpd.conf <file> # # /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> </file>

Personnalisations diverses

Voici quelques éléments supplémentaires propres au serveur Projet Bender.

Message d'accueil

Optionnellement vous pouvez modifier le message d'accueil /ftp/welcome.msg :

Bienvenue %U@%R !

Date : %T

Descriptif du serveur :
- Liaison 9online 1024 (download : 1024kbits/s, upload : 256kbits/s)
- Processeur Athlon 700
- Ram 512Mo
- Disques (540Go)

Bonne journée ;-)

Script de maintenance

La gestion d'un ftp nécessite quelques opérations de maintenance, en particulier pour réaliser les “petits plus” décrits en objectif :

  • création du fichier index
  • création du fichier history
  • création du SFV
  • remise à zéro des propriétaires et droits des fichiers en lecture :
valeur droits
utilisateur admin 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 : 13/09/07

# Traitement sur tous les répertoires
for rep in /ftp/Appz /ftp/BD /ftp/Series-Animes /ftp/Games /ftp/MP3 /ftp/Video /ftp/OnDemand
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

Rotation des logs

La rotation des logs est gérée par /etc/cron.monthly/proftpd, qui contient par défaut :

#!/bin/sh
#
# cron script to rotate the proftpd server logfile, based on the
# wu-ftpd script by Peter Tobias <tobias@et-inf.fho-emden.de>.

[ -x /usr/sbin/ftpstats ] || exit 0

cd /var/log/proftpd
savelog -q -u root -g adm -m 640 -c 12 /var/log/proftpd/xferreport
ftpstats -a -r -l 2 -d 2>/dev/null >/var/log/proftpd/xferreport
savelog -q -u root -g adm -m 640 -c 7 /var/log/proftpd/xferlog
savelog -q -u root -g adm -m 640 -c 7 /var/log/proftpd/proftpd.log
savelog -q -u root -g adm -m 640 -c 7 /var/log/proftpd/controls.log

Pour conserver les logs 1 an, il suffit de modifier la ligne

savelog -q -u root -g adm -m 640 -c 12 /var/log/proftpd/xferlog

Backup

  • /etc/proftpd.conf
  • /etc/cron.monthly/proftpd
  • /home/scripts/ftp/maintenance_ftp
  • /ftp/welcome.msg
  • le répertoire du ftp

Links

linux/proftpd.1248212283.txt.gz · Dernière modification: 2009/07/21 23:38 par matthieu
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki