LinuxPedia

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

Outils pour utilisateurs

Outils du site


proftpd

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

proftpd [2018/11/17 13:54] (Version actuelle)
Ligne 1: Ligne 1:
 +====== 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 =====
 +{{:proftp:situation_initial_gentoo_proftp.jpeg|}}
 +
 +
 +===== Situation Finale =====
 +{{:proftp:situation_final_gentoo_proftp.jpeg?684x230}}
 +
 +----
 +<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 ===
 +
 +<code bash>[root@kazuya ~]# emerge -av proftpd </code>
 +=== Sous Mandriva Linux ===
 +<code bash>[root@kazuya ~]# urpmi proftpd</code>
 +
 +==== 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é): 
 +<code bash>[root@kazuya ~]# ls /usr/sbin/proftpd</code>
 +
 +===== Configuration de ProFTP =====
 +==== Mise en place du répertoire ftp ====
 +=> Création du répertoire FTP si il n'existe pas:
 +<code bash>[root@kazuya ~]# mkdir -p /home/ftp</code>
 +=> 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):
 +<code bash>[root@kazuya ~]# cp -r /home/kazuya/mon_dossier/* /home/ftp</code>
 +
 +==== 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:
 +<code bash>[root@kazuya ~]# cat /etc/passwd | grep nobody</code>
 +Si il n'y a aucun résultat, cela indique que l'utilisateur « nobody » n'existe pas. Il faut donc le créer:
 +<code bash>
 +[root@kazuya ~]# groupadd nogroup
 +[root@kazuya ~]# useradd nobody -d / -s /bin/false
 +[root@kazuya ~]# usermod -g nogroup nobody
 +</code>
 +__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:
 +<code bash>
 +[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)
 +</code>
 +L'utilisateur qui aura un accès en lecture seulement:
 +<code bash>
 +[root@kazuya ~]# useradd -g ftp -s /bin/false  userftp
 +[root@kazuya ~]# passwd userftp
 +</code>
 +L'utilisateur anonyme qui aura un accès en lecture seulement, si il n'existe pas déjà:
 +<code bash>[root@kazuya ~]# useradd -g ftp -u 21 -s /bin/false -d /home/ftp ftp  </code>
 +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:
 +<code bash>
 +[root@kazuya ~]# chgrp ftp /home/ftp -R
 +[root@kazuya ~]# chmod 775 /home/ftp -R
 +</code>
 +__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>
 +<code bash>[root@kazuya ~]# echo "/bin/false" >> /etc/shells</code>
 +À 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) 
 +<code bash>[root@kazuya ~]# cat /etc/passwd | cut -d":" -f1 > /etc/ftpusers</code>
 +__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:
 +<code bash>[root@kazuya ~]# vi /etc/ftpusers</code>
 +==== 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: 
 +<code bash>
 +[root@kazuya ~]# mv /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.old
 +[root@kazuya ~]# cp /home/kazuya/proftpd.conf /etc/proftpd/proftpd.conf
 +</code>
 +Bien sur, voici le fichier en question: 
 +<code bash>
 +#===============================================================
 +# 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>
 +
 +</code>
 +
 +===== Démarrage du service ProFTP =====
 +=== Sous Gentoo Linux ===
 +<code bash>[root@kazuya ~]# /etc/init.d/proftpd start</code>
 +=== Sous Mandriva Linux ===
 +<code bash>[root@kazuya ~]# service proftpd start</code>
 +=> On vérifie que le processus est bien lancé:
 +<code bash>[root@kazuya ~]# ps aux | grep ftp</code>
 +=>On vérifie que notre serveur ftp écoute bien le réseau:
 +<code bash>[root@kazuya ~]# netstat -natup | grep :21</code>
 +Ensuite si on veut suivre les connections "en direct", il suffit de visualiser la fin des fichiers journaux (à faire dans une autre console):
 +<code bash>[root@kazuya ~]# tail -f /var/log/proftpd/LOG_PRINCIPAL_FTP.log </code>
 +=> Si on veut également suivre les téléchargements en direct (à faire dans une autre console):
 +<code bash>root@kazuya ~]# tail -f /var/log/proftpd/LOG_TRANSFERT_FTP.log </code>
 +===== Test du service =====
 +D'abord tester en "localhost":
 +<code bash>[root@kazuya ~]# ftp localhost</code>
 +-> 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):
 +<code bash>
 +#!/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
 +
 +</code>
 +Il faut d'abord lui donner les droits d'exécution puis l'exécuter: 
 +<code bash>
 +[root@kazuya ~]# chmod +x statftpv2
 +[root@kazuya ~]# ./statftpv2
 +</code>
 +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)