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.

:!: 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

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 l'authentification 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 localhost:389
  • Identifiant de connexion au serveur LDAP avec LDAPDNInfo
LDAPDNInfo "cn=proftpd,ou=services,dc=bouthors,dc=fr" "***"
  • (optionnel) Pour personnaliser les attributs utilisés dans l'annuaire, utiliser LDAPAttr :
LDAPAttr                        uid cn
  • Activation de l'authentification et définition du filtre de recherche des utilisateurs avec LDAPDoAuth :
LDAPDoAuth on "dc=bouthors, dc=fr" "(&(cn=%v)(objectclass=mboUser))"
  • (optionnel) 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 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 :

  • une configuration LDAPServer de type ldap://localhost a un impact sur le scope de recherche
  • pour les anciennes version de mod-ldap il faut ajouter LDAPAuthBinds on

Configuration des restrictions

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>

Exemple de configuration

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>

Authentification SQL

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

Installation

Afin d'activer le support de mysql, il faut ajouter le paquet :

  • proftpd-mod-mysql

Concernant la création des utilisateurs, voir Utiliser une base sql pour l'authentification.

Activation de l'authentification SQL

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

LoadModule mod_sql.c

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

Include /etc/proftpd/sql.conf

Configuration

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

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

  • 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/sql.conf, effectuer la configuration suivante :

  • 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 définit la table qui contient les utilisateurs :
    1. le nom de la table
    2. la colonne des utilisateurs
    3. la colonne des mots de passe
    4. la colonne des UID
    5. la colonne des GID
    6. la colonne des répertoires utilisateurs
    7. la colonne des shells+
SQLUserInfo                     auth username password uid gid homedir shell
  • SQLAuthTypes définit le type de cryptage utilisé pour les mots de passe :
SQLAuthTypes                    Crypt
  • 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 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 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 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 définit les valeurs par défaut pour UID et GID :
SQLMinID                        499
  • SQLDefaultUID définit la valeur par défaut de UID :
SQLDefaultUID                   500
  • SQLDefaultGID définit la valeur par défaut de GID :
SQLDefaultGID                   500
  • SQLDefaultHomedir définit le répertoire home par défaut :
SQLDefaultHomedir               /ftp

Exemple de configuration complète

:!: 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>

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

Bonne journée ;-)

Script de maintenance

Voici un script qui réalise les taches suivantes :

  • création d'un fichier index
  • création d'un fichier history
  • création d'un SFV
  • remise à zéro des propriétaires et droits des fichiers en lecture :
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

Rotation des logs

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

Debug

Pour mettre proftpd en mode debug, lancer le en ligne de commande ainsi :

proftpd -nd6

Backup

  • /etc/proftpd/
  • /etc/logrotate.d/proftpd
  • /home/scripts/maintenance_ftp
  • /ftp/welcome.msg
  • /var/log/proftpd
  • le répertoire du ftp

Links

linux/proftpd.1262194681.txt.gz · Dernière modification: 2009/12/30 18:38 par matthieu
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki