Nous venons de voir comment mettre en oeuvre de façon sécurisé un serveur ftp avec vsftpd/pam/xinetd, nous allons voir maintenant, afin de nous sécuriser un peu plus, comment crypter ces échanges ftp avec OpenSSL.
OpenSSL c'est quoi ? Et bien c'est une boite à outils comme dit sur le Wikipédia, des bibliothèques ainsi que des commandes en ligne, et avec ces outils, nous allons pouvoir crypter nos échanges, c'est le même principe que lorsque vous achetez un produit quelconque sur le web, généralement, au moment de banquer vous devez signer un certificat de sécurité un peu obscur, puis vous passez en mode "sécurisé" (https), a partir de la, les données qui transitent entre vous et le "site" (numéro de carte bancaire, coordonnées etc...) sont cryptées. C'est le résultat d'Openssl couplé au serveur Apache, nous, nous allons le coupler à Vsftpd, le principe restera le même mise à part que ce sera le protocole ftp qui sera crypté (ftps)et non http.
Ah oui, cette histoire de certificat...En quoi cela ajoute t'il une sécurité ?? Normalement, on se créer un certificat avec nos coordonnées, mail, le domaine du site..., puis on le soumet à un organisme de vérification qui certifiera de notre identité en signant notre certif, comme ça, le client qui va voir notre beau certificat constatera que machin l'a vérifié et il pourra donc le signer et ainsi avoir une confiance aveugle, ou presque.
c'est super mais ça 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 même !
Commençons !
Nous repartons sur la configuration du premier article, donc notre serveur ftp est déjà fonctionnel, il ne reste plus qu'à installer OpenSSL, générer 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 nécessaire mais il est très probable qu'il soit déjà installé. Le fait qu'il soit installé ne veut pas dire qu'il ne reste qu'a ajouter deux ou trois choses. On va commencer par créer un répertoire qui contiendra deux sous répertoires, un pour la base de données des certificats que nous signerons (privé), un autre pour les demande et ceux que l'on générera (newcerts).
Code BASH :
Jusque là rien de transcendant, créons la base de données qui accueillera les futurs certificats que nous signerons :
Code BASH :
Maintenant, nous allons créer un fichier de configuration spécifique que nous agrémenterons au fur et à mesure du courant. Pour le moment, on y met que ça :
Code BASH :
Voila tout ce qu'il faut préciser pour commencer, ce fichier est modulaire, différentes 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 coordonnées propre a la demande d'un certificat qui soit là mais nous pouvons des maintenant créer 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 requête pour avoir un nouveau certificat signable, il devrait placer la certificat d'autorité dans le répertoire courant (/etc/CA si on est déjà dedans), celui ci sera valable 650 jours, et la clé privée qui va avec dans private, et il devra faire tout ça en fonction de la configuration présente dans son fichier de conf.
Dors et déjà, avec notre nouveau certificat d'autorité racine (cacert.pem), nous pouvons créer n'importe quel nombre de "sous" certificats pour différentes applications (https, fpts, simap...). Il faut maintenant créer l'invitation à signer notre certificat, on va rajouter des paramètres au fichier de conf :
Code BASH :
A placer en dessous de la ligne
distinguished_name = req_distinguished_name
Ensuite, à la fin du fichier rajouter ceci :
Code BASH :
créons cet invitation :
Code BASH :
Ce processus crée deux fichiers, une clé privé key.pem et l'invitation à signer qui va avec req.pem, qu'il serait préférable de renommer si on utilise SSL sur plusieurs services.
On a notre certificat d'autorité racine, on a notre invitation a signer, certifions nous en nous signant alors ! Une derniere fois, on édite le fichier de conf pour lui rajouter les choses qui vont bien, a savoir la ou il trouvera la base de données, ou est la clé privée... Ajoutons ces quelques ligne avant la section req :
Code BASH :
Maintenant signons le !!!
Code BASH :
Nous venons de créer deux nouveau fichiers, notre certificat signé (enfin) et une copie de celui ci dans newcerts. Ce certificat comporte deux version, une codée, une humainement compréhensible, enlevons cette dernière pour plus de sécurité :
Code BASH :
L'installation du certificat et de sa clé dépend de l'application de destination, pour vsftpd, on va fusionner ces deux derniers :
Code BASH :
Pour finir, expliquons à vsftpd qu'il doit gérer le SSL et que les logins/passwords ainsi que tout le transite ftp, devront être cryptés, et ou se trouve le certificat et la clé SSL.
Code BASH :
Voili voilou, on relance vsftpd et l'affaire et dans le sac. A noter que tout les clients ftp ne gère pas forcément le ftps ou ftpes Pour moi cela a fonctionné avec FileZilla en mode ftpes
OpenSSL c'est quoi ? Et bien c'est une boite à outils comme dit sur le Wikipédia, des bibliothèques ainsi que des commandes en ligne, et avec ces outils, nous allons pouvoir crypter nos échanges, c'est le même principe que lorsque vous achetez un produit quelconque sur le web, généralement, au moment de banquer vous devez signer un certificat de sécurité un peu obscur, puis vous passez en mode "sécurisé" (https), a partir de la, les données qui transitent entre vous et le "site" (numéro de carte bancaire, coordonnées etc...) sont cryptées. C'est le résultat d'Openssl couplé au serveur Apache, nous, nous allons le coupler à Vsftpd, le principe restera le même mise à part que ce sera le protocole ftp qui sera crypté (ftps)et non http.
Ah oui, cette histoire de certificat...En quoi cela ajoute t'il une sécurité ?? Normalement, on se créer un certificat avec nos coordonnées, mail, le domaine du site..., puis on le soumet à un organisme de vérification qui certifiera de notre identité en signant notre certif, comme ça, le client qui va voir notre beau certificat constatera que machin l'a vérifié et il pourra donc le signer et ainsi avoir une confiance aveugle, ou presque.
c'est super mais ça 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 même !
Commençons !
Nous repartons sur la configuration du premier article, donc notre serveur ftp est déjà fonctionnel, il ne reste plus qu'à installer OpenSSL, générer 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 nécessaire mais il est très probable qu'il soit déjà installé. Le fait qu'il soit installé ne veut pas dire qu'il ne reste qu'a ajouter deux ou trois choses. On va commencer par créer un répertoire qui contiendra deux sous répertoires, un pour la base de données des certificats que nous signerons (privé), un autre pour les demande et ceux que l'on générera (newcerts).
Code BASH :
mkdir /etc/CA # CA pour Certificat d'Autorité. cd CA mkdir privé newcerts
Jusque là rien de transcendant, créons la base de données qui accueillera les futurs certificats que nous signerons :
Code BASH :
echo '01' > serial touch index.txt
Maintenant, nous allons créer un fichier de configuration spécifique que nous agrémenterons au fur et à mesure du courant. Pour le moment, on y met que ça :
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 clés générées default_md = md5 message # algorithme de string_mask = # nombstr permis caractères distinguished_name = req_distinguished_name ] Req_distinguished_name [ # Nom de la variable de chaîne rapide #---------------------- --------------------------- ------- 0.organizationName = Nom organisation (entreprise) organizationalUnitName = Unité organisation Nom (département, division) emailAddress = Adresse Email emailAddress_max = 40 Nom Localité localityName = (ville, district) stateOrProvinceName = nom état 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 défaut pour ce qui précède, par souci de cohérence et moins de frappe. # Nom de la variable Valeur #------------------------------ ------------------- ----------- 0.organizationName_default = La Société échantillon localityName_default = Metropolis stateOrProvinceName_default = New York countryName_default = US [V3_ca] basicConstraints = CA: TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid: toujours, l'émetteur: toujours
Voila tout ce qu'il faut préciser pour commencer, ce fichier est modulaire, différentes 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 coordonnées propre a la demande d'un certificat qui soit là mais nous pouvons des maintenant créer 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 requête pour avoir un nouveau certificat signable, il devrait placer la certificat d'autorité dans le répertoire courant (/etc/CA si on est déjà dedans), celui ci sera valable 650 jours, et la clé privée qui va avec dans private, et il devra faire tout ça en fonction de la configuration présente dans son fichier de conf.
Dors et déjà, avec notre nouveau certificat d'autorité racine (cacert.pem), nous pouvons créer n'importe quel nombre de "sous" certificats pour différentes applications (https, fpts, simap...). Il faut maintenant créer l'invitation à signer notre certificat, on va rajouter des paramètres au fichier de conf :
Code BASH :
req_extensions = v3_req
A placer en dessous de la ligne
distinguished_name = req_distinguished_name
Ensuite, à la fin du fichier rajouter ceci :
Code BASH :
[V3_req] basicConstraints = CA: FALSE subjectKeyIdentifier = hash
créons cet invitation :
Code BASH :
openssl req -new -nodes -out req.pem -config ./openssl.cnf
Ce processus crée deux fichiers, une clé privé key.pem et l'invitation à signer qui va avec req.pem, qu'il serait préférable de renommer si on utilise SSL sur plusieurs services.
On a notre certificat d'autorité racine, on a notre invitation a signer, certifions nous en nous signant alors ! Une derniere fois, on édite le fichier de conf pour lui rajouter les choses qui vont bien, a savoir la ou il trouvera la base de données, ou est la clé privée... 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 créer deux nouveau fichiers, notre certificat signé (enfin) et une copie de celui ci dans newcerts. Ce certificat comporte deux version, une codée, une humainement compréhensible, enlevons cette dernière pour plus de sécurité :
Code BASH :
mv cert.pem tmp.pem openssl x509 -in tmp.pem -out cert.pem
L'installation du certificat et de sa clé dépend 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 à vsftpd qu'il doit gérer le SSL et que les logins/passwords ainsi que tout le transite ftp, devront être cryptés, et ou se trouve le certificat et la clé 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 gère pas forcément le ftps ou ftpes Pour moi cela a fonctionné avec FileZilla en mode ftpes
Ecrit par: le furtif, Le: 17/06/10






