grosse relecture du Howto WordPress

This commit is contained in:
Gregory Colpart 2022-02-10 16:33:05 +01:00
parent 076f9f5cc4
commit ea7a9375c6

View file

@ -1,35 +1,58 @@
---
categories: Wordpress saas web
title: Howto Wordpress
categories: web webapp saas
title: Howto WordPress
...
# W3 Total Cache
* Documentation : <https://wordpress.org/support/>
W3 Total Cache améliore les performances d'un « site/blog » propulsé par Wordpress ainsi que la rapidité du chargement des pages pour une meilleure expérience utilisateur et un meilleur référencement !
Pour cela W3 Total Cache met en cache différents éléments : renforcement du cache navigateur, cache des pages, des objets et des requêtes SQL. Il propose aussi différentes fonctions tel que le html/css/js minify et la gestion de CDN.
[WordPress](https://wordpress.org/) est une application web libre de gestion de contenu, historiquement utilisé pour faire un blog.
C'est l'application web la plus utilisée au monde avec plus de 30% des sites web qui l'utilise.
## Installation
### Prérequis
Nous préconisons d'utiliser WordPress avec [Apache-ITK](HowtoApache) avec la gestion des droits désactivés pour faciliter les mises à jour :
* PHP 5.6 >=
* MySQL 5.6 >=
* Apache avec module rewrite
~~~
AssignUserID example example
~~~
### Procédure
Nous préconisons aussi de désactiver l'accès à `xmlrpc.php` sauf si vous en avez vraiment besoin :
* Télécharger l'archive du plugin sur le site de [Wordpress](http://wordpress.org/extend/plugins/w3-total-cache/) et la décompresser dans wp-content/plugins. (Ou bien installer le plugin depuis Wordpress) ;
* Activer le plugins dans la liste des extensions Wordpress ;
* Passer à la configuration.
## Configuration
La configuration se passe dans le tableau de bord de Worpdress, dans l'onglet « Performance ».
Cliquer sur le bouton « Compatiblity Check », pour vérifier que votre serveur dispose de tous les modules nécessaire.
~~~
<Files "xmlrpc.php">
Require all denied
</Files>
~~~
# Mise à jour Wordpress par l'interface web via ssh
Nous utilisons l'outil [WP-CLI](https://wp-cli.org/fr/) :
~~~{.bash}
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ php wp-cli.phar --info
$ php wp-cli.phar core is-installed --path=$HOME/www
$ php wp-cli.phar core config --dbname=example --dbuser=example --dbpass=PASSWORD --dbhost=127.0.0.1 --path=$HOME/www
$ php wp-cli.phar core install --url=blog.example.com --title="TITRE" --admin_user="admin" --admin_password=PASSWORD --admin_email="blog@example.com" --skip-email --path="$HOME/www"
~~~
## Mise à jour
Les mises à jour sont très importantes car WordPress est très utilisé dans le monde, et il y a donc de nombreuses attaques sur les versions non à jour.
Par défaut, si les droits le permettent, le core de WordPress se met à jour automatiquement pour les versions mineures, cf <https://codex.wordpress.org/Configuring_Automatic_Background_Updates>
Vous pouvez faire les mises à jour directement depuis l'interface d'admin ou alors avec [WP-CLI](https://wp-cli.org/fr/) :
~~~{.bash}
$ cd $HOME/www
$ php $HOME/wp-cli/wp-cli.phar core download --force
$ php $HOME/wp-cli/wp-cli.phar core check-update
$ php $HOME/wp-cli/wp-cli.phar core update
~~~
### Mise à jour par l'interface d'admin via SSH
Si les droits ne le permettent pas, vous pouvez activer les mises à jour via l'interface d'admin avec SSH.
Tutoriel détaillé : <http://kbeezie.com/secure-wordpress-ssh2/>
@ -63,149 +86,8 @@ Il reste plus qu'a se rendre sur le backoffice du site à la page qui liste les
**Wordpress 4.3 et 4.8**, la mise à jour via ssh est cassée et il faudra appliquer ce fix : <https://web.archive.org/web/20190630102647/https://www.lekernelpanique.fr/2015/09/08/wordpress-4-3-casse-la-mise-a-jour-via-sshsftp/>
# Mise à jour Wordpress [plugins] depuis l'interface web (éviter)
Revoir les droits du groupe pour permettre l'écriture ($HOME/www = où le wp est installé) :
~~~
$ chmod g+w $HOME/www/ $HOME/www/wp-includes/version.php
$ chmod g+w -R $HOME/www/wp-admin/includes/ $HOME/www/wp-content/ $HOME/www/wp-content/upgrade/ $HOME/www/wp-content/languages/
~~~
Si vous avez des retours de type : 'Operation not permitted', il y a de bonne chance que le propriétaire du fichier soit déjà l'utilisateur utilisé par l'instance du serveur web (et donc les droits sont déjà suffisant).
## Définir les droits des fichiers écrit par Wordpress
Wordpress surcharge l'umask définie par Apache/PHP et écrit par défaut les fichiers et dossiers en 750.
Il faut rajouter ces 2 lignes dans wp-config.php pour avoir des droits corrects :
~~~
define( 'FS_CHMOD_DIR', ( 0770 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0660 & ~ umask() ) );
~~~
## Attaque sur xmlrpc.php
Sur les Wordpress pas à jour, l'API xmlrpc.php est sensible à une attaque par rebond, un attaquant réalise plein de requêtes sur xmlrpc.php et votre serveur fait des requêtes vers la/les cibles de l'attaquant.
S'il ne vous est pas possible de mettre à jour Wordpress, une solution est de bloquer les requêtes vers xmlrpc.php dans Apache :
~~~
<Files "xmlrpc.php">
Require all denied
</Files>
~~~
## Restriction sur pages d'admin
~~~
<LocationMatch "^/wp-(admin|login)">
Require ip 192.0.2.42
</LocationMatch>
~~~
# Maintenance
## Vérifier la liste des plugins installés sur Wordpress
~~~{ .sql }
> SELECT * FROM wp_options WHERE option_name = 'active_plugins';
~~~
# wp-cli
Permet d'administrer une instance Wordpress à partir de la ligne de commande.
[<http://wp-cli.org/commands/>]
## Installation
~~~{.bash}
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
~~~
## core
Vérifier que le répertoire en question correspond bien à un wordpress :
~~~
php wp-cli.phar core is-installed --path=$HOME/www
~~~
### Installation de Wordpress
Configuration des différentes directives à compléter (pour la base de donnée) :
~~~
php wp-cli.phar core config --dbname=nombase --dbuser=nomutilisateur --dbpass=motdepasse \
--dbhost=hostnamedb --path=$HOME/www
~~~
Procéder à l'installation :
~~~
php wp-cli.phar core install --url="ServerName" --title="TITRE_WP" --admin_user="admin" --admin_password="motdepasseadmin" \
--admin_email="emailadmin" --skip-email --path="$HOME/www"
~~~
### Mise à jour
#### Avec wp-cli
Se placer dans le répertoire où est installé wp :
~~~
$ cd $HOME/www
~~~
Forcer le téléchargement de la dernière version (US) - non recommandé:
~~~
$ php $HOME/wp-cli/wp-cli.phar core download --force
~~~
Vérifier si maj disponible :
~~~
$ php $HOME/wp-cli/wp-cli.phar core check-update
+---------+-------------+-------------------------------------------------------------+
| version | update_type | package_url |
+---------+-------------+-------------------------------------------------------------+
| 4.6.1 | major | <https://downloads.wordpress.org/release/wordpress-4.6.1.zip> |
+---------+-------------+-------------------------------------------------------------+
~~~
Mettre à jour wordpress et la bd
~~~
$ php $HOME/wp-cli/wp-cli.phar core update
Updating to version 4.6.1 (en_US)...
Downloading update from <https://downloads.wordpress.org/release/wordpress-4.6.1-no-content.zip...>
Unpacking the update...
Cleaning up files...
No files found that need cleaned up.
Success: WordPress updated successfully.
$ php $HOME/wp-cli/wp-cli.phar core update-db
Success: WordPress database upgraded successfully from db version 36686 to 37965.
~~~
#### Mise à jour automatique
Par défaut, le core de WordPress se met à jour automatiquement pour les versions mineures, cf <https://codex.wordpress.org/Configuring_Automatic_Background_Updates>
### Redirections
Lister les redirections déjà présentes sur le WP :
~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar rewrite list --format=csv
~~~
Lister selon url donné (ex: SERVERNAME/fr_FR) :
~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar --url=SERVERNAME rewrite list --format=csv --match=fr_FR
~~~
## Administration
### Utilisateurs
@ -230,36 +112,36 @@ $ php $HOME/wp-cli/wp-cli.phar user delete X
~~~
# Sécurité
## WPScan
## plugins
WPSscan (https://wpscan.org/) est un outil de scan de vulnérabilités en boite noire dédié à WordPress. Il va détecter la version de WordPress, lister d'éventuelles vulénrabilités connues pour cette version, répertorier les thèmes et plugins utilisés avec leur failles et pointer des défauts de configuration de l'installation.
On peut vérifier la liste des plugins installés sur Wordpress :
Pour l'installer, vous pouvez suivre les instructions de [la documentation](https://github.com/wpscanteam/wpscan#install)
### Utilisation
#### Mise à jour
Avant la première utilisation, et de manière régulière, il faut mettre à jour WPScan, cela lui permet de récupérer la liste des dernière vulnérabiliés. Vous pouvez le faire avec la commande suivante :
~~~
ruby wpscan.rb --update
~~~{ .sql }
SELECT * FROM wp_options WHERE option_name = 'active_plugins';
~~~
*Note* : Si votre base de donnée locale des vulnérabilités est trop ancienne, le script vous proposera automatiquement de faire la mise à jour.
### W3 Total Cache
#### Scan d'un site
Le plugin W3 Total Cache améliore les performances d'un « site/blog » propulsé par Wordpress ainsi que la rapidité du chargement des pages pour une meilleure expérience utilisateur et un meilleur référencement !
L'opération est simple, il suffit juste de donner l'adresse du site à WPScan. Vous optiendrez alors un compte rendu complet de la situation.
Pour cela W3 Total Cache met en cache différents éléments : renforcement du cache navigateur, cache des pages, des objets et des requêtes SQL. Il propose aussi différentes fonctions tel que le html/css/js minify et la gestion de CDN.
La configuration se passe dans le tableau de bord de Worpdress, dans l'onglet « Performance ».
Cliquer sur le bouton « Compatiblity Check », pour vérifier que votre serveur dispose de tous les modules nécessaire.
## Sécurité
Nous préconisons de restreindre l'accès à l'interface d'admin par IP :
~~~
ruby wpscan.rb --url example.net
<LocationMatch "^/wp-(admin|login)">
Require ip 192.0.2.42
</LocationMatch>
~~~
## Bloquer l'exécution de PHP dans wp-contents/uploads
Avec Apache :
et nous préconisons aussi de bloquer l'exécution de PHP dans wp-contents/uploads (attention, cela risque de casser certains plugins « sales ») :
~~~
<Directory /home/SITE/www/wp-content/uploads/>
@ -269,7 +151,57 @@ Avec Apache :
</Directory>
~~~
# Erreurs
### WPScan
[WPSscan](https://wpscan.org/) est un outil de scan de vulnérabilités en boite noire dédié à WordPress. Il va détecter la version de WordPress, lister d'éventuelles vulénrabilités connues pour cette version, répertorier les thèmes et plugins utilisés avec leur failles et pointer des défauts de configuration de l'installation.
Pour l'installer, vous pouvez suivre les instructions de [la documentation](https://github.com/wpscanteam/wpscan#install)
Nous conseillons de l'installer sur une machine distante, et pas directement sur le serveur qui héberge WordPress.
Avant la première utilisation, et de manière régulière, il faut mettre à jour WPScan, cela lui permet de récupérer la liste des dernière vulnérabiliés. Vous pouvez le faire avec la commande suivante :
~~~
$ ruby wpscan.rb --update
~~~
Pour « scanner » un site, l'opération est simple, il suffit juste de donner l'adresse du site à WPScan. Vous optiendrez alors un compte rendu complet de la situation.
~~~
$ ruby wpscan.rb --url example.net
~~~
## FAQ
### Gestion des redirections
Lister les redirections déjà présentes :
~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar rewrite list --format=csv
~~~
Lister selon url donné (ex: SERVERNAME/fr_FR) :
~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar --url=blog.example.com rewrite list --format=csv --match=fr_FR
~~~
## Forcer les droits
Nous conseillons de désactiver la gestion des droits grâce à Apache-ITK (cf Installation).
Si vous ne faites pas cela, sachez que WordPress surcharge l'umask défini par Apache/PHP et écrit par défaut les fichiers et dossiers en 750.
Il faut rajouter ces 2 lignes dans `wp-config.php` pour avoir des droits corrects :
~~~
define( 'FS_CHMOD_DIR', ( 0770 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0660 & ~ umask() ) );
~~~
## Problème de "Live preview" sur les thèmes
@ -310,11 +242,17 @@ POST /wp-json/wp/v2/pages/xx?_locale=user HTTP/1.1" 404
Cela vient probablement des permaliens. Il suffit de les mettre à jour dans la partie Réglages > permaliens du panneau d'administration en cliquant sur "Enregistrer les modifications".
# Divers
## Multisite
### WordPress multisite
<https://codex.wordpress.org/Nginx#WordPress_Multisite_subdomains_rules>
### HTTP -> HTTPS
Si l'on veut passer en HTTPS un site précédemment en HTTP, outre la configuration Apache / redirection automatique, il faut aussi remplacer
dans la configuration toutes les URLs en HTTPS. Pour faire cela, on peut faire une dump de la table `wp_options` puis faire des remplacements avec un éditeur :
~~~
$ mysqldump wp_options --no-create-db --replace --extended-insert=FALSE --where="option_value LIKE '%http:%'" > https.sql
~~~
> **Note** : Attention, gardez bien le dump original pour restaurer les lignes originales en cas de besoin