Aller au contenu

Administration réseau sous Linux/ProFTPD

Un livre de Wikilivres.

FTP est un protocole d'échange de fichiers. Un serveur FTP met à disposition certains répertoires du disque, et gère une authentification par mot de passe. On se connecte à ce serveur avec un client FTP.

Ce document présente la configuration d'un serveur ProFTPd sous Debian[1]. Sa gestion des droits d'accès et sa configuration sont faits pour ressembler à celles d'Apache[2].

Installation et lancement

Sous Debian, ProFTPD est disponible dans un package et peut s'installer avec la commande

apt-get install proftpd

Il est aussi possible de le configurer pour ses propres besoins à partir des sources. Ceci permet de spécifier les modules à utiliser.

tar zxvf proftpd-1.x.x.tar.gz
cd proftpd-1.x.x
./configure --with-modules=mod_ratio:mod_sql
make
make installproftpd

Il se lance automatiquement à l'installation et au démarrage du système.

Le script qui permet de le lancer, l'arrêter ou le relancer est /etc/init.d/proftpd.

Fichier de configuration

Le principal fichier de configuration est /etc/proftpd/proftpd.conf.

Logo

Cette configuration n'affecte que le service qui écoute au port mentionné (21 par défaut). Pour affecter d'autres ports (ex : 22 pour SFTP), il est impossible de l'ajouter sur la ligne "Port 21" : voir plus bas.

L'ensemble des directives sont décrites ProFTPD[3]. Les commandes principales sont les suivantes :

ServerName "''nom''"
description = Indique le nom du serveur qui s'affichera sur les clients


AccessGrantMsg "''message''"
description = Message de bienvenue.
commentaires = Le message peut contenir des jokers comme %u (ici le nom de l'utilisateur)
<Limit …>…</Limit>
description = Autorise ou refuse l'utilisation de certaines commandes du protocole FTP.
commentaires =
Par exemple la section suivante n'autorise la commande MKDIR qu'aux utilisateurs foo et bar :

<Limit MKDIR>
  Allow foo bar
  Deny All
</Limit>
ServerType ''type''
description = Détermine la manière dont le serveur reçoit les connexions réseau.
commentaires = 
Si le type est ''standalone'', un processus père sera lancé et écoutera sur le réseau. Si le type est ''inet'', le serveur devra être lancé par inetd (TCP_WRAPPER).
Dans tous les cas il y aura un processus de lancé par connexion FTP.
MaxInstances 30
description = Limite le nombre de processus simultanés autorisés


User nobody
Group nobody
description = indiquent que le serveur doit s'exécuter avec les identifiants de groupe et d'utilisateur nobody
ExtendedLog /var/log/ftp.log
description = spécifie le nom de fichier log
Umask 022
description = précise les droits à '''enlever'''  aux fichiers créés sur FTP. 022 signifie que les droits d'écriture sont enlevés au groupe et à ''others''  pour tout nouveau fichier.
AllowOverwrite on
description = autorise un utilisateur à écraser un fichier qui lui appartient.
UseFtpUsers on
description = active l'utilisation du fichier /etc/ftpusers qui donne la liste des utilisateur n'ayant '''pas'''  accès au serveur ftp.
AllowUser ''liste-d'utilisateurs''
description = à placer dans un contexte <Limit ...>...</Limit> définit qui est autorisé à exécuter la commande du bloc ''Limit'' courant.
DenyUser ''liste-d'utilisateurs''
description = à placer dans un contexte <Limit ...>...</Limit> définit qui n'est pas autorisé à exécuter la commande du bloc Limit courant.
AllowStoreRestart
description = autorise les clients à reprendre les uploads vers le serveur.


DefaultChdir /var/ftp
description = Indique le répertoire par défaut du serveur.
commentaires = Les utilisateurs se trouvent placés dans ce répertoire lors de la connexion.
DefaultRoot /var/ftp
description = déclare ce répertoire comme la racine du système de fichiers.
UserRatio
description = permet la gestion des ratios.
commentaires =
UserRatio ''nom''  2 10 5 4096</code> indique que l'utilisateur ''nom''  a le droit de récupérer 2 fichiers sur le serveur à chaque fois qu'il en déposera un.
On lui octroie pour commencer un crédit de 10 fichiers.
Par ailleurs, pour 1 octet déposé, il pourra recevoir 5 octets et il détient un crédit de 4ko. À la place d'un nom on peut aussi utiliser * qui définit des ratios par défaut.
SaveRatios on
description = sert à préciser que nous souhaitons sauvegarder les crédits de chaque utilisateur entre deux sessions.
RatioFile /ratio/RatioFile
RatioTempFile /ratio/RatioTempFile
description = indiquent les noms de fichiers permettant de sauvegarder des informations sur les ratios des utilisateurs.
FileRatioErrMsg "Vous n'avez pas suffisamment télédéchargé de fichiers"
ByteRatioErrMsg "Vous n'avez pas assez télédéchargé d'octets"
description = indiquent qu'un utilisateur a dépassé son quota par des messages.
<Directory ''répertoire''> … </Directory>
description = Cette section indique les droits sur le répertoire et sur tout ce qu'il contient.
commentaires =
Par exemple :

<Directory /var/ftp/ratio>
  <Limit ALL>
    Deny ALL
  </Limit>
  HideNoAccess on
</Directory>
Ici, nous interdisons toute opération sur le répertoire ratio grace à la section <Limit ALL>.


 
HideNoAccess
description = Cache tous les éléments inaccessibles aux utilisateurs.
<Anonymous ''répertoire''>…</Anonymous>
description = Configure l'accès anonyme
commentaires =
Exemple :

<Anonymous /home/ftp>
  # Après la connexion anonyme, passe sous l'utilisateur/groupe ftp.
  User ftp
  Group ftp

  # Fait correspondre le login "anonymous" au compte unix "ftp"
  UserAlias anonymous ftp

  # Autorise les comptes sans "shell", c'est souvent le cas du compte "ftp"
  RequireValidShell off

  # Interdit l'écriture partout
  <Directory *>
    <Limit WRITE>
      DenyAll
    </Limit>
  </Directory>

  # Autorise l'écriture dans "incoming" mais pas la lecture
  <Directory incoming>
    <Limit READ >
      DenyAll
    </Limit>
    <Limit STOR>
      AllowAll
    </Limit>
  </Directory>
</Anonymous>

Pour que le serveur prenne en compte le nouveau fichier de configuration, il faut recharger le démon avec: /etc/init.d/proftpd restart


Exemple de fichier proftpd.conf:

# This is a basic ProFTPD configuration file (rename it to # ’proftpd.conf’ for
# actual use. It establishes a single server
# It assumes that you have a user/group
# "nobody" for normal operation.
ServerName "ProFTPd Linux Service"
ServerType standalone
DefaultServer on

# Pour autoriser les clients à résumer les téléchargements, très utile.
# Remember to set to off if you have an incoming ftp for upload.
AllowStoreRestart on

# Port 21 is the standard FTP port.
Port 45000

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022

# Limitation de la bande passante en lecture:
RateReadBPS 14000

# To prevent DoS attacks, set the maximum number of child pro cesses
# to 30. If you need to allow more than 30 concurrent connexions
# 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 pro cesses per service
# (such as xinetd)
MaxInstances 30

# Set the user and group that the server normally runs at. User nobody
Group nogroup

# Nombre maximum de clients
# MaxClients 3

# Number of Max Clients per host
# MaxClientsPerHost 1

# Nombre maximums de tentatives de login
MaxLoginAttempts 3

# Message d’accueil après une connexion réussie
AccessGrantMsg "Bienvenue %u chez moi!"

#Pour ne pas donner d’info sur le serveur
DeferWelcome off

#Règles pour limiter les commandes ...
<Limit MKD RNFR RNTO DELE RMD STOR CHMOD SITE CHMOD SITE XCUP WRITE XRMD PWD XPWD>
  DenyAll
</Limit>

<Global>
  DefaultRoot /var/ftp
  AllowOverwrite yes
  MaxClients 3
  MaxClientsPerHost 1
  UseFtpUsers on
  AllowForeignAddress on
  ServerIdent on "ProFTP DuF’s Server Ready"
  AccessGrantMsg "Bienvenue sur le serveur, %u"
</Global>

# Serveur Virtuel pour écriture
<VirtualHost ftp.duf.com>
  ServerName "Mon serveur FTP virtuel numero 1"
  Port 46000
  Maxclients 3
  MaxClientsPerHost 1
  DefaultRoot /var/ftp
  AccessGrantMsg "Bienvenue"
</VirtualHost>

Dans ce fichier on peut rajouter les lignes suivantes :

  # permet à l'utilisateur même si il ne dispose pas d'un shell valide (ex: /bin/false)
  RequireValidShell    off
   
  # Verrouille l'utilisateur dans son répertoire par défaut
  DefaultRoot          ~
  
  # Pour ne pas afficher le nom du serveur FTP et son numéro de version
  ServerIdent          off
  # on peut également afficher une autre chaîne de caractères :
  #ServerIdent          on "Serveur FTP du Creufop"

Accès FTP anonyme

Pour faire un serveur FTP anonyme, il suffit de rajouter les lignes suivantes dans /etc/proftpd/proftpd.conf :

  <Anonymous ~ftp>
     User                               ftp
     Group                              nogroup
     # We want clients to be able to login with "anonymous" as well as "ftp"
     UserAlias                  anonymous 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
     DisplayChdir          .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>

Création d'un utilisateur FTP

Pour créer un utilisateur qui aura uniquement le droit de faire du FTP, on crée l'utilisateur en indiquant comme shell '/bin/false'.

Dans le cas d'un webmaster, l'idéal est de le faire directement atterrir dans le répertoire où est situé le site web qu'il administre. Pour faire ceci, on indique le répertoire contenant le site web comme étant le répertoire de travail de l'utilisateur.

 # adduser --shell /bin/false --home /var/www/site bob

Cacher un dossier / fichier

Pour rendre un dossier invisible un fichier / dossier(ex Maildir), il faut ajouter au proftpd.conf :

 <Directory ~>
     Hidefiles Maildir
 </Directory>

Clients FTP

Pour tester le serveur FTP, il convient à présent d'utiliser un logiciel client FTP, si possible depuis une autre machine pour tenir compte du pare-feu.

Il existe de très nombreux clients FTP. Certains sont en mode graphique comme FileZilla, d'autres en mode texte comme la commande shell ftp.

Commande ftp

Le client le plus simple et le plus répandu est la commande ftp. Elle existe également sous Windows en ligne de commande.

Les commandes disponibles sont décrites dans la page de man. Les principales sont : help, open, ls, get, put...

Les navigateurs internet permettent également de se connecter à un serveur FTP, généralement en lecture seule.

  • Pour une connexion anonyme, on pourra utiliser ftp://serveur/ ou ftp://serveur/chemin.
  • Pour se connecter avec un mot de passe, on utilisera ftp://utilisateur:mot_de_passe@serveur/.

SFTP

Généralement c'est le service SSH qui écoute le port 22. Par exemple sur Ubuntu, OpenSSH configure un SFTP avec la même clé publique que SSH, dans :

vim /etc/ssh/sshd_config

Il utilise ainsi la commande :

/usr/lib/sftp-server

Pour tester s'il fonctionne depuis le serveur, il existe la commande :

sftp localhost

Toutefois, ProFTPD peut également fournir ce service[4].

FTPS

Pour activer le protocole FTPS :

 vim /etc/proftpd/proftpd.conf # Décommenter la ligne "Include /etc/proftpd/tls.conf"
 vim /etc/proftpd/tls.conf     # Ajouter le code ci-dessous
      <IfModule mod_tls.c>
        TLSEngine on
        TLSRSACertificateFile /etc/proftpd/ssl/proftpd-rsa.pem
        TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd-key.pem
      </IfModule>
 /etc/init.d/proftpd restart

Pour plus d'information sur les certificats .pem, voir Apache/HTTPS.

Problèmes connus

Proftpd stocke ses logs dans les fichiers suivants :

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

En voici un extrait :

cat /var/log/proftpd/xferlog
 Wed Feb  6 12:16:12 2008 1 lns-bzn-51f-85-78-78-5.adsl.proxad.net 1129 /home/user1/fichier1.txt a _ i r user1 ftp 0 * c
 Thu Feb  6 15:23:49 2008 1 84-74-216-148.dclient.hispeed.ch 11743 /var/www/index.html a _ i r user2 ftp 0 * c
 Fri Feb  6 23:46:02 2008 1 69.183.30.97.adsl.snet.net 4572542 /home/user2/toto.pdf a _ i r user2 ftp 0 * c
 ...
cat /var/log/proftpd/proftpd.log
 2015-10-08 16:17:44,302 ftp.example.com proftpd[21992] ftp.example.com: ProFTPD killed (signal 15)
 2015-10-08 16:17:44,303 ftp.example.com proftpd[21992] ftp.example.com: ProFTPD 1.3.5 standalone mode SHUTDOWN
 2015-10-08 16:17:44,364 ftp.example.com proftpd[28832] ftp.example.com: ProFTPD 1.3.5 (stable) (built Fri May 22 2015 00:17:07 UTC) standalone mode STARTUP
 2015-10-08 16:18:09,365 ftp.example.com proftpd[29111] ftp.example.com (lns-bzn-51f-85-78-78-5.adsl.proxad.net): FTP session opened.
 2015-10-08 16:18:09,575 ftp.example.com proftpd[29111] ftp.example.com (lns-bzn-51f-85-78-78-5.adsl.proxad.net): user1 chdir("/home/user2") failed: Permission non accordée
 2015-10-08 16:18:09,577 ftp.example.com proftpd[29111] ftp.example.com (c233e21e.fsp.oleane.fr[194.51.226.30]): FTP session closed.

530 Authentification incorrecte

Si les logs renvoient SECURITY VIOLATION: root login attempted (en FTP avec un compte qui peut marcher en SFTP par ailleurs), c'est qu'il faut modifier /etc/proftpd/proftpd.conf avec RootLogin on.

Sinon, s'ils donnent Invalid shell il faut en définir un valide dans /etc/passwd.

Enfin, si un copié-collé du login et du mot de passe ne fonctionne pas, contacter l'administrateur du serveur pour recréer le compte.

Aucune permission

Généralement ce phénomène s'accompagne du message "425 Can't open data connection for transfer". Il peut être résolu en cochant le mode passif dans le troisième onglet du site.

clé de l'hôte inconnue ou key fingerprint is xxx. Are you sure you want to continue connecting (yes/no)?

Avertissement sur FileZilla

En SFTP, il s'agit d'un avertissement sur la clé de cryptage qui peut survenir avec ProFTPD ou OpenSSH. Il peut planter certains scripts ou logiciels de transfert comme Webdrive, qui s'arrêtent sans l'afficher. Mais avec FileZilla il suffit de l'accepter une fois pour ne plus le revoir.

EAI_NODATA - Aucune adresse associée à ce nom de nœud

Problème de DNS, ou bien /etc/hosts.

ECONNREFUSED - Connexion refusée par le serveur

Si telnet fonctionne, c'est sûrement le certificat SSL qui a expiré ou le pare-feu.

Sinon, si telnet ne fonctionne pas sans aucune règle iptables, mais passe sur le port 22, c'est peut-être la directive Port 21 de /etc/proftpd/proftpd.conf à refaire. Ou sinon, dans le client FileZilla, préciser le chiffrement pour ce site en "Connexion FTP simple (non sécurisé)".

Handshake failed (40)

Se produit depuis 2016 sur FileZilla quand une connexion FTP (par TLS ou pas) tombe sur un certificat invalide. Mais avec CoreFTP cela fonctionne.

Impossible d'établir une connexion au serveur

Voir ci-dessous : #Serveur introuvable.

Refused user root for service proftpd

Cela peut se produire après l'installation ou une mise à jour. Si un tail /var/log/proftpd/proftpd.log renvoie USER root (Login failed): User in /etc/ftpusers, commenter l'utilisateur dans ce fichier de blacklist.

Serveur introuvable

Il s’agit probablement d’une panne de DNS, il faut alors remplacer l'URL par l'IP.

Sinon, il s’agit peut-être d’une règle de pare-feu. Pour le vérifier, taper la commande telnet IP 21. Si c'est bloqué ou affiche "délai d’attente dépassé", ou "connexion refusée" il faut ouvrir le flux FTP du pare-feu client.

Sinon, il faut donc vérifier que le client FTP n’est pas configuré en SFTP (port 22 au lieu de 21) ou vice-versa.

Si un message d’erreur survient après une connexion "PASV" : il faut désactiver le mode passif. Par exemple dans Filezilla : Édition, Paramètres, FTP, décocher la case.

Sinon, il faut regarder les logs du serveur (ex : iptables).

Références