LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


proftpd

Serveur ProFTP

ProFTP est un serveur utilisant le protocole FTP (File Transfert Protocole = Protocole de Transfert de Fichiers) qui est l'un des plus connus sur internet avec HTTP. Il permet à plusieurs personnes de partager des fichiers.
ProFTP est l'un des serveurs les plus connus sous Unix, il permet l'utilisation de certaines fonctions avancées comme les ratios ou les virtualhosts dont nous ne parlerons pas pour l'instant ici. La version la plus à jour de proftp à ce jour est la 1.3.2rc1, si vous voulez de plus amples informations concernant proftp, je vous invite à visiter le site officiel: http://www.proftp.org


Nous allons ici mettre en place un serveur de fichiers avec gestion des droits d'accès sur un serveur Linux. Autrement dit l'objectif de cette activité est d'installer et configurer un serveur de fichier “ProFTP” afin de mettre à la disposition des utilisateurs un espace de stockage/transfert en utilisant un accès anonyme ou authentifié.
NDLR: Ici nous mettons en place ce serveur de fichier sur un réseau locale, mais il peut aussi bien être adapté pour l'internet.

Situation Initiale

Situation Finale

situation_final_gentoo_proftp.jpeg


<note important> Attention ! j'estime ici que vous êtes assez grand pour configurer vous-même le réseau et donc que le “pc client” et le “serveur” se ping bien au travers de votre réseau.</note>

Installation du logiciel

Sous Gentoo Linux

[root@kazuya ~]# emerge -av proftpd 

Sous Mandriva Linux

[root@kazuya ~]# urpmi proftpd

Vérification de l'installation

On vérifie si le logiciel c'est installé correctement (si le chemin est correctement retourné il n'y a pas de problème, sinon c'est que le logiciel n'est pas correctement installé):

[root@kazuya ~]# ls /usr/sbin/proftpd

Configuration de ProFTP

Mise en place du répertoire ftp

⇒ Création du répertoire FTP si il n'existe pas:

[root@kazuya ~]# mkdir -p /home/ftp

⇒ On copie les fichiers que l'on veut partager vers le répertoire “/home/ftp/” (bien évidemment ceci n'est juste là que pour avoir des fichiers pour le test, vous pourrez par la suite en ajouter/supprimer avec un utilisateur du service ayant les droits nécéssaires):

[root@kazuya ~]# cp -r /home/kazuya/mon_dossier/* /home/ftp

L'utilisateur sans droit "nobody"

Par défaut, le logiciel « proftpd » se lance avec les droits de l'administrateur « root » et cela pause des problèmes de sécurité. C'est pourquoi il est conseillé d'associer au service FTP un compte sans droits particuliers, le plus souvent c'est le compte « nobody » (appartenant au groupe « nogroup » qui est utilisé). Ce compte doit déjà exister sur le système Linux. On peut donc le vérifier avec les commandes suivantes:

[root@kazuya ~]# cat /etc/passwd | grep nobody

Si il n'y a aucun résultat, cela indique que l'utilisateur « nobody » n'existe pas. Il faut donc le créer:

[root@kazuya ~]# groupadd nogroup
[root@kazuya ~]# useradd nobody -d / -s /bin/false
[root@kazuya ~]# usermod -g nogroup nobody

Quelques explications:

  • groupadd crée le groupe “nogroup”,
  • useradd crée l'utilisateur “nobody” ayant pour répertoire “/” (la racine donc, et non plus un “/home/nobody”) avec un interpréteur de commande “/bin/false” (qui n'est pas un vrai interpréteur de commande) à la place du traditionnel “/bin/bash” sous Linux, ceci afin d'améliorer la sécurité (pour éviter qu'un petit malin ne se connecte sous cet utilisateur et puisse avoir accès à une console).
  • usermod se charge d'associer l'utilisateur “nobody” au group “nogroup” existant.

Création des utilisateurs

L'utilisateur administrateur ayant les droits d'écriture:

[root@kazuya ~]# groupadd ftp
[root@kazuya ~]# useradd admftp -s /bin/false
[root@kazuya ~]# usermod -g ftp admftp
[root@kazuya ~]# passwd admftp
 
                       >>on tape le mot de passe "admftp" (par exemple)

L'utilisateur qui aura un accès en lecture seulement:

[root@kazuya ~]# useradd -g ftp -s /bin/false  userftp
[root@kazuya ~]# passwd userftp

L'utilisateur anonyme qui aura un accès en lecture seulement, si il n'existe pas déjà:

[root@kazuya ~]# useradd -g ftp -u 21 -s /bin/false -d /home/ftp ftp  

L'option “-u 21” donne l'uid 21 à l'utilisateur “ftp”. Si votre Linux se plain qu'il n'est pas unique alors veuillez utiliser l'utilisateur ayant déjà cet identifiant là pour configurer le mode Anonyme, sinon il y a peu de chance pour que ça marche avec les nouvelles versions de proFTP. En utilisant un utilisateur avec un UID différent de 21 pour l'anonyme, vous risquer d'avoir une erreur du style “530-Unable to set anonymous privileges” . <note important>ATTENTION!: il est très important que les utilisateurs du serveur ftp aient des droits restreints et donc ne soient pas des utilisateurs réguliers du système Linux d'où le “/bin/false” au lieu du “/bin/bash” habituel sous Linux.</note>

Ensuite on donne des droits sur le répertoire:

[root@kazuya ~]# chgrp ftp /home/ftp -R
[root@kazuya ~]# chmod 775 /home/ftp -R

Quelques explications:

  • chgrp: pour “Change Groupe” → Ici on change le groupe du répertoire “/home/ftp” de façon récursive (dossiers/sous-dossiers) avec l'option “-R”
  • chmod: Ici on change les droits sur le dossier “/home/ftp” toujours de façon récursive avec l'option “-R”. Ces droit sont à présent “775”.
    • Le premier 7 correspond au propriétaire du dossier: il a donc le droit de “lecture” (4), “écriture” (2) et “exécution” (1)⇒ 4+2+1= 7.
    • Le deuxième 7 correspond au groupe du dossiers (et donc possèdent les même droits que le propriétaire).
    • Le 5 correspond à tous les autres utilisateurs du système, ils ont le droit de “lecture” (4) et “exécution” (1) ⇒ 4+1= 5.

<note> Bien sur ici:

  • Le droits “lecture” correspond à afficher le contenu lorsqu'il s'agit d'un fichier ou lister le contenu d'un répertoire.
  • Le droit “écriture” correspond modifier le contenu d'un fichier ou créer/supprimer des fichiers/répertoires
  • Le droit “exécution” correspond à exécuter un programme ou bien accéder à l'ensemble des informations

Je n'en dirais pas plus, ce n'est pas le but de ce tutoriel que d'expliquer les droits unix/linux. </note>

Éditer le fichier "/etc/shells"

Laissez-moi vous rappeler que nous avons crée des utilisateurs plus haut avec un shell “/bin/false”.
Ceci est bien jolie, mais en laissant ceci sans rien modifier d'autre, votre Linux ne va pas être content du tout étant donné qu'il ne sait pas de quoi il s'agit (pour lui ce shell n'est pas valide).
C'est pour cela que nous allons lui indiquer par cette commande: <note important> ATTENTION: Avec la commande qui va suivre, elle, utilise le “»
Veuillez bien faire attention à mettre ”»” (qui fait que l'on copie le résultat de la commande précédente à la suite du fichier ou crée celui-ci si il n'existe pas) et à ne pas mettre qu'un seul “>” (qui dans ce cas là, efface le contenu du fichier pour le remplacer par le résultat de la commande précédente ou crée celui-ci si il n'existe pas)</note>

[root@kazuya ~]# echo "/bin/false" >> /etc/shells

À présent, il reconnait bien le shell “/bin/false” comme étant valide :). <note importante> Si vous ne mettez pas “/bin/false” dans le fichier “/etc/shells” vous ne pourrez pas vous connecter avec vos utilisateurs ayant “/bin/false” comme shell pour accèder au service proftp.</note>

Restriction des comptes

Nous allons maintenant restreindre les utilisateurs du service ftp, pour cela nous allons utiliser le fichier “/etc/ftpusers” qui permet de se constituer une liste noire (tous les utilisateurs inscrit dans cette liste ne peuvent pas avoir accès au service ftp)

[root@kazuya ~]# cat /etc/passwd | cut -d":" -f1 > /etc/ftpusers

Quelques explications:
La commande suivante se charge d'afficher le contenu du fichier “/etc/passwd” (contenant donc tous les utilisateurs présent sur le système linux) et d'en extraire uniquement (c'est là que la commande “cut” intervient avec l'option “-d” pour définir le délimiteur de champs, ici “:” et l'option “-f1” pour choisir le premier champ de ce délimiteur) les identifiants pour les mettre dans le fichier “ftpusers” (et là vous vous souvenez de l'avertissement cité plus haut concernant le “>”, qui efface tout ce qu'il y a dans le fichier avant.))
Nous utilisons celui-ci pour éviter, si il existe déjà un fichier “ftpusers”, d'avoir des identifiants en double. Ensuite, dans ce fichier que nous avons remplie, nous devons l'éditer afin d'enlever “nobody, admftp, userftp, ftp, anonyme”, pour cela utiliser votre éditeur de texte favoris:

[root@kazuya ~]# vi /etc/ftpusers

Mise en place du fichier "proftpd.conf"

<note> Sous Mandriva Linux, ce fichier ce trouve dans “/etc/proftpd.conf” et sous Gentoo Linux ce fichier ce trouve dans “/etc/proftpd/proftpd.conf”, veuillez donc adapter en fonction de votre distribution.</note> ⇒ Renommer l'ancien fichier “/etc/proftpd/proftpd.conf” et copier le nouveau fichier:

[root@kazuya ~]# mv /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.old
[root@kazuya ~]# cp /home/kazuya/proftpd.conf /etc/proftpd/proftpd.conf

Bien sur, voici le fichier en question:

#===============================================================
# Kazuya : service PROFTPD Linux
#---------------------------------------------------------------
#Principales directives de configuration
# => voir "/usr/share/doc/proftpd-1.3.1/html/Configuration.html"
#===============================================================
 
 
#----------------------------------------------------------------
#DIRECTIVE SYSTEMES                  => OBLIGATOIRES!
#----------------------------------------------------------------
ServerType             standalone
DefaultServer          on
AllowStoreRestart      on
Port                   21
User                   nobody
Group                  nogroup
 
 
#----------------------------------------------------------------
#DIRECTIVE ADMINISTRATEUR           => FACULTATIVES
#----------------------------------------------------------------
ServerName            "ProFTPD - Société FREEWORLD"
LogFormat             format_1  "[%{%d/%m/%y %H:%M:%S}t]-[IP=%a]-[LOGIN=%U(%u)]-[CDE_CLT=%r]-[REP_FTP=%s]-[DIR=%D]"
LogFormat             format_2  "[%{%d/%m/%y %H:%M:%S}t]-[IP=%a]-[LOGIN=%U]-[CDE_CLT=%r]-[REP_FTP=%s]-[FICHIERS=%f]-[NB_OCT=%b]"
ExtendedLog           /var/log/proftpd/LOG_PRINCIPAL_FTP.log AUTH,INFO,DIRS   format_1
ExtendedLog           /var/log/proftpd/LOG_TRANSFERT_FTP.log READ,WRITE       format_2
UseFtpUsers           on
AllowOverwrite        on
 
 
#-----------------------------------------------------------------
#DIRECTIVES SECURITAIRES/RESTRICTIVES      =>FACULTATIVES
#-----------------------------------------------------------------
DefaultRoot           /home/ftp
MaxClients            30   "Désolé (so sorry!). Nombre de connexions pour ce serveur FTP: '%m' "
MaxInstances          30  #Nombre de processus maximum
AccessDenyMsg         "WARNING ! Votre authentification est invalide !!"
AccessGrantMsg          "Bienvue \"%u\" sur le serveur FTP de la société FreeWORLD"
TimeoutIdle           300
<Directory /home/ftp>
   <Limit WRITE>
     AllowUser        admftp
     DenyAll
   </Limit>
</Directory>
<Limit LOGIN>
    Allow            192.168.0. 127.0.0.1
    DenyAll
</Limit>
 
 
#------------------------------------------------------------------
#DIRECTIVES ANONYMES    =>FACULTATIVES
#------------------------------------------------------------------
<Anonymous /home/ftp>
  User                ftp
  Group               ftp
  AnonRequirePassword  on
  RequireValidShell    off
  UserAlias           anonymous ftp
  UserAlias           personne ftp
  UserAlias           anonyme ftp
  <Limit WRITE>
    DenyAll
 </Limit>
</Anonymous>

Démarrage du service ProFTP

Sous Gentoo Linux

[root@kazuya ~]# /etc/init.d/proftpd start

Sous Mandriva Linux

[root@kazuya ~]# service proftpd start

⇒ On vérifie que le processus est bien lancé:

[root@kazuya ~]# ps aux | grep ftp

⇒On vérifie que notre serveur ftp écoute bien le réseau:

[root@kazuya ~]# netstat -natup | grep :21

Ensuite si on veut suivre les connections “en direct”, il suffit de visualiser la fin des fichiers journaux (à faire dans une autre console):

[root@kazuya ~]# tail -f /var/log/proftpd/LOG_PRINCIPAL_FTP.log 

⇒ Si on veut également suivre les téléchargements en direct (à faire dans une autre console):

root@kazuya ~]# tail -f /var/log/proftpd/LOG_TRANSFERT_FTP.log 

Test du service

D'abord tester en “localhost”:

[root@kazuya ~]# ftp localhost

→ Vérifier qu'avec “root” ça ne marche pas, puis vérifier qu'avec “admftp” cela fonctionne par exemple. Ensuite tester plus en profondeurs les droits “lecture/écriture/exécution” sur le poste client avec les différents comptes crées.

Utilisation des journaux

Pour surveiller le trafic, on peut utiliser un simple script bash permettant de créer une page html en exploitant les journaux du service proftpd. Voici le petit script en question (assez simple):

#!/bin/bash 
# by Kazuya
LOG="/var/log/proftpd/LOG_PRINCIPAL_FTP.log"
HTML="/home/ftp/TOTAL_CONNEXION_FTP.html"
 
echo "<html><head><TITLE>STAT FTP 230 et 530</title></head><body bgcolor='Yellow'><center>" > $HTML
 
NB_TOTAL_230=$(cat $LOG | grep 230 -c)
NB_TOTAL_530=$(cat $LOG | grep 530 -c)
let NB_TOTAl_CONNEXION=NB_TOTAL_230+NB_TOTAL_530
 
LISTE_UNIQUE_DES_IPs=$(cat $LOG | cut -d "=" -f2 | cut -d "]" -f1 | sort | uniq)
 
echo "<table border='1' width='75%' bgcolor='silver'>" >> $HTML
echo "<tr><TD colspan='3' align='center'> STATISTIQUE CONNEXIONS FTP => TOTAL:<b> $NB_TOTAl_CONNEXION </b></TD></tr>" >> $HTML
echo "<TR bgcolor='green'><TD align='center'><b>Adresse IP</b></TD>
  <td align='center'><b>Nb connexion OK</b></td>
  <td align='center'><b>Nb connexion NOT OK</b></td>
</TR>" >> $HTML
 
for IP in $LISTE_UNIQUE_DES_IPs
do
 
   NB_230_POUR_CETTE_IP=$(cat $LOG | grep $IP | grep 230 -c)
   NB_530_POUR_CETTE_IP=$(cat $LOG | grep $IP | grep 530 -c)
 
 if [ -z "$NB_230_POUR_CETTE_IP" ] || [ "$NB_230_POUR_CETTE_IP" -eq 0 ]
then
  NB_230_POUR_CETTE_IP="<b><font color='red'>0</font></b>"
else
  NB_230_POUR_CETTE_IP="<b><font color='blue'>$NB_230_POUR_CETTE_IP</font></b>"
fi
 
if [ -z "$NB_530_POUR_CETTE_IP" ] || [ "$NB_530_POUR_CETTE_IP" -eq 0 ]
then
   NB_530_POUR_CETTE_IP="<b><font color='red'>0</font></b>"
else
  NB_530_POUR_CETTE_IP="<b><font color='blue'>$NB_530_POUR_CETTE_IP</font></b>"
fi
 
echo "<tr><TD bgcolor='aqua'><i>$IP</i></TD>
          <TD align='center'><i>$NB_230_POUR_CETTE_IP</i></TD>
          <TD align='center'><i>$NB_530_POUR_CETTE_IP</i></TD>
       </tr>" >> $HTML
done
 
echo "</table></body></html>" >> $HTML

Il faut d'abord lui donner les droits d'exécution puis l'exécuter:

[root@kazuya ~]# chmod +x statftpv2
[root@kazuya ~]# ./statftpv2

Il suffit ensuite de visualiser la page dans un navigateur web (ne pas oublier de re-exécuter le script de temps en temps, ou par exemple en utilisant “cron” pour automatiser cette exécution)

Conclusion

Relativement simple à installer, une fois que l'on a la bonne démarche. Il peut servir aussi bien en intranet qu'en extranet. Vous pouvez ainsi facilement mettre en place un tel service pour partager des données.

proftpd.txt · Dernière modification: 2018/11/17 13:54 (modification externe)