Nous venons de voir comment mettre en oeuvre de facon securise un serveur ftp avec vsftpd/pam/xinetd, nous allons voir maintenant, afin de nous securiser un peu plus, comment crypter ces echanges ftp avec OpenSSL.
OpenSSL c'est quoi ? Et bien c'est une boite a outils comme dit sur le Wikipedia, des bibliotheques ainsi que des commandes en ligne, et avec ces outils, nous allons pouvoir crypter nos echanges, c'est le meme principe que lorsque vous achetez un produit quelconque sur le web, generalement, au moment de banquer vous devez signer un certificat de securite un peu obscur, puis vous passez en mode "securise" (https), a partir de la, les donnees qui transitent entre vous et le "site" (numero de carte bancaire, coordonnees etc...) sont cryptees. C'est le resultat d'Openssl couple au serveur Apache, nous, nous allons le coupler a Vsftpd, le principe restera le meme mise a part que ce sera le protocole ftp qui sera crypte (ftps)et non http.
Ah oui, cette histoire de certificat...En quoi cela ajoute t'il une securite ?? Normalement, on se creer un certificat avec nos coordonnees, mail, le domaine du site..., puis on le soumet a un organisme de verification qui certifiera de notre identite en signant notre certif, comme ca, le client qui va voir notre beau certificat constatera que machin l'a verifie et il pourra donc le signer et ainsi avoir une confiance aveugle, ou presque.
c'est super mais ca coute beaucoup de sous de faire signer son certificat par les gens qui vont bien... Alors comme c'est la crise, on va s'auto-certifier nos certificat, on va les signer nous meme !
Commencons !
Nous repartons sur la configuration du premier article, donc notre serveur ftp est deja fonctionnel, il ne reste plus qu'a installer OpenSSL, generer les certificats, avertir vsftpd du changement et enfin, configurer le client ftp pour qu'il soit sur le protocole ftps pour pouvoir se connecter.
Code BASH :
Sera necessaire mais il est tres probable qu'il soit deja installe. Le fait qu'il soit installe ne veut pas dire qu'il ne reste qu'a ajouter deux ou trois choses. On va commencer par creer un repertoire qui contiendra deux sous repertoires, un pour la base de donnees des certificats que nous signerons (prive), un autre pour les demande et ceux que l'on generera (newcerts).
Code BASH :
Jusque la rien de transcendant, creons la base de donnees qui accueillera les futurs certificats que nous signerons :
Code BASH :
Maintenant, nous allons creer un fichier de configuration specifique que nous agrementerons au fur et a mesure du courant. Pour le moment, on y met que ca :
Code BASH :
Voila tout ce qu'il faut preciser pour commencer, ce fichier est modulaire, differentes sections peuvent le composer, et certaine section peuvent avoir besoin d'autres sections... Chaque section commence par un nom entre crochets, ici cest : REQ.
Dans ce fichier, il n'a que la section concernant les coordonnees propre a la demande d'un certificat qui soit la mais nous pouvons des maintenant creer notre certificat racine et se l'auto-signer avec cette commande :
Code BASH :
Je vous invite a lire la page de man d'OpenSSL pour plus d'infos, ici, on passe une requete pour avoir un nouveau certificat signable, il devrait placer la certificat d'autorite dans le repertoire courant (/etc/CA si on est deja dedans), celui ci sera valable 650 jours, et la cle privee qui va avec dans private, et il devra faire tout ca en fonction de la configuration presente dans son fichier de conf.
Dors et deja, avec notre nouveau certificat d'autorite racine (cacert.pem), nous pouvons creer n'importe quel nombre de "sous" certificats pour differentes applications (https, fpts, simap...). Il faut maintenant creer l'invitation a signer notre certificat, on va rajouter des parametres au fichier de conf :
Code BASH :
A placer en dessous de la ligne
distinguished_name = req_distinguished_name
Ensuite, a la fin du fichier rajouter ceci :
Code BASH :
creons cet invitation :
Code BASH :
Ce processus cree deux fichiers, une cle prive key.pem et l'invitation a signer qui va avec req.pem, qu'il serait preferable de renommer si on utilise SSL sur plusieurs services.
On a notre certificat d'autorite racine, on a notre invitation a signer, certifions nous en nous signant alors ! Une derniere fois, on edite le fichier de conf pour lui rajouter les choses qui vont bien, a savoir la ou il trouvera la base de donnees, ou est la cle privee... Ajoutons ces quelques ligne avant la section req :
Code BASH :
Maintenant signons le !!!
Code BASH :
Nous venons de creer deux nouveau fichiers, notre certificat signe (enfin) et une copie de celui ci dans newcerts. Ce certificat comporte deux version, une codee, une humainement comprehensible, enlevons cette derniere pour plus de securite :
Code BASH :
L'installation du certificat et de sa cle depend de l'application de destination, pour vsftpd, on va fusionner ces deux derniers :
Code BASH :
Pour finir, expliquons a vsftpd qu'il doit gerer le SSL et que les logins/passwords ainsi que tout le transite ftp, devront etre cryptes, et ou se trouve le certificat et la cle SSL.
Code BASH :
Voili voilou, on relance vsftpd et l'affaire et dans le sac. A noter que tout les clients ftp ne gere pas forcement le ftps ou ftpes Pour moi cela a fonctionne avec FileZilla en mode ftpes
OpenSSL c'est quoi ? Et bien c'est une boite a outils comme dit sur le Wikipedia, des bibliotheques ainsi que des commandes en ligne, et avec ces outils, nous allons pouvoir crypter nos echanges, c'est le meme principe que lorsque vous achetez un produit quelconque sur le web, generalement, au moment de banquer vous devez signer un certificat de securite un peu obscur, puis vous passez en mode "securise" (https), a partir de la, les donnees qui transitent entre vous et le "site" (numero de carte bancaire, coordonnees etc...) sont cryptees. C'est le resultat d'Openssl couple au serveur Apache, nous, nous allons le coupler a Vsftpd, le principe restera le meme mise a part que ce sera le protocole ftp qui sera crypte (ftps)et non http.
Ah oui, cette histoire de certificat...En quoi cela ajoute t'il une securite ?? Normalement, on se creer un certificat avec nos coordonnees, mail, le domaine du site..., puis on le soumet a un organisme de verification qui certifiera de notre identite en signant notre certif, comme ca, le client qui va voir notre beau certificat constatera que machin l'a verifie et il pourra donc le signer et ainsi avoir une confiance aveugle, ou presque.
c'est super mais ca coute beaucoup de sous de faire signer son certificat par les gens qui vont bien... Alors comme c'est la crise, on va s'auto-certifier nos certificat, on va les signer nous meme !
Commencons !
Nous repartons sur la configuration du premier article, donc notre serveur ftp est deja fonctionnel, il ne reste plus qu'a installer OpenSSL, generer les certificats, avertir vsftpd du changement et enfin, configurer le client ftp pour qu'il soit sur le protocole ftps pour pouvoir se connecter.
Code BASH :
apt-get install openssl
Sera necessaire mais il est tres probable qu'il soit deja installe. Le fait qu'il soit installe ne veut pas dire qu'il ne reste qu'a ajouter deux ou trois choses. On va commencer par creer un repertoire qui contiendra deux sous repertoires, un pour la base de donnees des certificats que nous signerons (prive), un autre pour les demande et ceux que l'on generera (newcerts).
Code BASH :
mkdir /etc/CA # CA pour Certificat d'Autorite. cd CA mkdir prive newcerts
Jusque la rien de transcendant, creons la base de donnees qui accueillera les futurs certificats que nous signerons :
Code BASH :
echo '01' > serial touch index.txt
Maintenant, nous allons creer un fichier de configuration specifique que nous agrementerons au fur et a mesure du courant. Pour le moment, on y met que ca :
Code BASH :
nano /etc/CA/openssl.cnf # OpenSSL configuration file. # # Establish working directory. dir = . [Req] default_bits = 1024 # Taille des touches key.pem default_keyfile = # nom de cles generees default_md = md5 message # algorithme de string_mask = # nombstr permis caracteres distinguished_name = req_distinguished_name ] Req_distinguished_name [ # Nom de la variable de chaîne rapide #---------------------- --------------------------- ------- 0.organizationName = Nom organisation (entreprise) organizationalUnitName = Unite organisation Nom (departement, division) emailAddress = Adresse Email emailAddress_max = 40 Nom Localite localityName = (ville, district) stateOrProvinceName = nom etat ou la province (nom complet) Nom Pays countryName = (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Nom commun (nom hôte, IP, ou votre nom) commonName_max = 64 # Les valeurs par defaut pour ce qui precede, par souci de coherence et moins de frappe. # Nom de la variable Valeur #------------------------------ ------------------- ----------- 0.organizationName_default = La Societe echantillon localityName_default = Metropolis stateOrProvinceName_default = New York countryName_default = US [V3_ca] basicConstraints = CA: TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid: toujours, l'emetteur: toujours
Voila tout ce qu'il faut preciser pour commencer, ce fichier est modulaire, differentes sections peuvent le composer, et certaine section peuvent avoir besoin d'autres sections... Chaque section commence par un nom entre crochets, ici cest : REQ.
Dans ce fichier, il n'a que la section concernant les coordonnees propre a la demande d'un certificat qui soit la mais nous pouvons des maintenant creer notre certificat racine et se l'auto-signer avec cette commande :
Code BASH :
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 650 -config ./openssl.cnf
Je vous invite a lire la page de man d'OpenSSL pour plus d'infos, ici, on passe une requete pour avoir un nouveau certificat signable, il devrait placer la certificat d'autorite dans le repertoire courant (/etc/CA si on est deja dedans), celui ci sera valable 650 jours, et la cle privee qui va avec dans private, et il devra faire tout ca en fonction de la configuration presente dans son fichier de conf.
Dors et deja, avec notre nouveau certificat d'autorite racine (cacert.pem), nous pouvons creer n'importe quel nombre de "sous" certificats pour differentes applications (https, fpts, simap...). Il faut maintenant creer l'invitation a signer notre certificat, on va rajouter des parametres au fichier de conf :
Code BASH :
req_extensions = v3_req
A placer en dessous de la ligne
distinguished_name = req_distinguished_name
Ensuite, a la fin du fichier rajouter ceci :
Code BASH :
[V3_req] basicConstraints = CA: FALSE subjectKeyIdentifier = hash
creons cet invitation :
Code BASH :
openssl req -new -nodes -out req.pem -config ./openssl.cnf
Ce processus cree deux fichiers, une cle prive key.pem et l'invitation a signer qui va avec req.pem, qu'il serait preferable de renommer si on utilise SSL sur plusieurs services.
On a notre certificat d'autorite racine, on a notre invitation a signer, certifions nous en nous signant alors ! Une derniere fois, on edite le fichier de conf pour lui rajouter les choses qui vont bien, a savoir la ou il trouvera la base de donnees, ou est la cle privee... Ajoutons ces quelques ligne avant la section req :
Code BASH :
[ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem private_key = $dir/private/cakey.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Maintenant signons le !!!
Code BASH :
openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
Nous venons de creer deux nouveau fichiers, notre certificat signe (enfin) et une copie de celui ci dans newcerts. Ce certificat comporte deux version, une codee, une humainement comprehensible, enlevons cette derniere pour plus de securite :
Code BASH :
mv cert.pem tmp.pem openssl x509 -in tmp.pem -out cert.pem
L'installation du certificat et de sa cle depend de l'application de destination, pour vsftpd, on va fusionner ces deux derniers :
Code BASH :
cat key.pem cert.pem >key-cert.pem
Pour finir, expliquons a vsftpd qu'il doit gerer le SSL et que les logins/passwords ainsi que tout le transite ftp, devront etre cryptes, et ou se trouve le certificat et la cle SSL.
Code BASH :
nano /etc/vsftpd.conf listen=NO anonymous_enable=NO local_enable=YES virtual_use_local_privs=YES write_enable=YES connect_from_port_20=YES pam_service_name=vsftpd guest_enable=YES guest_username=www-data user_sub_token=/var/www/$USER local_root=/var/www/$USER chroot_local_user=YES hide_ids=YES xferlog_enable=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf # Pour le SSL ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=NO force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES rsa_cert_file=/etc/CA/key-cert.pem
Voili voilou, on relance vsftpd et l'affaire et dans le sac. A noter que tout les clients ftp ne gere pas forcement le ftps ou ftpes Pour moi cela a fonctionne avec FileZilla en mode ftpes
Ecrit par: le furtif, Le: 17/06/10
Suggestion : Undefined index: dark_nature dans le fichier /web/tekniko/linux/kernel/header.php à la ligne 243

