wiki/HowtoWordpress.md

317 lines
12 KiB
Markdown
Raw Permalink Normal View History

---
2022-02-10 16:33:05 +01:00
categories: web webapp saas
title: Howto WordPress
...
2022-02-10 16:33:05 +01:00
* Documentation : <https://wordpress.org/support/>
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
[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.
2016-12-29 11:25:39 +01:00
## Installation
2022-03-10 14:44:17 +01:00
Nous préconisons d'utiliser WordPress avec [Apache-ITK](HowtoApache) et [MariaDB](HowtoMySQL).
Pour [Apache-ITK](HowtoApache) on désactive la gestion des droits pour faciliter les mises à jour :
2022-02-10 16:33:05 +01:00
~~~
AssignUserID example example
~~~
Et également la configuration suivante pour le *DocumentRoot* :
~~~
<Directory /home/example/www/>
Options +SymLinksIfOwnerMatch
AllowOverride AuthConfig Limit FileInfo Options Indexes
Require all granted
</Directory>
~~~
2022-02-10 16:33:05 +01:00
Nous préconisons aussi de désactiver l'accès à `xmlrpc.php` sauf si vous en avez vraiment besoin :
~~~
<Files "xmlrpc.php">
Require all denied
</Files>
~~~
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
Nous utilisons l'outil [WP-CLI](https://wp-cli.org/fr/) :
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
~~~{.bash}
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ php wp-cli.phar --info
2022-03-07 18:00:41 +01:00
$ php wp-cli.phar core download --path=$HOME/www
2022-02-10 16:33:05 +01:00
$ php wp-cli.phar core config --dbname=example --dbuser=example --dbpass=PASSWORD --dbhost=127.0.0.1 --path=$HOME/www
2022-03-07 18:00:41 +01:00
$ php wp-cli.phar core is-installed --path=$HOME/www
2022-02-10 16:33:05 +01:00
$ 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"
~~~
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
## Mise à jour
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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.
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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>
2022-02-10 16:33:05 +01:00
Vous pouvez faire les mises à jour directement depuis l'interface d'admin ou alors avec [WP-CLI](https://wp-cli.org/fr/) :
~~~{.bash}
2023-06-28 09:24:53 +02:00
$ php wp-cli.phar cli update
$ php wp-cli.phar --info
$ php wp-cli.phar core download --force --path="$HOME/www"
$ php wp-cli.phar core check-update --path="$HOME/www"
$ php wp-cli.phar core update --path="$HOME/www"
$ php wp-cli.phar core verify-checksums --path="$HOME/www"
2022-02-10 16:33:05 +01:00
~~~
2023-06-28 12:50:54 +02:00
Attention, il faut parfois faire aussi une mise à jour de la base de données par l'interface web.
2022-02-10 16:33:05 +01:00
### Mise à jour par l'interface d'admin via SSH
**Cette méthode n'est pas recommandée si évitable. Préférez la méthode par défaut (`FS_METHOD` = `direct` et pas de séparation des droits par itk) quand possible.**
2022-02-10 16:33:05 +01:00
Si les droits ne le permettent pas, vous pouvez activer les mises à jour via l'interface d'admin avec SSH.
2016-12-29 11:25:39 +01:00
2021-10-18 16:41:29 +02:00
Tutoriel détaillé : <http://kbeezie.com/secure-wordpress-ssh2/>
2016-12-29 11:25:39 +01:00
2021-04-12 15:35:33 +02:00
**Important** : Installer le plugin wordpress [ssh-sftp-updater-support](https://wordpress.org/plugins/ssh-sftp-updater-support). Sa présence résoud bon nombre de problèmes.
2016-12-29 11:25:39 +01:00
2019-07-03 10:46:40 +02:00
1. Vérifier que le module PHP `ssh2` est installé.
1. Activer `allow_url_fopen` dans la configuration du vhost.
2023-11-08 17:42:36 +01:00
1. Assurez-vous que l'option `define('FS_METHOD','direct')` n'est pas définie, on peut la forcer à `ssh2` si nécessaire dans le fichier `/home/<vhost>/www/wp-config.php`
1. Vérifier la correspondance des droits avec le module ITK d'Apache (directive `AssignUserID`) et l'accès à la clé privé SSH.
~~~
2019-07-03 10:46:40 +02:00
# vhost=siteweb
2019-08-01 16:42:05 +02:00
# install -d -o www-${vhost} -g $vhost -m 750 /home/${vhost}/sshkeys
# ssh-keygen -f /home/${vhost}/sshkeys/wordpress
2023-11-08 17:54:01 +01:00
# chown ${vhost}: /home/${vhost}/sshkeys/wordpress*
2019-08-01 16:42:05 +02:00
# cat /home/${vhost}/sshkeys/wordpress.pub >> /home/${vhost}/.ssh/authorized_keys
2023-11-08 17:54:01 +01:00
# sudo -u ${vhost} ssh -i /home/${vhost}/sshkeys/wordpress ${vhost}@127.0.0.1
~~~
2019-07-03 10:46:40 +02:00
Modifier le fichier `wp-config.php` en conséquence:
~~~
define( 'FS_METHOD', 'ssh2' );
2019-07-03 10:46:40 +02:00
define( 'FTP_USER', '$vhost' );
define( 'FTP_HOST', '127.0.0.1' );
2019-07-03 10:46:40 +02:00
define( 'FTP_PUBKEY', '/home/$vhost/sshkeys/wordpress.pub' );
define( 'FTP_PRIKEY', '/home/$vhost/sshkeys/wordpress' );
~~~
2016-12-29 11:25:39 +01:00
Il reste plus qu'a se rendre sur le backoffice du site à la page qui liste les modules et en mettre un à jour pour tester.
2019-07-03 10:50:29 +02:00
2021-04-12 15:35:33 +02:00
**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/>
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
## Administration
2017-01-03 11:20:35 +01:00
2022-02-10 16:33:05 +01:00
### Utilisateurs
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
Créer un utilisateur admin :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
$ php $HOME/wp-cli/wp-cli.phar user create admintest john@example.com --role=administrator
Success: Created user 3.
Password: XXXXXXX
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
Si temporaire, ne pas oublier de le supprimer :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
$ php $HOME/wp-cli/wp-cli.phar user list
+----+------------+---------------+----------------------+----------------------+---------------+
| ID | user_login | display_name | user_email | user_registered | roles |
+----+------------+---------------+----------------------+----------------------+---------------+
| X | admintest | admintest | johndoe@example.com | 2016-10-17 17:40:26 | administrator |
$ php $HOME/wp-cli/wp-cli.phar user delete X
2016-12-29 11:25:39 +01:00
~~~
2021-04-01 23:28:42 +02:00
2022-02-10 16:33:05 +01:00
## plugins
2022-02-10 16:33:05 +01:00
On peut vérifier la liste des plugins installés sur Wordpress :
~~~{ .sql }
2022-02-10 16:33:05 +01:00
SELECT * FROM wp_options WHERE option_name = 'active_plugins';
~~~
2022-02-10 16:33:05 +01:00
### W3 Total Cache
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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 !
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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.
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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.
2017-01-03 11:20:35 +01:00
2023-06-28 13:22:32 +02:00
### Jetpack Protect
Le plugin [Jetpack Protect](https://jetpack.com/protect/) permet d'effectuer des scans réguliers et d'avoir des règles de « WAF » via une option payante (environ 15 EUR par mois).
Attention, Jetpack utilise `xmlrpc.php` donc il faut le garder actif ou ajouter les [adresses IP Jetpack en liste blanche](https://jetpack.com/support/how-to-add-jetpack-ips-allowlist/).
Pour une protection efficace, les règles « WAF » peuvent être mises dans un `.htaccess` :
~~~
php_value auto_prepend_file "/home/FOO/www/wp-content/jetpack-waf/bootstrap.php"
~~~
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
## Sécurité
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
Nous préconisons de restreindre l'accès à l'interface d'admin par IP :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
<LocationMatch "^/wp-(admin|login)">
Require ip 192.0.2.42
</LocationMatch>
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
et nous préconisons aussi de bloquer l'exécution de PHP dans wp-contents/uploads (attention, cela risque de casser certains plugins « sales ») :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-06-28 13:22:32 +02:00
<Directory /home/FOO/www/wp-content/uploads/>
2022-02-10 16:33:05 +01:00
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>
2016-12-29 11:25:39 +01:00
~~~
2022-02-25 10:40:53 +01:00
### Fail2Ban
2016-12-29 11:25:39 +01:00
2022-02-25 10:40:53 +01:00
Si l'on ne peut pas restreindre l'accès à l'interface d'admin, nous préconisons d'utiliser [HowtoFail2Ban]().
Par ordre de préférence, nous conseillons d'utiliser :
2023-05-09 09:39:56 +02:00
- [Wordpress avec plugin Fail2Ban](HowtoFail2Ban#wordpress-avec-plugin-fail2ban)
- [Wordpress avec plugin simple](HowtoFail2Ban#wordpress-avec-plugin-simple)
- [Wordpress sans plugin](HowtoFail2Ban#wordpress-sans-plugin)
2017-02-28 10:08:40 +01:00
2022-02-10 16:33:05 +01:00
### WPScan
2017-01-03 11:20:35 +01:00
2023-06-28 11:27:55 +02:00
[WPScan](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.
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
Pour l'installer, vous pouvez suivre les instructions de [la documentation](https://github.com/wpscanteam/wpscan#install)
2017-01-03 11:20:35 +01:00
2022-02-10 16:33:05 +01:00
Nous conseillons de l'installer sur une machine distante, et pas directement sur le serveur qui héberge WordPress.
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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 :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
$ ruby wpscan.rb --update
2017-02-28 15:29:34 +01:00
~~~
2016-12-29 11:25:39 +01:00
2022-02-10 16:33:05 +01:00
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.
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2022-02-10 16:33:05 +01:00
$ ruby wpscan.rb --url example.net
2016-12-29 11:25:39 +01:00
~~~
2017-02-28 10:08:40 +01:00
2022-02-10 16:33:05 +01:00
## FAQ
2017-02-28 10:08:40 +01:00
2022-02-10 16:33:05 +01:00
### Gestion des redirections
2017-02-27 12:24:14 +01:00
2022-02-10 16:33:05 +01:00
Lister les redirections déjà présentes :
2017-02-27 12:24:14 +01:00
~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar rewrite list --format=csv
~~~
2017-11-20 16:43:29 +01:00
Lister selon url donné (ex: SERVERNAME/fr_FR) :
2018-03-06 16:08:13 +01:00
2017-11-20 16:43:29 +01:00
~~~{.bash}
2022-02-10 16:33:05 +01:00
$ php $HOME/wp-cli/wp-cli.phar --url=blog.example.com rewrite list --format=csv --match=fr_FR
2017-02-28 15:29:34 +01:00
~~~
2022-02-10 16:34:36 +01:00
### Forcer les droits
2017-02-28 15:29:34 +01:00
2022-02-10 16:33:05 +01:00
Nous conseillons de désactiver la gestion des droits grâce à Apache-ITK (cf Installation).
2022-02-10 16:33:05 +01:00
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.
2022-02-10 16:33:05 +01:00
Il faut rajouter ces 2 lignes dans `wp-config.php` pour avoir des droits corrects :
~~~
2022-02-10 16:33:05 +01:00
define( 'FS_CHMOD_DIR', ( 0770 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0660 & ~ umask() ) );
~~~
2022-02-10 16:34:36 +01:00
### Problème de "Live preview" sur les thèmes
Sil y a un problème pour generer un "live preview" d'un thèmes, ou si on a une erreur php de ce type dans les logs :
PHP Fatal error: Call to undefined function submit_button() in $HOME/www/wp-content/plugins/ssh-sftp-updater-support/sftp.php on line 249
Il faut ajouter cette option dans le fichier wp-config.php :
~~~
define( 'FS_METHOD', 'direct' );
~~~
Il faut placer cette option avant toutes les autres, en début de fichier.
2019-04-24 12:10:32 +02:00
> **Note** : Attention, ne pas faire ceci si apache tourne avec un autre utilisateur (tel que le module ITK).
2022-02-10 16:34:36 +01:00
### Erreur lors de mise a jour : Impossible de localiser le dossier racine de WordPress (wp-content)
Il faut ajouter ce hack à la fin du fichier *wp-config.php* :
~~~
if(is_admin()) {
add_filter('filesystem_method', create_function('$a', 'return "direct";' ));
define( 'FS_CHMOD_DIR', 0751 );
}
~~~
2019-04-24 11:59:45 +02:00
> **Note** : Attention, ne pas faire ceci si apache tourne avec un autre utilisateur (tel que le module ITK).
2022-02-10 16:34:36 +01:00
### Erreur lors de la publication d'une page
Si vous rencontrez l'erreur 404 suivante dans les logs lors de la publication d'une page :
~~~
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".
2022-02-10 16:33:05 +01:00
### WordPress multisite
2022-02-10 16:33:05 +01:00
<https://codex.wordpress.org/Nginx#WordPress_Multisite_subdomains_rules>
2018-01-24 15:36:19 +01:00
2022-02-10 16:33:05 +01:00
### HTTP -> HTTPS
2018-01-24 15:36:19 +01:00
2022-02-10 16:33:05 +01:00
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 :
2018-01-24 15:36:19 +01:00
2022-02-10 16:33:05 +01:00
~~~
$ mysqldump wp_options --no-create-db --replace --extended-insert=FALSE --where="option_value LIKE '%http:%'" > https.sql
~~~
2018-01-24 15:36:19 +01:00
2022-02-10 16:33:05 +01:00
> **Note** : Attention, gardez bien le dump original pour restaurer les lignes originales en cas de besoin
### reverse-proxy et HTTPS
Si l'on a un reverse-proxy devant Wordpress et une communication HTTP entre le reverse-proxy et le serveur final,
il faut indiquer à Wordpress qu'on est bien en HTTPS, cela peut se faire via la configuration Apache par exemple :
~~~
2023-06-30 16:56:10 +02:00
SetEnv HTTPS on
~~~
2024-04-05 12:48:56 +02:00
### PHP Fatal error: Uncaught Error: Call to undefined function is_admin()
2024-04-05 12:48:56 +02:00
Si vous obtenez `Call to undefined function is_admin()` par exemple avec WP-CLI :
2024-04-05 12:48:56 +02:00
~~~
PHP Fatal error: Uncaught Error: Call to undefined function is_admin() in phar:///home/stage3eme/wp-cli.phar/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1334) : eval()'d code:89
~~~
c'est que vous avez probablement une vieille fonction `is_admin()` qui traîne dans `wp-config.php` ou autre.