ici nous allons voir brievement comment, avec VSFTP, on peut se creer un "systeme d'hebergement", un peu comme ce que pourrait nous offrir un hebergeur comme PHPNux, mais l'on pourrait tres bien y trouver quelques utilisations internes en entreprise.
Il s'agit la 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 a un systeme d'authentification pour securiser un peu tout cela.
Bon, l'idee est lancee, il faut la mettre en oeuvre, partons sur une Debian Lenny comme systeme, celle du Raid 1 par exemple, pour memoire et pour celles et ceux qui n'auraient pas lu l'article en question, il s'agit d'un serveur equipe d'un systeme Debian Lenny, monte sur un RAID 1 grâce a mdma, le tout dans VirtualBox, cette VM est vue comme une machine physique sur mon reseau 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.
Commencons !
On peut installer l'ensemble des composants en meme temps, cependant, limitons nous a la partie web pour le moment, et installonsle serveur Apache 2 ainsi que quelques outils qui pourraient etre necessaires :
Code BASH :
Nous venons d'installer le serveur web, un serveur de bases de donnees ainsi qu'un langage web tres repandu en deux secondes !
Il y a tres peu de configuration a faire pour obtenir une page accessible depuis le reseau, cela se situe principalement au niveau du serveur Apache qu'il faut regarder un peu, c'est tres facile de voir son fichier de configuration sans les commentaires et c'est bien plus rapide d'y voir quelque chose !
Code BASH :
Cela nous a donne un apercu 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'editer maintenant pour modifier quelques parametres en prenant soin d'en garder une copie de sauvegarde avant.
Code BASH :
Juste au dessus de la directive ServerRoot, rajouter la suivante :
Code BASH :
Cette directive indique a apache sur quelle adresse et port il doit s'identifier lui meme. 192.167.1.141 est l'adresse de la machine virtuelle, 80 le port d'ecoute par defaut.
Apres ca, on va faire en sorte qu'Apache n'envoie pas trop de detail sur qui il est ! Cela se passe dans le fichier security. Dans ce fichier, on peut definir la quantite d'infos qu'Apache envoie a son sujet (systeme sur lequel il tourne par exemple).
Code BASH :
Ici, on va d'abord se rendre a la ligne ou se situe la directive ServerTokens, on peut attribuer plusieurs niveaux a celle ci :
Chacunes designent un niveau d'info envoyees, ici je choisis Prod, pour ne rien envoyer, j'ajoute :
Code BASH :
Ensuite, pour ne pas envoyer le nom du serveur en lui meme, juste en dessous, passons la directive serverSignature sur off
Code BASH :
On reload la configuration dans le serveur pour prendre en compte immediatement ces changements :
Code BASH :
Voila pour la partie web !
Notre serveur est correctement configure et pret a accueillir de simples fichiers html statiques a afficher ou une structure de site dynamique grâce au serveur de bases de donnees et a 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 etre beaucoup plus exigeant que dans un precedent 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 facon a ce que seule une personne identifiee puisse s'y connecter, mais aussi de facon a ce que le serveur ne soit pas constamment en ecoute, mais se reveille 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 systeme d'authentification simple et tres securise, grâce a lui, nos utilisateurs seront listes dans un fichier bien specifique accompagne de leurs mots de passes respectifs cryptes. Enfin xinetd s'occupera de mettre le serveur ftp en ecoute quand un utilisateur se sera authentifie avec succes, puis d'inverser cet etat dans le cas contraire, ainsi le serveur ne reste pas constamment en ecoute et rajoute un petit plus en securite.
Alors, pour realiser tout cela, il nous faut installer vsftpd, xinetd, apache2-utils et la libpam-pwdfile si elle n'est pas presente.
Code BASH :
On reviendra sur le pourquoi du apache2-utils...
Observons la configuration par defaut de vsftpd :
Code BASH :
On peux voir que la configuration ne correspond pas vraiment a ce que l'on cherche !
Code BASH :
Il faut changer quelque parametres, en enlever et en rajouter de sorte qu'a la fin, il ne doit rester que cela :
Code BASH :
J'espere que mes commentaires sont suffisamment clair et explicite.
Passons a l'authentification, on a prevenu 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'a voir dans /etc/pam.d/ pour s'en rendre compte... En installant vsftpd, on a installe une configuration Pam par defaut (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 a installe tout a l'heure le paquet apache2-utils, et bien celui ci permet de generer des fichier passwd pour les serveurs web, mais cela fonctione aussi sur le ftp, c'est un fichier de ce type qui va heberger l'identite de nos utilisateurs sous la forme login mot-de-passe. Donc nous allons creer un fichier vsftpd.passwd qui va contenir un utilisateur "test" mot de passe "test".
Code BASH :
Voila notre premier utilisateur guest cree, construisons lui son repertoire personnel dans /var/www, celui ci s'appelera test, forcement.
Pour creer d'autres utilisateurs, la commande sera la suivante :
htpasswd /etc/vsftpd.passwd utilisateur
Le mot de passe du nouvel utilisateur sera demande. A noter que ces utilisateurs sont "virtuels", ils sont exterieur au systeme et qu'il faudra leurs creer un home correspondant dans /var/www.
Maintenant, il nous faut creer 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 cree dans /etc/vsftpd/vsftpd_user_conf/ et on y place ca dedans :
Code BASH :
La, on le restreint dans son seul et unique repertoire, 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 :
Ici on a indique que Pam trouverait les cartes d'identites des utilisateurs autorises dans le fichier vsftpd.passwd genere precedemment, on lui dit aussi que la bibliotheque pam_pwdfile.so lui permettrait de dechiffrer les passwords et qu'ainsi elle pourra ouvrir le compte utilisateur avec la cle pam_permit.so
La fin approche, il ne reste plus qu'a indiquer au super serveur xinetd qu'il doit reveiller vsftpd en cas de demande, pour cela, il suffit d'ajouter un fichier vsftpd dans /etc/xinetd.d/ et qui decrira les conditions du service.
Code BASH :
Detaillons un peut toutes ces options :
Voia, a partir d'ici, il suffit de relancer tous les services concernes 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 immediatement via un navigateur internet !
Tout ceci est bien chouette et un peu plus securise que la normale, mais les echanges ftp sur le reseau ne le sont pas tellement, pour remedier a cela, nous allons mettre en place SSL afin de chiffrer toutes ces transactions.... Je vous montrerai cela dans la deuxieme partie de cet article.
Il s'agit la 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 a un systeme d'authentification pour securiser un peu tout cela.
Bon, l'idee est lancee, il faut la mettre en oeuvre, partons sur une Debian Lenny comme systeme, celle du Raid 1 par exemple, pour memoire et pour celles et ceux qui n'auraient pas lu l'article en question, il s'agit d'un serveur equipe d'un systeme Debian Lenny, monte sur un RAID 1 grâce a mdma, le tout dans VirtualBox, cette VM est vue comme une machine physique sur mon reseau 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.
Commencons !
On peut installer l'ensemble des composants en meme temps, cependant, limitons nous a la partie web pour le moment, et installonsle serveur Apache 2 ainsi que quelques outils qui pourraient etre necessaires :
Code BASH :
apt-get install apache2 mysql-server php5 php5 mysql phpmyadmin
Nous venons d'installer le serveur web, un serveur de bases de donnees ainsi qu'un langage web tres repandu en deux secondes !
Il y a tres peu de configuration a faire pour obtenir une page accessible depuis le reseau, cela se situe principalement au niveau du serveur Apache qu'il faut regarder un peu, c'est tres 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 a donne un apercu 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'editer maintenant pour modifier quelques parametres 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:80Cette directive indique a apache sur quelle adresse et port il doit s'identifier lui meme. 192.167.1.141 est l'adresse de la machine virtuelle, 80 le port d'ecoute par defaut.
Apres ca, on va faire en sorte qu'Apache n'envoie pas trop de detail sur qui il est ! Cela se passe dans le fichier security. Dans ce fichier, on peut definir la quantite d'infos qu'Apache envoie a son sujet (systeme sur lequel il tourne par exemple).
Code BASH :
nano /etc/apache2/conf.d/security
Ici, on va d'abord se rendre a la ligne ou se situe la directive ServerTokens, on peut attribuer plusieurs niveaux a celle ci :
- Full
- OS
- Minimal
- Minor
- Major
- Prod
Chacunes designent un niveau d'info envoyees, 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 meme, juste en dessous, passons la directive serverSignature sur off
Code BASH :
ServerSignature Off
On reload la configuration dans le serveur pour prendre en compte immediatement ces changements :
Code BASH :
/etc/init.d/apache2 reload
Voila pour la partie web !
Notre serveur est correctement configure et pret a accueillir de simples fichiers html statiques a afficher ou une structure de site dynamique grâce au serveur de bases de donnees et a 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 etre beaucoup plus exigeant que dans un precedent 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 facon a ce que seule une personne identifiee puisse s'y connecter, mais aussi de facon a ce que le serveur ne soit pas constamment en ecoute, mais se reveille 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 systeme d'authentification simple et tres securise, grâce a lui, nos utilisateurs seront listes dans un fichier bien specifique accompagne de leurs mots de passes respectifs cryptes. Enfin xinetd s'occupera de mettre le serveur ftp en ecoute quand un utilisateur se sera authentifie avec succes, puis d'inverser cet etat dans le cas contraire, ainsi le serveur ne reste pas constamment en ecoute et rajoute un petit plus en securite.
Alors, pour realiser tout cela, il nous faut installer vsftpd, xinetd, apache2-utils et la libpam-pwdfile si elle n'est pas presente.
Code BASH :
apt-get install vsftpd xinetd apache2-utils libpam-pwdfile
On reviendra sur le pourquoi du apache2-utils...
Observons la configuration par defaut 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 parametres, en enlever et en rajouter de sorte qu'a la fin, il ne doit rester que cela :
Code BASH :
#Le serveur n'ecoute pas en continue. listen=NO #Pas de connections anonymes. anonymous_enable=NO #Connections des logins locaux acceptees local_enable=YES #Les users hors systeme possedent les memes privileges 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 declare dans la configuration Pam. pam_service_name=vsftpd #On autorise les connections invitees afin de les "convertir" vers une nouvelle identite. guest_enable=YES #Puisque c'est pour manipuler du contenu web, www-data et l identite qui convient. guest_username=www-data #Permet de creer des repertoires personnels a la volee en fonction du contenu de guest_username. #Si l utilisateur est www-data, son repertoire devrait etre /var/www/homes/$USER. #Ainsi chaque guest aura son repertoire 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 identite ftp:ftp. #Permet egalement de masquer le nom du serveur. hide_ids=YES #On conserve une trace de toute connections ou tentative. xferlog_enable=YES #On determine ou seront les fichier de configuration de chaque utilisateur virtuel. user_config_dir=/etc/vsftpd/vsftpd_user_conf
J'espere que mes commentaires sont suffisamment clair et explicite.
Passons a l'authentification, on a prevenu 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'a voir dans /etc/pam.d/ pour s'en rendre compte... En installant vsftpd, on a installe une configuration Pam par defaut (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 a installe tout a l'heure le paquet apache2-utils, et bien celui ci permet de generer des fichier passwd pour les serveurs web, mais cela fonctione aussi sur le ftp, c'est un fichier de ce type qui va heberger l'identite de nos utilisateurs sous la forme login mot-de-passe. Donc nous allons creer un fichier vsftpd.passwd qui va contenir un utilisateur "test" mot de passe "test".
Code BASH :
htpasswd -b -c /etc/vsftpd.passwd test test
Voila notre premier utilisateur guest cree, construisons lui son repertoire personnel dans /var/www, celui ci s'appelera test, forcement.
Pour creer d'autres utilisateurs, la commande sera la suivante :
htpasswd /etc/vsftpd.passwd utilisateur
Le mot de passe du nouvel utilisateur sera demande. A noter que ces utilisateurs sont "virtuels", ils sont exterieur au systeme et qu'il faudra leurs creer un home correspondant dans /var/www.
Maintenant, il nous faut creer 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 cree dans /etc/vsftpd/vsftpd_user_conf/ et on y place ca 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
La, on le restreint dans son seul et unique repertoire, 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 indique que Pam trouverait les cartes d'identites des utilisateurs autorises dans le fichier vsftpd.passwd genere precedemment, on lui dit aussi que la bibliotheque pam_pwdfile.so lui permettrait de dechiffrer les passwords et qu'ainsi elle pourra ouvrir le compte utilisateur avec la cle pam_permit.so
La fin approche, il ne reste plus qu'a indiquer au super serveur xinetd qu'il doit reveiller vsftpd en cas de demande, pour cela, il suffit d'ajouter un fichier vsftpd dans /etc/xinetd.d/ et qui decrira les conditions du service.
Code BASH :
nano /etc/xinetd.d/vsftpd # Conditions pour le reveil 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 }
Detaillons un peut toutes ces options :
- disable : Active ou non le service demande.
- socket_type : on determine le type de binaire qui traitera le flux.
- wait : Determine si xinetd pourra gerer plusieurs connections.
- user : Identite sous laquelle le service s'executera.
- server : Chemin vers l'executable.
- per_source : Determine le nombre max de connections simultanees par adresse source.
- instances : La meme qu'au dessus, mais pour toutes les sources.
- only_from : Determine qui peut etre une source.
- banner_fail : Texte renvoye si le serveur ne repond pas.
- log_on_success : Permet de specifier les infos qui seront inscrite dans les journaux
- log_on_failure : La meme qu'au dessus, mais pour les echecs de connections.
Voia, a partir d'ici, il suffit de relancer tous les services concernes 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 immediatement via un navigateur internet !
Tout ceci est bien chouette et un peu plus securise que la normale, mais les echanges ftp sur le reseau ne le sont pas tellement, pour remedier a cela, nous allons mettre en place SSL afin de chiffrer toutes ces transactions.... Je vous montrerai cela dans la deuxieme partie de cet article.
Ecrit par: le furtif, Le: 16/06/10
Suggestion : Undefined index: dark_nature dans le fichier /web/tekniko/linux/kernel/header.php à la ligne 243

