Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/html/wp-includes/post-template.php on line 284

[ Nginx ] WordPress administration via certificat

 dans Actus, CMS, Dokuwiki, Drupal, Failles, Linux, OSX, Outils, Projets, Sécurité, Serveur, WordPress

Hello !

Cet article a pour but de mettre en place un système d’accès via un certificat client sous Nginx, il remplace donc l’ancienne méthode via le login/password (htpasswd). L’authentification par certificat client vous offre un très bon niveau de sécurité, par contre il est un peu plus complexe à mettre en place (sauf si vous scriptez), et que vous devez installer le certificat client sur chacun des postes où vous devez avoir accès (y compris les mobiles). L’article est aussi basé sur WordPress puisque nous verrons comment mettre en place ce système pour sécuriser l’accès à l’administration, les personnes qui ne présenterons pas le certificat auront une erreur 405 (Not Allowed) masquée par une page 404 de WordPress (oui l’erreur est masquée et c’est pas plus mal).

ssl-cert

ETAPE N°1 – Création du certificat CA

Le certificat CA est le principal, c’est celui-ci qui va signer tous les certificats clients pour faire en sorte qu’ils soient valides et reconnus par le notre service (Nginx). Commençons par créer le CA avec les commandes suivantes, cette opération est a réalisée qu’une fois lors de la mise en place. Je vous laisse modifier certains paramètres si vous avez besoin.

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Ile-de-France
Locality Name (eg, city) [Default City]:Paris
Organization Name (eg, company) [Default Company Ltd]:#DJERFY.com
Organizational Unit Name (eg, section) []:#DJERFY.com
Common Name (eg, your name or your server’s hostname) []:#DJERFY.com – Certificate CA 2
Email Address []:admin.djerfy.com

ETAPE N°2 – Création d’un certificat client

Créons maintenant un certificat client, ici qui sera destiné à « John Doe », pareil je vous laisse vous adapter :

openssl genrsa -out client_johndoe.key 2048
openssl req -new -key client_johndoe.key -out client_johndoe.csr

Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Ile-de-France
Locality Name (eg, city) [Default City]:Paris
Organization Name (eg, company) [Default Company Ltd]:#DJERFY.com
Organizational Unit Name (eg, section) []:#DJERFY.com
Common Name (eg, your name or your server’s hostname) []:John Doe
Email Address []:john.doe@djerfy.com

ETAPE N°3 – Signature du certificat client avec le CA

Pour que notre certificat client soit valide, nous le signons avec notre certificat CA que nous avons créé au début de l’article (étape 1). Rien de plus simple !

openssl x509 -req -days 365 -in client_johndoe.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client_johndoe.crt

Il vous faudra répéter les étapes 2 et 3 pour chacun des clients (personnes) devant avoir les accès.

ETAPE N°4 – Installation des certificats

Maintenant que nous avons terminé la génération des certificats clients, nous passons à l’installation des certificats sur le serveur, côté Nginx. J’ai placés tous mes certificats dans le dossier « /etc/nginx/sites/www.djerfy.com/sslclient/« , je vous laisse vous adapter à la situation 🙂

mkdir -p /etc/nginx/sites/www.djerfy.com/sslclient/
cp ca.crt /etc/nginx/sites/www.djerfy.com/sslclient/

ETAPE N°5 – Configuration du Nginx

Presque terminé, reste maintenant la configuration de notre service Nginx pour gérer l’authentification via ces certificats clients pour l’accès aux pages « wp-login.php » et l’ensemble du dossier « /wp-admin/« . Cette configuration est peut être un peu tordue mais elle fonctionne très bien ! La première partie n’est pas obligatoire mais elle permet de garder la page « wp-login.php » fonctionnelle si vous ne souhaitez pas la bloquer 🙂 N’oubliez pas de mettre votre proxypass !

# Configuration du certificat CA (celui qui signe nos certificats client)
ssl_client_certificate  /etc/nginx/sites/www.djerfy.com/sslclient/ca.crt;
ssl_verify_client  optional;
ssl_verify_depth 2;

# Restriction sur l’accès administration par certificat client (sauf les médias js/css/images)
location ~ /wp-(admin/|login.php) {
if ($request_uri !~ /(css|js|images)/) {
set $wpadmin_access « OK »;
}
if ($ssl_client_verify != « SUCCESS ») {
set $wpadmin_access « PAS${wpadmin_access} »;
}
if ($wpadmin_access = « PASOK ») {
return 405;
}
}

Warning : attention avec les double quotes qui ne seront pas au bon format, il faudra repasser manuellement dessus.
Une fois que c’est terminé, n’oubliez pas de redémarrer votre service (un reload suffit aussi).

ETAPE N°6 – Tester le fonctionnement

Je le répète toujours mais chaque modification effectuée doit être tester et validée. Avec la mise en place effectuée, nous devons avoir le fonctionnement suivant :

  • Accès visiteur sur la page wp-login.php => erreur 405 (affichage de la page 404 de WordPress)
  • Accès administrateur sur la page wp-login.php => présentation du certificat client => autorisé => page de connexion WordPress

Vous pouvez tester ce fonctionnement avec la commande « curl » (c’est le plus simple/rapide) :

# Simulation visiteur
curl -v -s -k https://www.djerfy.com/wp-login.php
>> HTTP/1.1 405 Not Allowed

# Simulation administrateur
curl -v -s -k –key client_johndoe.key –cert client_johndoe.crt https://www.djerfy.com/wp-login.php
>> HTTP/1.1 200 OK

Lorsque nous présentons notre certificat client, nous avons bien notre OK 🙂

ETAPE N°7 – Export du certificat client

Nous avons validé que l’accès par certificat client fonctionne correctement. Maintenant nous allons exporter notre certificat dans un format plus standard, principalement pour les navigateurs (Safari, Chrome, Firefox, …) et mobile (iOS, Android). J’ai choisis ici le format P12 car il est également géré par les mobiles, c’est parti !

openssl pkcs12 -export -out client_johndoe.p12 -in client_johndoe.crt -inkey client_johndoe.key -certfile ca.crt

ETAPE N°8 – Révocation d’un certificat

Mise en garde : La révocation pose quelques problèmes pour le moment (comprendre non fonctionnel), je ne manquerais pas de mettre à jour l’article lorsqu’une solution définitive sera trouvée…

J’en avais pas parlé depuis le début mais la révocation d’un certificat peut très certainement vous servir ! Lancer ci-dessous ces commandes pour la révocation d’un certificat client, ici notre « John Doe » :

openssl ca -revoke client_johndoe.crt -keyfile ca.key -cert ca.crt

Sans oublier de mettre à jour la liste :

openssl ca -gencrl -keyfile ca.key -cert ca.crt -out ca.crl -crldays 1095

Conclusion

Vous l’aurez certainement compris/vus, la mise en place d’une authentification par certificat client prend un peu de temps mais ce temps sera un beau plus sur la sécurité de votre site ! Je recommande de mettre en place cette méthode autant que possible 🙂

Il n’est pas impossible que je sorte un prochain article sur l’installation d’un certificat client sur un navigateur (Safari, Firefox, Chrome) et sur mobile (iOS, Android) si certaines personnes ont du mal à s’en sortir…

BONUS ! Configuration pour Apache !

Vous avez été plusieurs à me demander la même configuration pour le service Apache, voici donc les lignes à rajouter dans votre fichier vhost :

SSLCACertificateFile ‘/etc/httpd/sites/www.djerfy.com/sslclient/ca.crt’
<LocationMatch « ^/wp-(admin/|login\.php) »>
SSLOptions +StdEnvVars
SSLVerifyClient optional
SSLVerifyDepth 2
RewriteEngine On
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$
RewriteRule .* – [F,L]
</LocationMatch>

BONUS (oui encore) ! Dépôt sur Github !

J’ai créé durant le weekend le dépôt « GenerateClientCertificates » sur Github, qui vous permettra de réduire le temps sur la création des certificats clients via un CA. Pour son utilisation, c’est assez facile :

  • Clone du dépôt : git clone https://github.com/djerfy/GenerateClientCertificate.git
  • Configuration du CA : vim etc/GenerateClientCertificate.conf
  • Installation du CA : ./bin/GenerateClientCertificate.sh –install
  • Création d’un certificat pour « John Doe » : ./bin/GenerateClientCertificate.sh –client ‘johndoe’

Remplissez les dernières informations demandés et c’est tout, vous aurez tous vos certificats !

N’hésitez pas à me dire ce que vous en pensez dans les commentaires  (ou sur Twitter) !

++

shinosaki-eru-avatar

Articles recommandés

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.