Un coin perdu... : Articles - 2 - How to : VsFtpd, Xinetd et Pam
Nous sommes le
Bonne Fête!
Votre connection

Browser : Autre

IP : 38.107.191.103
OS : Système d'exploitation inconnu

Flux

TAG
This will be shown to users with no Flash or Javascript.
Rss 2 - How to : VsFtpd, Xinetd et Pam
ici nous allons voir brièvement comment, avec VSFTP, on peut se créer un "système d'hébergement", un peu comme ce que pourrait nous offrir un hébergeur comme PHPNux, mais l'on pourrait très bien y trouver quelques utilisations internes en entreprise.

Il s'agit là de monter un serveur web pour consulter des documents, et ftp pour les manipuler. Comme ce n'est pas encore la foire au dindons, il ne faut pas que n'importe qui puisse faire n'importe quoi donc nous allons faire appel à un système d'authentification pour sécuriser un peu tout cela.

Bon, l'idée est lancée, il faut la mettre en oeuvre, partons sur une Debian Lenny comme système, celle du Raid 1 par exemple, pour mémoire et pour celles et ceux qui n'auraient pas lu l'article en question, il s'agit d'un serveur équipé d'un système Debian Lenny, monté sur un RAID 1 grâce à mdma, le tout dans VirtualBox, cette VM est vue comme une machine physique sur mon réseau local. Nous choisirons Apache et consorts pour assurer la partie web, bien sur Vsftpd pour la partie ftp et Pam pour s'occuper de l'authentification.

Commençons !

On peut installer l'ensemble des composants en même temps, cependant, limitons nous à la partie web pour le moment, et installonsle serveur Apache 2 ainsi que quelques outils qui pourraient être nécessaires :
Code BASH :
apt-get install apache2 mysql-server php5 php5 mysql phpmyadmin

Nous venons d'installer le serveur web, un serveur de bases de données ainsi qu'un langage web très répandu en deux secondes !

Il y a très peu de configuration a faire pour obtenir une page accessible depuis le réseau, cela se situe principalement au niveau du serveur Apache qu'il faut regarder un peu, c'est très facile de voir son fichier de configuration sans les commentaires et c'est bien plus rapide d'y voir quelque chose !
Code BASH :
cat /etc/apache2/apache2.conf | egrep -v '#' | less

Cela nous à donné un aperçu de ce qu'il y a dans ce fichier :
Caché:


ServerRoot "/etc/apache2"

LockFile /var/lock/apache2/accept.lock

PidFile ${APACHE_PID_FILE}

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 15


<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

<IfModule mpm_event_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}


AccessFileName .htaccess

<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy all
</Files>

DefaultType text/plain


HostnameLookups Off

ErrorLog /var/log/apache2/error.log

LogLevel warn

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Include /etc/apache2/httpd.conf

Include /etc/apache2/ports.conf

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined



Include /etc/apache2/conf.d/

Include /etc/apache2/sites-enabled/

il faut l'éditer maintenant pour modifier quelques paramétres en prenant soin d'en garder une copie de sauvegarde avant.
Code BASH :
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf-origine
nano /etc/apache2/apache2.conf

Juste au dessus de la directive ServerRoot, rajouter la suivante :
Code BASH :
ServerName 192.168.1.141:80

Cette directive indique à apache sur quelle adresse et port il doit s'identifier lui même. 192.167.1.141 est l'adresse de la machine virtuelle, 80 le port d'écoute par défaut.
Après ça, on va faire en sorte qu'Apache n'envoie pas trop de détail sur qui il est ! Cela se passe dans le fichier security. Dans ce fichier, on peut définir la quantité d'infos qu'Apache envoie à son sujet (système sur lequel il tourne par exemple).
Code BASH :
nano /etc/apache2/conf.d/security

Ici, on va d'abord se rendre à la ligne ou se situe la directive ServerTokens, on peut attribuer plusieurs niveaux à celle ci :
  • Full
  • OS
  • Minimal
  • Minor
  • Major
  • Prod

Chacunes désignent un niveau d'info envoyées, ici je choisis Prod, pour ne rien envoyer, j'ajoute :
Code BASH :
ServerTokens Prod

Ensuite, pour ne pas envoyer le nom du serveur en lui même, juste en dessous, passons la directive serverSignature sur off
Code BASH :
ServerSignature Off

On reload la configuration dans le serveur pour prendre en compte immédiatement ces changements :
Code BASH :
/etc/init.d/apache2 reload

Voila pour la partie web !
Notre serveur est correctement configuré et prêt à accueillir de simples fichiers html statiques à afficher ou une structure de site dynamique grâce au serveur de bases de données et à PHPMyadmin pour administrer celles ci.

On peut maintenant s'occuper de la partie ftp/authentification, qui sera le "gros morceau" du howto puisque nous allons être beaucoup plus exigeant que dans un précédent article ou j'expliquais la mise en place de VSFTPD dans une conf basique; Ici, l'utilisateur anonyme sera bannit !

Nous allons installer le serveur ftp de façon à ce que seule une personne identifiée puisse s'y connecter, mais aussi de façon à ce que le serveur ne soit pas constamment en écoute, mais se réveille seulement lors d'un appel. Nous ferons aussi en sorte que le dossier de l'utilisateur soit la racine du (ou des si plusieurs users) site(s) web.

Tout cela est possible grâce au trio Vsftpd/pam/xinetd. Vsftpd pour le serveur ftp donc, Pam, qui signifie Pluggable Authentication Modules offre un système d'authentification simple et très sécurisé, grâce à lui, nos utilisateurs seront listés dans un fichier bien spécifique accompagné de leurs mots de passes respectifs cryptés. Enfin xinetd s'occupera de mettre le serveur ftp en écoute quand un utilisateur se sera authentifié avec succès, puis d'inverser cet état dans le cas contraire, ainsi le serveur ne reste pas constamment en écoute et rajoute un petit plus en sécurité.

Alors, pour réaliser tout cela, il nous faut installer vsftpd, xinetd, apache2-utils et la libpam-pwdfile si elle n'est pas présente.
Code BASH :
apt-get install vsftpd xinetd apache2-utils libpam-pwdfile

On reviendra sur le pourquoi du apache2-utils...
Observons la configuration par défaut de vsftpd :
Code BASH :
cat /etc/vsftpd.conf | egrep -v '#'

On peux voir que la configuration ne correspond pas vraiment a ce que l'on cherche !
Code BASH :
listen=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

Il faut changer quelque paramétres, en enlever et en rajouter de sorte qu'à la fin, il ne doit rester que cela :
Code BASH :
#Le serveur n'écoute pas en continue.
listen=NO 
#Pas de connections anonymes.
anonymous_enable=NO 
#Connections des logins locaux acceptées
local_enable=YES 
#Les users hors système possèdent les mêmes privilèges que les locaux
virtual_use_local_privs=YES 
#On autorise les manipulations de fichiers via ftp. Au choix.
write_enable=YES 
#On autorise les connections sur le port 20.
connect_from_port_20=YES 
#Nom du service déclaré dans la configuration Pam.
pam_service_name=vsftpd 
#On autorise les connections invitées afin de les "convertir" vers une nouvelle identité.
guest_enable=YES 
#Puisque c'est pour manipuler du contenu web, www-data et l identité qui convient.
guest_username=www-data 
#Permet de créer des répertoires personnels à la volée en fonction du contenu de guest_username.
#Si l utilisateur est www-data, son répertoire devrait être /var/www/homes/$USER.
 #Ainsi chaque guest aura son répertoire perso dans /var/www/ .
user_sub_token=$USER
#Sera la racine du serveur ftp
local_root=/var/www/$user
#On emprisonne les processus utilisateurs
chroot_local_user=YES
#Cette option permet d'afficher TOUS les fichiers sous l identité ftp:ftp.
#Permet également de masquer le nom du serveur. 
hide_ids=YES
#On conserve une trace de toute connections ou tentative.
xferlog_enable=YES
#On détermine ou seront les fichier de configuration de chaque utilisateur virtuel.
user_config_dir=/etc/vsftpd/vsftpd_user_conf

J'espère que mes commentaires sont suffisamment clair et explicite.

Passons à l'authentification, on a prévenu vsftp que les utilisateurs passeraient voir Pam pour s'authentifier avant de rentrer, parce que Pam, elle est chouette, elle s'occupe d'authentifier tout un tas de services et gens si on lui demande gentiment, il n'y a qu'à voir dans /etc/pam.d/ pour s'en rendre compte... En installant vsftpd, on a installé une configuration Pam par défaut (comprise dans le paquet). Celle ci se base sur le fichier ftpusers et l'existence d'un vrai user, avec un shell distant... Et c'est moche !

On à installé tout à l'heure le paquet apache2-utils, et bien celui ci permet de générer des fichier passwd pour les serveurs web, mais cela fonctione aussi sur le ftp, c'est un fichier de ce type qui va héberger l'identité de nos utilisateurs sous la forme login mot-de-passe. Donc nous allons créer un fichier vsftpd.passwd qui va contenir un utilisateur "test" mot de passe "test".
Code BASH :
htpasswd -b -c /etc/vsftpd.passwd test test

Voilà notre premier utilisateur guest créé, construisons lui son répertoire personnel dans /var/www, celui ci s'appelera test, forcément.
Pour créer d'autres utilisateurs, la commande sera la suivante :
htpasswd /etc/vsftpd.passwd utilisateur
Le mot de passe du nouvel utilisateur sera demandé. A noter que ces utilisateurs sont "virtuels", ils sont extérieur au système et qu'il faudra leurs créer un home correspondant dans /var/www.

Maintenant, il nous faut créer un fichier de configuration pour cet utilisateur test, un fichier qui va le restreindre un peu et qui se nommera test lui aussi, on le créé dans /etc/vsftpd/vsftpd_user_conf/ et on y place ça dedans :

Code BASH :
nano /etc/vsftpd/vsftpd_user_conf/test
 
anon_world_readable_only=NO
local_root=/var/www/test
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

Là, on le restreint dans son seul et unique répertoire, il ne peut pas voir le reste du monde mais il peut cependant faire "ce qu'il lui plait" dedans.

Nous allons maintenant renseigner le fichier de configuration de vsftpd dans /etc/pam.d/ et changer les deux lignes en dessous de # Standart behaviour for ftpd(8).
Code BASH :
# Standart behaviour for ftpd(8)
auth         required       pam_pwdfile.so pwdfile=/etc/vsftpd.passwd
account   required       pam_permit.so

Ici on a indiqué que Pam trouverait les cartes d'identités des utilisateurs autorisés dans le fichier vsftpd.passwd généré précédemment, on lui dit aussi que la bibliothèque pam_pwdfile.so lui permettrait de déchiffrer les passwords et qu'ainsi elle pourra ouvrir le compte utilisateur avec la clé pam_permit.so
La fin approche, il ne reste plus qu'a indiquer au super serveur xinetd qu'il doit réveiller vsftpd en cas de demande, pour cela, il suffit d'ajouter un fichier vsftpd dans /etc/xinetd.d/ et qui décrira les conditions du service.
Code BASH :
nano /etc/xinetd.d/vsftpd
 
# Conditions pour le réveil du ftp
service ftp
{
disable                  = no
socket_type          = stream
wait                        = no
user                        = root
server                     = /usr/sbin/vsftpd
per_source            = 5
instances               = 200
only_from              = 192.168.1.0/24
banner_fail            = /etc/vsftpd.busy_banner
log_on_success += PID HOST DURATION
log_on_failure    += HOST
}

Détaillons un peut toutes ces options :
  • disable : Active ou non le service demandé.
  • socket_type : on détermine le type de binaire qui traitera le flux.
  • wait : Détermine si xinetd pourra gérer plusieurs connections.
  • user : Identité sous laquelle le service s'exécutera.
  • server : Chemin vers l'exécutable.
  • per_source : Détermine le nombre max de connections simultanées par adresse source.
  • instances : La même qu'au dessus, mais pour toutes les sources.
  • only_from : Détermine qui peut être une source.
  • banner_fail : Texte renvoyé si le serveur ne répond pas.
  • log_on_success : Permet de spécifier les infos qui seront inscrite dans les journaux
  • log_on_failure : La même qu'au dessus, mais pour les échecs de connections.


Voià, a partir d'ici, il suffit de relancer tous les services concernés pour que tout soit fonctionnel. Par la suite, notre utilisateur "test" pourra uploader ces fichiers sur son espace web via ftp, ceux ci seront visible immédiatement via un navigateur internet !

Tout ceci est bien chouette et un peu plus sécurisé que la normale, mais les échanges ftp sur le réseau ne le sont pas tellement, pour remédier à cela, nous allons mettre en place SSL afin de chiffrer toutes ces transactions.... Je vous montrerai cela dans la deuxième partie de cet article.
 
 
Note: Aucune note
(0 note)
Ecrit par: le furtif, Le: 16/06/10