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 [2014/12/21 19:42] (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: 2014/12/21 19:42 (modification externe)