{{tag>fr fr:linux fr:serveur fr:transfert_de_fichier}} ====== 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. ===== 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 [[linux:config:mount#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". Hidegroup root * HideNoAccess permet de cacher les fichiers/répertoires auxquels l'utilisateur n'a pas accès HideNoAccess on * 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 . IgnoreHidden on ===== 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 [[desktop: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" : AllowGroup ftp DenyAll ==== Exemple de configuration ==== **proftpd.conf** ... RequireValidShell off ... AuthPAM off ... AuthOrder mod_ldap.c AllowGroup ftp DenyAll IgnoreHidden on HideNoAccess on Umask 006 007 **ldap.conf** # # Proftpd sample configuration for LDAP authentication. # # (This is not to be used if you prefer a PAM-based SQL authentication) # # # 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" # ===== 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 [[authent_sql|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 : - 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 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 Hidegroup root ################################################################## 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. # # 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 # # # DenyAll # # # # # Uncomment this if you're brave. # # # # # Umask 022 is a good standard umask to prevent new files and dirs # # # (second parm) from being group and world writable. # # Umask 022 022 # # # # DenyAll # # # # # # AllowAll # # # # # # ===== Personnalisations diverses ===== Voici quelques éléments supplémentaires propres au serveur [[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 ===== * [[mysql]] * [[openldap]] * http://www.proftpd.org/ * http://www.proftpd.org/docs/directives/linked/by-name.html * http://www.proftpd.org/docs/directives/linked/config_ref_mod_ldap.html * http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-SQL.html * http://www.castaglia.org/proftpd/modules/mod_sql.html