introduction
Étant donné le penchant d'OpenBSD pour la sécurité, cela n'a de sens que d'alimenter votre site Web WordPress avec lui, en particulier parce que WordPress et PHP ont tendance à être des cibles mobiles pour les script kiddies. Le httpd d'OpenBSD étant principalement conçu pour servir des pages statiques, les opérations POST sont réservées aux processus fastcgi et slowcgi. Cela rend plus difficile pour un acteur voyou de potentiellement interrompre le processus du serveur Web et accéder à votre serveur. Les opérations POST sont dirigées vers le processus fastcgi et utilisent un interpréteur externe. Cet article traitera non seulement de la configuration de votre site WordPress, mais également de certaines techniques de maintenance de base et de la sauvegarde et de la restauration de votre site et de sa base de données. Partout où vous voyez example.com
le domaine, veuillez le remplacer par votre domaine.
Configuration initiale
Si vous ne l'avez pas déjà fait, vous devrez créer un /etc/doas.conf
fichier. La commande doas est le remplacement facile d'OpenBSD pour sudo. Pour plus de commodité, j'ai ajouté l'option nopass afin que vous n'ayez pas à retaper votre mot de passe lorsque vous utilisez des doas. Si vous préférez ne pas l'avoir, omettez simplement nopass.
su -
echo "permit nopass keepenv :wheel" > /etc/doas.conf
Selon la façon dont OpenBSD a été empaqueté pour le déploiement, le gestionnaire de packages peut parfois ne pas avoir de référentiel configuré. Pour configurer le dépôt officiel d'OpenBSD, nous devons créer le /etc/installurl
fichier.
doas su
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
exit
Maintenant, nous devons ajouter PHP et certains modules supplémentaires dont WordPress aura besoin pour gérer des choses comme les images et le cryptage. Lorsque vous y êtes invité, choisissez d'installer le dernier package de PHP. Une chose que vous devez faire est de copier les fichiers ini du module depuis le répertoire d'exemple vers le répertoire principal. Cela doit être fait afin d'activer les modules PHP supplémentaires.
doas pkg_add -r mariadb-client mariadb-server php php-curl php-mysqli php-zip pecl73-mcrypt pecl73-imagick wget
doas cp /etc/php-7.3.sample/* /etc/php-7.3/.
Obtenir des certificats Let's Encrypt
Dans le monde d'aujourd'hui, les sites Web doivent être servis via SSL ou être menacés par les moteurs de recherche. Heureusement, OpenBSD a une excellente application appelée acme-client. Le client acme générera automatiquement une nouvelle clé privée et demandera un nouveau certificat entièrement valide. Le client acme dépend de la présence d'un serveur Web, nous devons donc créer une définition de serveur par défaut rapide.
Avec votre éditeur préféré, créez /etc/httpd.conf
. Nous ajouterons les autres définitions de serveur au fichier ultérieurement. Pour l'instant, cela suffira pour que le client acme fonctionne correctement.
prefork 5
types { include "/usr/share/misc/mime.types" }
server "default" {
listen on egress port 80
root "/htdocs"
directory index "index.html"
location "/.well-known/acme-challenge/*" {
request strip 2
root "/acme"
}
}
En utilisant également votre éditeur préféré, créez /etc/acme-client.conf
.
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
authority letsencrypt-staging {
api url "https://acme-staging-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-staging-privkey.pem"
}
domain example.com {
alternative names { www.example.com }
domain key "/etc/ssl/private/example.com.key"
domain full chain certificate "/etc/ssl/example.com.crt"
sign with letsencrypt
}
Nous devons maintenant activer et démarrer httpd. Une fois cela fait, nous pouvons exécuter acme-client et attendre qu'il obtienne notre nouveau certificat. Après cela, nous ajouterons un travail cron pour en demander automatiquement un nouveau tous les 7 jours afin que nous n'ayons pas à nous soucier de l'expiration.
doas rcctl enable httpd
doas rcctl start httpd
doas acme-client -v example.com
Nous créons maintenant le travail cron. Ajoutez cette ligne sous la toute dernière entrée. Dans ce cas, nous demandons à acme-client de demander le nouveau certificat à 1h00 tous les samedis.
doas crontab -e
0 1 * * 6 acme-client -F example.com && rcctl reload httpd
Configurer HTTPD pour WordPress
Il est maintenant temps de configurer httpd pour WordPress. Plutôt que de placer directement la définition de notre site Web /etc/httpd.conf
, nous allons le placer dans un fichier distinct appelé /etc/httpd.conf.example.com
et l'inclure dans le fichier de configuration principal. Il est généralement recommandé de séparer les deux, en conservant les définitions à l'échelle du site dans votre fichier de configuration principal et les paramètres spécifiques au domaine dans un autre.
Ajoutez la ligne suivante au bas de votre /etc/httpd.conf
fichier:
include "/etc/httpd.conf.example.com"
Maintenant, en utilisant votre éditeur préféré, créez votre /etc/httpd.conf.example.com
. Pour plus de commodité, nous allons créer des fichiers journaux distincts pour votre domaine. Cela facilite la tâche lors de la recherche de problèmes potentiels avec votre site.
server "example.com" {
listen on egress port 80
alias "www.example.com"
# Automatically redirect to SSL
block return 302 "https://$SERVER_NAME$REQUEST_URI"
log {
access "access-example.com"
error "error-example.com"
}
}
server "example.com" {
listen on egress tls port 443
alias "www.example.com"
root "/htdocs/wordpress"
directory index "index.php"
log {
access "access-example.com"
error "error-example.com"
}
tcp { nodelay, backlog 10 }
tls {
certificate "/etc/ssl/example.com.crt"
key "/etc/ssl/private/example.com.key"
}
hsts {
# max-age value is the number of seconds in 1 year
max-age 31556952
preload
subdomains
}
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
location "/posts/*" {
fastcgi {
param SCRIPT_FILENAME \
"/htdocs/wordpress/index.php"
socket "/run/php-fpm.sock"
}
}
location "/page/*" {
fastcgi {
param SCRIPT_FILENAME \
"/htdocs/wordpress/index.php"
socket "/run/php-fpm.sock"
}
}
location "/feed/*" {
fastcgi {
param SCRIPT_FILENAME \
"/htdocs/wordpress/index.php"
socket "/run/php-fpm.sock"
}
}
location "/comments/feed/*" {
fastcgi {
param SCRIPT_FILENAME \
"htdocs/wordpress/index.php"
socket "/run/php-fpm.sock"
}
}
location "/wp-json/*" {
fastcgi {
param SCRIPT_FILENAME \
"htdocs/wordpress/index.php"
socket "/run/php-fpm.sock"
}
}
location "/wp-login.php*" {
authenticate "WordPress" with "/htdocs/htpasswd"
fastcgi socket "/run/php-fpm.sock"
}
location "*.php*" {
fastcgi socket "/run/php-fpm.sock"
}
}
Pour plus de sécurité, nous allons implémenter une invite supplémentaire pour un nom d'utilisateur et un mot de passe lors de la connexion au site d'administration WordPress. Étant donné que les script kiddies aiment essayer à plusieurs reprises la connexion bruteforce de WordPress, nous créons une connexion supplémentaire au niveau du serveur Web. En règle générale, ils obtiennent environ 5 suppositions avant que WordPress ne génère une erreur 401 non autorisée.
doas su
cd /var/www/htdocs
doas htpasswd htpasswd <user>
doas chown www:www htpasswd
doas chmod 0640 htpasswd
doas rcctl reload httpd
Nous devons modifier le php pour que votre installation WordPress puisse envoyer des e-mails. WordPress et certains plugins reposent sur la possibilité d'envoyer des e-mails vous informant des mises à niveau, des alertes et des modifications. L'incapacité d'envoyer des e-mails peut casser certaines fonctionnalités de WordPress. Puisque httpd fonctionne dans un environnement chrooté, nous devons dire à php comment envoyer des e-mails. De plus, nous devons faire quelques tweeks de performance à php-fpm.
Recherchez la sendmail_path
ligne /etc/php-7.3.ini
et effectuez la modification suivante:
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; sendmail_path =
sendmail_path = /bin/femail -t -i
Recherchez les lignes suivantes dans /etc/php-fpm.conf
et modifiez-les comme suit:
pm.start_servers = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 6
L'étape suivante consiste à activer et démarrer php-fpm.
doas rcctl enable php73_fpm
doas rcctl start php73_fpm
MariaDB est un fork de remplacement drop-in de MySQL. Nous devons effectuer une configuration initiale et un travail de préparation de la base de données pour WordPress.
Avant de pouvoir utiliser MariaDB efficacement, nous devons autoriser le démon mysql à utiliser plus de ressources que la valeur par défaut. Pour ce faire, apportez les modifications suivantes à /etc/login.conf
en ajoutant cette entrée en bas.
mysqld:\
:openfiles-cur=1024:\
:openfiles-max=2048:\
:tc=daemon:
Nous devons faire quelques modifications dans le fichier de configuration MariaDB, /etc/my.cnf
. En faisant communiquer le client et le serveur mysql via une socket de domaine UNIX au lieu de TCP, l'utilisation de la mémoire de votre serveur peut être réduite. Vous n'êtes pas obligé d'effectuer toutes les modifications suggérées ci-dessous. Les deux éléments importants à modifier sont la socket
ligne et à commenter la bind-address
ligne. Cela déplace le socket à l'intérieur de l' /var/www
environnement chroot afin que WordPress puisse se connecter à la base de données. En commentant la bind-address
ligne, nous empêchons MariaDB d'écouter sur un port TCP.
[client-server]
socket=/var/www/var/run/mysql/mysql.sock
#port=3306
# This will be passed to all MariaDB clients
[client]
#password=my_password
# The MariaDB server
[mysqld]
# To listen to all IPv4 network addresses, use "bind-address = 0.0.0.0"
#bind-address=127.0.0.1
# Directory where you want to put your data
#data=/var/mysql
# This is the prefix name to be used for all log, error and replication files
#log-basename=mysqld
# Logging
#log-bin=/var/mysql/mariadb-bin
#max_binlog_size=100M
#binlog_format=row
#expire_logs_days = 7
#general-log
#slow_query_log
query_cache_type = 1
query_cache_limit = 1M
query_cache_size = 16M
Maintenant, nous devons exécuter le binaire d'installation de MariaDB et activer et démarrer MariaDB. Cette procédure définira un mot de passe root et supprimera éventuellement la base de données de test. C'est une bonne idée de suivre toutes les suggestions de l'étape d'installation sécurisée.
doas mysql_install_db
doas rcctl enable mysqld
doas rcctl start mysqld
doas mysql_secure_installation
Créez la base de données WordPress et l'utilisateur de la base de données. N'oubliez pas de remplacer <wp_user>
par votre nom d'utilisateur de base de données et <password>
par un mot de passe complexe de votre choix.
mysql -u root -p
CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO '<wp_user>'@'localhost' IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;
EXIT
WordPress n'a pas eu de port OpenBSD officiel depuis un certain temps car il fonctionne à peu près tout de suite. Téléchargez, extrayez et déplacez le dossier d'installation de WordPress.
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar xvfz latest.tar.gz
doas mv wordpress /var/www/htdocs/.
doas chown -R www:www /var/www/htdocs/wordpress
doas chmod 0755 /var/www/htdocs/wordpress
cd /var/www/htdocs/wordpress/
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
Nous devons copier /etc/resolv.conf
et /etc/hosts
dans un répertoire que nous allons créer appelé /var/www/etc
. C'est ainsi que WordPress peut réussir à atteindre le marché. Vous en aurez besoin pour télécharger des plugins et des thèmes via le site d'administration WordPress. Il est également important que le plug-in Jet Pack fonctionne correctement.
doas mkdir /var/www/etc
doas cp /etc/hosts /var/www/etc/.
doas cp /etc/resolv.conf /var/www/etc/.
À partir d'ici, accédez à votre site Web WordPress en utilisant https via l'URL que vous avez spécifiée dans la définition de serveur Web. Si tout fonctionne correctement, vous devriez voir l'assistant d'installation de WordPress. Lorsque vous obtenez l'option de spécifier un serveur de base de données, vous devez utiliserlocalhost:/var/run/mysql/mysql.sock
Une fois WordPress installé, il est temps de configurer les permaliens pour qu'ils soient plus conviviaux pour le référencement. Depuis l'écran d'administration de WordPress, accédez à Settings -> Permalinks
. Cliquez sur Structure et type personnalisés /posts/%postname%
. Après avoir effectué cette modification, cliquez sur le bouton Enregistrer les modifications. Vous avez maintenant des liens beaucoup plus beaux. Par exemple, un permalien ressemblera à ceci:https://example.com/posts/example-blog-post
À partir d'ici, vous devriez avoir un site Web de base prêt à l'emploi. Assurez-vous d'installer des plugins comme Jet Pack et WP-Super Cache. Le plugin WP-Super Cache permet d'accélérer votre site Web en mettant en cache des pages Web et en éliminant les recherches de base de données constantes et JetPack vous donne d'excellentes statistiques d'audience.
Sauvegarder votre site Web et votre base de données WordPress
Il va sans dire que la sauvegarde de votre site Web et de votre base de données est très importante. Heureusement, c'est une chose relativement facile à faire. Sauvegardez les deux dans votre répertoire personnel et vous pouvez ensuite les copier via scp vers un autre emplacement. Vous pouvez également créer un instantané via le panneau de configuration Vultr. C'est une bonne idée de faire les deux.
cd /var/www/htdocs
tar cvfz wordpress.tgz wordpress/
cp wordpress.tgz /home/user
mysqldump -u root -p wordpress > wordpress.sql && gzip wordpress.sql
Restaurer votre site Web WordPress
Si votre base de données est corrompue et qu'une restauration est nécessaire, procédez comme suit:
gunzip wordpress.sql.gz
mysql -u root -p wordpress
DROP USER '<user>'@'localhost';
DROP DATABASE wordpress;
CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO '<wp_user>'@'localhost' IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;
EXIT
mysql -u root -p wordpress < wordpress.sql
Si vous avez modifié un fichier de script WordPress qui a cassé quelque chose, vous pouvez toujours réinstaller WordPress via le panneau de configuration administrateur. Recherchez la Updates
section et cliquez sur le lien. Recherchez un bouton étiqueté Re-install Now
. Cela corrigera au moins ce qui est cassé mais la plupart de votre configuration devrait rester intacte.
Si votre base de données est en bon état, mais que vous avez accidentellement modifié un fichier et interrompu des choses au point où vous ne pouvez même plus accéder à la console d'administration WordPress, procédez comme suit:
rm /var/www/htdocs/wordpress
cp /home/user/wordpress.tgz /tmp
tar xvfz wordpress.tgz
mv wordpress /var/www/htdocs/.
chown -R www:www /var/www/htdocs/wordpress
cd /var/www/htdocs/wordpress
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;