Sécuriser son CMS - Howto

Submitted by tba on Fri, 2006-06-02 11:24. ::
Pour pouvoir sécuriser mon CMS j'ai procédé comme suit, d'abord, j'ai crée l'arborescence suivante dans /usr/share/ssl
tba.com/

|-- certs/

|-- crl/

|-- index.txt

|-- newcerts/

|-- private/

|-- serial


# mkdir -p /usr/share/ssl/tba.com/{certs,crl,newcerts,private}
# touch /usr/share/ssl/tba.com/index.txt
# echo "01" > /usr/share/ssl/tba.com/serial

Par la suite il fallait modifier le fichier /usr/share/ssl/openssl.cnf pour qu'il reconnaisse cette arborescence
# cp /usr/share/ssl/openssl.cnf /usr/share/ssl/openssl.old (afin de faire une copie de sauvegarde)
# cd /usr/share/ssl && vi openssl.cnf


[ ca ]


default_ca = tba_com # The default ca section

####################################################################

[tba_com ]

dir = /usr/share/ssl/tba.com # Where everything is kept

certs = $dir/certs # Where the issued certs are kept

crl_dir = $dir/crl # Where the issued crl are kept

database = $dir/index.txt
Il fallait modifier le chemin de l'autorité de certification dans mon cas c'est /usr/share/ssl/tba.com, ensuite faire quelques modification dans la partie [ req_distinguished_name ]
[ req_distinguished_name ]

countryName = Country Name (2 letter code)

countryName_default = TN

countryName_min = 2

countryName_max = 2

stateOrProvinceName = State or Province Name (full name)

stateOrProvinceName_default = Some-State

localityName = Locality Name (eg, city)

localityName_default = La Marsa

0.organizationName = Organization Name (eg, company)

0.organizationName_default = Master E-Services
Afin de spécifier les paramètres par défaut des certificats lors de leurs création.
Par la suite il fallait créer les clés et les certificats de l'autorité de certification.
# cd /usr/share/ssl/tba.com
# openssl req -config /usr/share/ssl/openssl.cnf -x509 -newkey rsa:1024 -days 365 -keyout private/cakey.pem -out cacert.pem

On produit ainsi le certificat et la clé de l'autorité la clé est stockée dans /usr/share/ssl/tba.com/private/cakey.pem et le certificat dans /usr/share/ssl/tba.com/cacert.pem.
Par la suite il faut protéger notre clé privée en n'autorisant l'accès qu'en lecture au root
# chmod -R 600 /usr/share/ssl/tba/tba.com/private
On génère à présent la paire de clés ainsi que la demande de certificats que nous signerons par la suite
# cd /home/tahar/Desktop/Master/Securite/Travaux/SSL
# openssl req -config /usr/share/ssl/openssl.cnf -newkey rsa:1024 -keyout cle-privee.key -out cle-publique.req

Maintenant, on signe la demande de certificat et on produit un certificat signé, pour la signature, il faut entrer le mot de passe de la clé privé qu'on a généré au début
# openssl ca -config /usr/share/ssl/openssl.cnf -in cle-publique.req -out certificat.pem
À présent, nous allons installer et générer des certificats serveur pour Apache, d'abord on créé la clé et la demande de certificat
# openssl req -config /etc/ssl/openssl.cnf -newkey rsa:1024 -keyout libertysoft.homelinux.org.key -out libertysoft.homelinux.org.req
Ensuite, on signe la demande de certificat et on produit le certificat qui sera utilisé.
# mkdir /home/tahar/Desktop/Master/Securite/Travaux/SSL/serveur
# cd /home/tahar/Desktop/Master/Securite/Travaux/SSL/serveur
# openssl ca -config /usr/share/ssl/openssl.cnf -in libertysoft.homelinux.org.req -out libertysoft.homelinux.org.pem

Maintenant on place la clé ainsi que le certificat dans le répertoire de stockage d'apache, pour mon cas on les place dans /etc/httpd/conf/
# mv libertysof.homelinux.org.key /etc/httpd/conf/
# mv libertysoft.homelinux.org.pem /etc/httpd/conf/
On modifie par la suite le fichier httpd.conf pour qu'il prenne en considération les certificats et clés serveur, pour mon cas je dois modifier /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf/libertysoft.homelinux.org.pem

SSLCertificateKeyFile /etc/httpd/conf/libertysoft.homelinux.org.key
On met le chemin du certificat et de la clé dans SSLCertificateFile et SSLCertificateKeyFile.
Il ne reste plus qu'à configurer apache pour que toute requête http soit redirigée automatiquement vers https pour cela on modifie le fichier Vhosts.conf pour rajouter un virtual host et faire la redirection ensuite on rajoute la ligne
Include conf/vhosts/Vhosts.conf 
dans /etc/httpd/conf/httpd.conf


DocumentRoot /

ServerName libertysoft.homelinux.org

Redirect / https://libertysoft.homelinux.org

À présent notre serveur est prêt il suffit de relancer Apache pour que les modifications soient prises en compte
service httpd restart
Vu que nos clés sont sécurisées par un mot de passe le système risque de bloquer en attendant de saisir le mot de passe de protection de la clé.
À présent, si on tape l'adresse https://libertysoft.homelinux.org on aura un message d'erreur comme quoi le navigateur ne peut pas faire confiance au certificat vu qu'il n'est pas signé par une autorité de confiance, pour éviter ce message on installe notre CA dans le navigateur en tant qu'autorité de certification.
Pour cela on ouvre Firefox---->Édition---->Préférences---->Avancés------>afficher les certificats et on va à l'onglet Autorités et on importe notre certificat depuis /etc/ssl/tba.com/cacert.pem
Pour l'importer on nous demande de saisir le mot de passe de la clé privée qui a été générée au début.
À présent, la moitié du travail est terminée, il ne reste plus qu'à faire en sorte à ce que uniquement les clients qui présentent un certificat signé par Master E-Services puissent accéder au site,
Pour cela on modifie la configuration d'apache afin de n'accepter que les clients qui présentent un certificat, pour mon cas je dois modifier /etc/httpd/conf.d/ssl.conf on rajoute le chemin pour le certificat de la CA et on enlève le commentaire pour SSLVerifyClient.
SSLCACertificateFile /usr/share/ssl/certs/ca-bundle.crt

SSLVerifyClient require
À présent l'accès au site devient impossible si on ne présente pas un certificat et on obtient une erreur -12227
Maintenant pour empêcher cette erreur il faut créer les certificats client
mkdir /home/tahar/Desktop/Master/Securite/Travaux/SSL/client
cd /home/tahar/Desktop/Master/Securite/Travaux/SSL/client
openssl req -config /usr/share/ssl/openssl.cnf -newkey rsa:1024 -keyout client.key -out client.req

On signe la demande de certificat avec notre AC
openssl ca -config /usr/share/ssl/openssl.cnf -in client.req -out client.pem
Maintenant pour pouvoir importer la bi-clé dans le navigateur et identifier l'utilisateur il faut qu'elle soit au fomat PCKS#12
openssl pkcs12 -export -in client.pem -inkey client.key -out xavier.p12 -name "Xavier Le-Pallec"
Enter pass phrase for client.key:
Enter Export Password: xavier
Verifying - Enter Export Password: xavier
Il ne reste plus qu'à importer le certificat dans le navigateur pour pouvoir accéder à la page le mot de passe d'exportation sera demandé pour l'installer.
Swobodin
Swobodin's picture
Submitted by Swobodin on Fri, 2006-06-02 11:30.

Thanks Tahar for this excellent tutorial. Very instructive!
PS: This article was written for Mandriva, I modified, with Tahar's confirmation, some paths and commands so that it fits with Fedora Core.

No tengo tierra ni casa
No tengo nombre ni edad
Soy como el viento que pasa
¡Un viento de libertad!

tba
Submitted by tba on Mon, 2006-06-05 08:55.

You are welcom my dear friend :)