[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" .
[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.\\
[root@kazuya ~]# echo "/bin/false" >> /etc/shells
À présent, il reconnait bien le shell "/bin/false" comme étant valide :).
[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" ====
[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
AllowUser admftp
DenyAll
Allow 192.168.0. 127.0.0.1
DenyAll
#------------------------------------------------------------------
#DIRECTIVES ANONYMES =>FACULTATIVES
#------------------------------------------------------------------
User ftp
Group ftp
AnonRequirePassword on
RequireValidShell off
UserAlias anonymous ftp
UserAlias personne ftp
UserAlias anonyme ftp
DenyAll
===== 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 "STAT FTP 230 et 530 " > $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 "" >> $HTML
echo " STATISTIQUE CONNEXIONS FTP => TOTAL: $NB_TOTAl_CONNEXION " >> $HTML
echo "Adresse IP
Nb connexion OK
Nb connexion NOT OK
" >> $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="0"
else
NB_230_POUR_CETTE_IP="$NB_230_POUR_CETTE_IP"
fi
if [ -z "$NB_530_POUR_CETTE_IP" ] || [ "$NB_530_POUR_CETTE_IP" -eq 0 ]
then
NB_530_POUR_CETTE_IP="0"
else
NB_530_POUR_CETTE_IP="$NB_530_POUR_CETTE_IP"
fi
echo "$IP
$NB_230_POUR_CETTE_IP
$NB_530_POUR_CETTE_IP
" >> $HTML
done
echo "
" >> $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.