Configurer une pile LEMP WordPress sécurisée avec des prisons chroot

Isoler les sites WordPress les uns des autres et de l'hôte — un guide de durcissement pour les serveurs LEMP multisites.

Avec un WordPress aussi répandu, on s’étonne du peu de ressources à jour sur la configuration d’un environnement sécuritaire pour l’héberger.

Voici notre tentative de compiler les meilleures pratiques les plus récentes, fondées sur les derniers paquets logiciels au moment d’écrire ces lignes :

Pour de nombreuses raisons — performance, sécurité, stabilité, souplesse et coût — nous évitons l’hébergement Windows à tout prix.

Nous utiliserons la version la plus récente d’Ubuntu 22.0.4 LTS, notre saveur de Linux préférée, surtout pour l’abondance du soutien en ligne lorsqu’il s’agit de démêler d’obscurs problèmes de dépendances. Notre installation est assez simple, mais les pépins futurs sont — d’expérience — plus faciles à résoudre sur Ubuntu, tant il est répandu.

On héberge souvent plusieurs instances WordPress dans le même environnement. Nous supposerons donc que l’environnement que nous montons sera partagé entre plusieurs installations WordPress, et créerons des environnements chroot distincts pour chacune.

En cas de compromission d’un site, cela réduit le risque de contamination croisée : les attaquants n’ont d’accès en écriture qu’à l’intérieur de la prison chroot et ne peuvent lire le reste du système de fichiers.

Si les développeurs du cœur de WordPress sont généralement très soucieux de sécurité, les pratiques des développeurs tiers d’extensions — celles-là mêmes qui font sa popularité — sont plus inégales.

Nous conseillons une grande circonspection avant d’ajouter une extension, et de centraliser cette décision chez une personne clé de l’organisation, également responsable des mises à jour ponctuelles des extensions et du cœur de WordPress. Quand plusieurs personnes installent des extensions au gré de leurs envies, la situation dérape vite, et le risque qu’une vulnérabilité s’y glisse augmente.

Les extensions et thèmes inutilisés devraient être supprimés, et les thèmes devraient toujours être développés comme thèmes enfants du thème de base installé, afin de pouvoir mettre à jour la dépendance sans écraser les personnalisations.

Installer Ubuntu 22.0.4 LTS

Nous ne nous attarderons pas sur l’installation du système, sinon pour renvoyer à des ressources comme le guide Initial Server Setup with Ubuntu 22.04 de DigitalOcean . À retenir :

Quelques gestes d’entretien supplémentaires que nous aimons poser :

définir vi comme éditeur par défaut (vi est essentiel à tout aspirant administrateur système — il vaut vraiment la peine de l’apprendre en prérequis) :

ajouter votre compte administrateur aux sudoers sans saisie de mot de passe (la plupart des commandes de ce guide exigent sudo, cela vous simplifiera la vie) :

ajouter à la fin du fichier, où username correspond à votre utilisateur administrateur courant :

- `username ALL=(ALL) NOPASSWD: ALL`

mettre à jour tous vos paquets sans attendre :

Installer MySQL 8

L’installation de MySQL est simple :

Installer PHP 8.1

PHP et ses extensions les plus courantes pour WordPress s’installent comme suit :

Créer les environnements chroot

Pour les besoins de ce guide, nous créerons nos environnements chroot aux emplacements suivants :

Commençons par créer l’utilisateur du premier site :

Notez que les instructions qui suivent sont tirées de l’article Secure webspaces with NGINX, PHP-FPM chroots and Let’s Encrypt .

Configurons d’abord la prison chroot correspondante :

sudo vi /etc/php/8.1/fpm/pool.d/site1.conf

[site1]
user = $pool
group = $pool
listen = /run/php/php8.1-fpm-$pool.sock
listen.owner = nginx
listen.group = nginx
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = /var/www/$pool
chdir = /data

sudo crontab -e

@reboot    /usr/local/sbin/php-chroot-bind bind

Installer NGINX 1.22.0

Notre version préférée de NGINX est la plus récente version principale. Le guide d’installation complet de NGINX se trouve ici , mais utilisez ces commandes pour la configuration actuelle :

sudo vi /etc/apt/sources.list.d/nginx.list

deb https://nginx.org/packages/ubuntu/ jammy nginx
deb-src https://nginx.org/packages/ubuntu/ jammy nginx

Un peu d’ordre s’impose :

sudo vi /etc/nginx/sites-available/site1.conf

server {
    server_name   site1.example.com;
    server_tokens off;
    root          /var/www/site1/data;
    index         index.php index.html index.htm;

    error_log     /var/log/nginx/site1.error.log;
    access_log    /var/log/nginx/site1.access.log;

    location ~* ^/(?:xmlrpc\.php|wp-links-opml\.php|wp-config\.php|wp-config-sample\.php|readme\.html|license\.txt|nginx\.conf|\.user\.ini|\.ht.*)$ {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ [^/]\.php(/|$) {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.1-fpm-site1.sock;
        fastcgi_param SCRIPT_FILENAME /data$fastcgi_script_name;
    }
}

Installer Certbot

Nous servirons nos sites en HTTPS chiffré; installons donc Certbot :

Si vous vous êtes rendu jusqu’ici, vous êtes prêt à installer WordPress dans le répertoire /var/www/site1/data. Assurez-vous également de configurer un pare-feu, de durcir vos configurations NGINX et PHP, et de couvrir tous les autres prérequis de l’article How To Install WordPress on Ubuntu 22.04 with a LAMP Stack . Dernière remarque : définissez votre hôte de base de données à l’installation — ou la variable DB_HOST de votre wp-config.php — à 127.0.0.1 plutôt que localhost.

Des questions ou des commentaires sur ce guide? Écrivez-nous au formulaire de contact ci-dessous.

Besoin de services experts d’administration système, de remédiation et de soutien à l’hébergement pour WordPress? N’hésitez pas à nous joindre.

Contactez-nous

Un problème difficile et un budget?

Dites-nous ce qui le motive. Vous parlerez aux personnes qui font le travail.

Une phrase ou deux suffisent : le problème, le système, l'échéance.