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 :
Ubuntu 22.0.4 LTS (Jammy Jellyfish)
NGINX 1.22.0
MySQL 8
PHP 8.1
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 :
créer des utilisateurs non root avec accès sudo pour les administrateurs plutôt que d’utiliser directement le compte root
désactiver l’accès par mot de passe au profit de l’authentification par clés SSH
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) :
sudo update-alternatives --set editor /usr/bin/vim.basic
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) :
sudo visudo
ajouter à la fin du fichier, où username correspond à votre utilisateur administrateur courant :
- `username ALL=(ALL) NOPASSWD: ALL`
mettre à jour tous vos paquets sans attendre :
sudo apt updatesudo apt full-upgradesudo apt autoremovesudo reboot
Installer MySQL 8
L’installation de MySQL est simple :
sudo apt install mysql-server
Installer PHP 8.1
PHP et ses extensions les plus courantes pour WordPress s’installent comme suit :
sudo apt install php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip
Créer les environnements chroot
Pour les besoins de ce guide, nous créerons nos environnements chroot aux emplacements suivants :
/var/www/site1
/var/www/site2
Commençons par créer l’utilisateur du premier site :
sudo adduser --gecos "Sample Website" --disabled-password --home /var/www/site1 site1
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
- ajoutez les lignes suivantes au fichier :
[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 service php8.1-fpm restartsudo curl -o /usr/local/sbin/php-chroot-bind https://raw.githubusercontent.com/68b32/php-chroot-bind/master/php-chroot-bindsudo sed -i 's/ls -1d \/home\/www\/*\/chroot/cat \/var\/www\/chroot.list/' /usr/local/sbin/php-chroot-bindsudo chmod u+x /usr/local/sbin/php-chroot-bindsudo echo /var/www/site1 > /var/www/chroot.list
sudo crontab -e
- ajoutez la ligne suivante à la fin du fichier :
@reboot /usr/local/sbin/php-chroot-bind bind
sudo /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
- ajoutez les lignes suivantes au fichier :
deb https://nginx.org/packages/ubuntu/ jammy nginx
deb-src https://nginx.org/packages/ubuntu/ jammy nginx
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62sudo apt updatesudo apt install nginx
Un peu d’ordre s’impose :
sudo mkdir /etc/nginx/sites-availablesudo mv /etc/nginx/conf.d/default.conf /etc/nginx/sites-available
sudo vi /etc/nginx/sites-available/site1.conf
- ajoutez les lignes suivantes au fichier, en adaptant le domaine au besoin :
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;
}
}
sudo ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/conf.d/site1.conf
Installer Certbot
Nous servirons nos sites en HTTPS chiffré; installons donc Certbot :
sudo apt install certbot python3-certbot-nginxAdaptez le domaine au besoin :
sudo certbot --agree-tos --redirect --nginx -d site1.example.com
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.