Sécurisez l’administration de WordPress avec SSL

Publié le 8 mars 2012 Optimisation technique de WordPress
Geoffroy Couprie

Tous les jours, vous entendez parler de sites piratés, de données espionnées sur les réseaux, de mots de passe volés. La sécurité est devenue un aspect inévitable de la gestion d’un site, quelles que soient sa taille ou son audience.

Il existe un certain nombre de techniques permettant de protéger votre site (la première étant la mise à jour régulière). Aujourd’hui, je vous présente l’une d’entre d’elles, SSL.

Description du protocole SSL

Le protocole SSL sert à faire passer une connexion réseau dans un canal sécurisé. Il est souvent associé à HTTP pour former le protocole HTTPS, utilisé pour sécuriser l’accès à un site web.

SSL a trois buts spécifiques:

  • s’assurer que l’on communique bien avec le serveur indiqué (authentification)
  • empêcher quiconque d’observer les données échangées (confidentialité)
  • détecter la modification des données entre le client et le serveur (intégrité)

SSL sert donc principalement à se protéger des attaques man in the middle (lorsque quelqu’un se place entre le navigateur et le serveur). Ce type d’attaque est assez facile à monter sur des réseaux WiFi, ou des réseaux publics (conférences, Starbucks, etc). Ce protocole ne vous protègera pas de vulnérabilités comme XSS ou les injections SQL.

WordPress SSL Admin
Sécuriser l’administration de WordPress en SSL

De nombreux sites n’intègrent pas SSL, généralement pour deux raisons: un certificat SSL coûte cher, et les connexions sécurisées sont lentes. De nos jours, les progrès des logiciels et algorithmes ont rendu les connexions très rapides et moins coûteuses en processeur. Et je vais vous présenter une méthode gratuite pour obtenir un certificat, et sécuriser ainsi vos pages d’administration.

Protégez l’administration de WordPress

Prérequis

Mise en situation: vous désirez sécuriser la partie admin de votre site, mais le reste du site n’est pas critique, vos visiteurs peuvent consulter le site sans avoir besoin d’un haut niveau de sécurité.

  • Vous avez accès à une ligne de commande Mac OS ou Linux.
  • OpenSSL est installé sur la machine sur laquelle vous effectuez les modifications.
  • Vous pouvez modifier les virtual hosts de votre server Apache.

Création du certificat SSL

Nous allons tout d’abord créer le certificat SSL qui authentifiera votre connexion. Ces certificats sont généralement achetés auprès d’une autorité de certification, qui vous fournira (contre 100 à 500$ par an) un certificat reconnu par la plupart des navigateurs. Ici, vous n’avez pas besoin d’une autorité de certification, car peu d’utilisateurs auront accès à la partie admin de votre site. Vous pouvez donc générer votre certificat gratuitement!

Créez une clef RSA pour votre serveur:

openssl genrsa -out server.key 2048

Il est recommandé (pour le moment) d’utiliser des clefs de 2048 bits, qui sont assez solides.

Ouvrez une ligne de commande, et tapez la commande en gras pour créer une certificate signing request:

openssl req -new -key server.key -out server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:PACA
Locality Name (eg, city) []:Antibes
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Entreprise machin
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:www.entreprise-machin.com
Email Address []:admin@entreprise-machin.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Pour un site, seul le Common Name est important. Il doit correspondre exactement au nom de domaine de votre site.

Signez cette CSR avec votre clef pour créer le certificat:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Signature ok
subject=/C=FR/ST=PACA/L=Antibes/O=Entreprise machin/CN=www.entreprise-machin.com/emailAddress=admin@entreprise-machin.com
Getting Private key

Voilà, vous avez un certificat utilisable pour votre site.

Copiez le certificat (server.crt) ainsi que la clef (server.key) dans un dossier pour Apache:

sudo mkdir -p /usr/local/apache2/conf/certs/

sudo cp server.key /usr/local/apache2/conf/certs/

sudo cp server.crt /usr/local/apache2/conf/certs/

 Configuration de WordPress

En vous basant sur le codex WordPress, ajoutez une directive à votre wp-config.php:

define('FORCE_SSL_ADMIN', true);

(à placer avant la directive « require_once(ABSPATH . ‘wp-settings.php’); »)

l’option FORCE_SSL_LOGIN n’est pas assez sécurisée car seule l’URL du formulaire de login est en HTTPS. La page de login elle-même ne sera pas servie par SSL.

De plus, FORCE_SSL_ADMIN active le secure flag des cookies de session, qui ne seront donc envoyés que par une connexion sécurisée (ne vous étonnez donc pas si vous n’êtes plus connecté en accédant au site par HTTP).

Configuration d’Apache

Activez maintenant SSL dans Apache:

sudo a2enmod ssl

Voici le contenu de la configuration Apache à ajouter

<VirtualHost *:80>

ServerName www.entreprise-machin.com
DocumentRoot /home/geo/site
<Directory /home/geo/site>
Options -Indexes -FollowSymLinks +MultiViews
AllowOverride all
Order allow,deny
Allow from all
</Directory>
RedirectMatch ^/wp-login.php(.*)$ https://www.entreprise-machin.com/wp-login.php$1
RedirectMatch ^/wp-admin/(.*)$ https://www.entreprise-machin.com/wp-admin/$1
</VirtualHost>

<VirtualHost *:443>
ServerName www.entreprise-machin.com
DocumentRoot /home/geo/site
<Directory /home/geo/site/>
Options -Indexes -FollowSymLinks +MultiViews
AllowOverride None
Allow from all
</Directory>

SSLEngine on
SSLCertificateFile /usr/local/apache2/conf/certs/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/certs/server.key

# Disable SSLv2
SSLProtocol all -SSLv2
# Choose cipher suites
SSLHonorCipherOrder On
# Use only strong authentication and ciphers; prioritise RC4 to mitigate BEAST
SSLCipherSuite RC4-SHA:HIGH:!ADH:-3DES

</VirtualHost>

On crée deux virtual hosts quasiment identiques, l’un pour la connexion normale, non sécurisée, et l’autre pour la connexion par SSL.

La version non sécurisée comporte des redirections vers la version sécurisée pour wp-login.php et wp-admin. Ces directives sont redondantes avec FORCE_SSL_ADMIN, qui se charge directement des redirections, mais la gestion de SSL étant plutôt le rôle d’Apache, on se prémunit d’éventuelles surprises erreurs de configuration de WordPress.

La version sécurisée contient les directives activant SSL, ainsi que trois autres commandes:

  • l’une pour désactiver SSLv2 (vieille version du protocole qui n’est plus recommandée actuellement). Si vous ne vous connectez qu’avec Firefox, Opera ou Internet Explorer (>8) vous pouvez ajouter « -SSLv3 » pour n’utiliser que TLSv1, la version la plus récente du protocole (qui n’est toujours pas supportée par Chrome).
  • la seconde commande force le client (navigateur) à utiliser l’algorithme que le serveur lui indique(par défaut, c’est le client qui choisit, et souvent, il choisit un algorithme faible).
  • la dernière commande sélectionne une suite d’algorithmes suffisamment fiable pour le moment.

Relancez Apache:

sudo apache2ctl reload

Configuration du navigateur

Allez sur votre page de login, et vous verrez l’avertissement classique de certificat non reconnu. Acceptez définitivement le certificat (c’est le votre, vous venez de le créer, vous lui faites donc confiance). Vous devrez accepter le certificat sur chaque navigateur que vous utiliserez pour administrer votre site.

Si un jour, en vous connectant, l’avertissement s’affiche à nouveau, attention! Cela signifie que le serveur présente un autre certificat que celui que vous avez choisi, et qu’il y a soit un problème de configuration, soit une personne/machine qui trafique votre connexion. Évitez alors de vous connecter à votre site. Et éventuellement, déconnectez-vous complètement du réseau, car un attaquant ne visera pas que la connexion à votre blog, mais aussi celles vers tout autre site.

Geoffroy Couprie

Développeur multi usages, geek en sécurité, troll d'exception

11 Commentaires

Daniel Roch Le 08 mars 2012 à 9h05

Bravo Géo pour cet article complet et technique sur l’installation de SSL pour l’administration de WordPress.

Seul élément dommage, cela ne peut s’appliquer sur un grand nombre d’hébergement mutualisés… :(

Geoffroy Couprie Le 08 mars 2012 à 9h47

On peut changer la cipher suite dans un htaccess, mais pas le reste (il faut absolument avoir accès aux virtual hosts pour faire du SSL).

Julio Potier Le 08 mars 2012 à 11h56

Ha, si c’est du Couprie, c’est du bon !
Article bien complet, même si j’aurais aimé voir des explications sur les mutu justement, car beaucoup de personnes sont en mutu.
Mais ça devient un peu plus « custom », ton article est très bon, j’ai appris des choses :)
Bonne journée !

Geoffroy Couprie Le 08 mars 2012 à 12h14

En gros, pour un mutualisé, l’hébergeur gère lui-même les virtual hosts, donc soit on a un hébergeur sympa qui permet de créer un second vhost sur le port 443 avec le certificat et la clef qu’on veut (j’en connais pas pour le moment), soit on fonctionne comme wordpress.com: ils ont pris un certificat wildcard pour *.wordpress.com, c’est-à-dire un certificat qui fonctionne pour tous les sous-domaines de wordpress.com, et ils redirigent sur le sous-domaine quand quelqu’un veut administrer son site.

laura Le 08 mars 2012 à 17h38

Personnellement je suis sur un mutualisé ovh et le certificat est inclus dans mon offre

comme indiqué dans le billet , celui-ci n’est pas certifié mais il suffit pour sécuriser les connexions comme les visiteurs n’ont pas accès

Bon post en tout cas (surtout pour ceux qui doivent configurer tout à la main)

Pierre Le 09 mars 2012 à 9h16

Je commente juste pour la pub tendancieuse en haut de l’article… ;-)

Daniel Roch Le 09 mars 2012 à 9h55

@Pierre : la publicité dépend beaucoup de l’historique et des cookies de l’ordinateur. Chez moi, elle affiche une pub pour PowerBoutique (ce qui s’éloigne un peu je l’accorde de WordPress et de SSL…).

Aurelien Le 14 mars 2012 à 11h34

Super article (comme souvent), merci !

Damien Le 10 août 2012 à 13h38

Bonjour et merci pour cet article…
J’ai malgré tout une question toute bête. J’ai déjà sur mon serveur un owncloud qui tourne sur le port 443, est-il possible d’utiliser un autre port pour sécuriser l’admin de WordPress ?

    Geoffroy Couprie Le 13 août 2012 à 8h48

    Oui, c’est tout à fait possible: remplacez 443 dans « VirtualHost *:443 » par le port que vous voulez dans la configuration ci-dessus, et vous pourrez accéder à votre site à l’adresse « https://votredomaine.com:votreport ».

guillaume Le 03 mai 2013 à 17h28

et avec un hébergement mutualisé, comment cela se passe ? J’ai le cas avec 1&1, j’essaye de lier le certificat SSL avec le https mais très très difficilement, mon dieu… la difficulté quoi ! rien ne fonctionne… aucune explication sérieuse.

Avez-vous une idée ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *