[Linux] Installation d’une Debian 9 + WordPress + Nginx + Netfilter

 

Installation d’une Debian 9 + WordPress + Nginx + Netfilter

 

Version de l’OS Debian 9
Version de WordPress 4.8.3

 

Pré-requis  Php, Mariadb

 

  • Installation du système
  • Configuration de WordPress
  • Configuration du vhost Nginx
  • Générer un certificat
  • Configuration de Netfilter
  • Lancement de WordPress

 

 

  • Installation du système

 

Récupérer une image ISO en netinstall sur le site de Debian

Passer en mode Install

 

Choisir le langage du système.

 

Choisir la localisation.

 

Choisir le langage du clavier.

 

Entrer le nom du système.

 

Entrer son domaine.

 

Mettre en mot de passe a l’utilisateur root et le confirmer.

 

Créer un utilisateur et son mot de passe.

 

Pour le partitionnement j’ai par habitude de faire du LVM, mais pas chiffré.

Je ne fais que sur les postes clients pas sur un serveur.

/!\ Je le fait dans ce tuto mais c’est pas une bonne idée en prod si le serveur ou la vm reboot pour x raison, la vm restera en attente de la passphrase.

 

Entrer une passphrase, celle-ci sera demandé au démarrage du système.

 

Récapitulatif du partitionnement et validation.

 

Si vous disposez de cd supplémentaire faire oui.

Sinon choisir le miroir et le dépôt et proxy si il en a un.

 

Choisissez de participer a la collecte des données.

 

Choisir les paquets a installés.

 

Utiliser grub au démarrage et choisir le le premier disque /dev/sda

 

Installation complète, cliquer sur continuer pour redémarrer.

 

Au redémarrage si le disque est chiffré, il est demandé de taper la passphrase.

 

Il n’y a plus qu’a se connecter avec l’utilisateur précédemment crée.

 

Pour se connecter avec l’utilisateur root utiliser la commande

$ su -

 

On va juste l’utiliser pour installer le paquet sudo

# apt install sudo

 

puis faire un visudo pour ajouter l’utilisateur dans le groupe sudoers.

# visudo

Se déconnecter avec la combinaison de touche CTRL+D ou exit pour revenir a l’utilisateur.

 

Faire un update pour vérifier si le système est a jour. Faire un upgrade des paquets trouvés.

$ sudo apt update && sudo apt upgrade

 

Installer quelques paquets utiles

$ sudo apt install wget vim

 

Éditer la carte réseau et mettre une IP fixe

$ sudo vim /etc/network/interfaces

Commenter la ligne inet dhcp, remplacer par static et ajouter votre ip/mask/gw

 

Éditer ensuite le fichier resolv.conf

$ sudo vim /etc/resolv.conf

Mettre le dns de votre provider ou autre

 

Redémarrer la carte réseau

$ sudo ifdown enp0s3
$ sudo ifup enp0s3

ou

$ sudo /etc/init.d/networking restart

 

 

  • Configuration de WordPress

 

Procédons a l’installation de MariaDB, PHP et Nginx

$ sudo apt install mariadb-server php php-fpm php-mysql nginx

 

PHP va installer le paquet Apache2, il faut l’arrêter et désactiver le service car on va s’appuyer sur Nginx

$ sudo systemctl stop apache2
$ sudo systemctl disable apache2
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2

 

Il faut maintenant configurer MariaDB, démarrer et activer le service en auto.

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb

 

Sécurisé a minima mysql avec la commande

$ mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
 SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] 
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!



By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

 

On va ensuite créer la  db, user et mot de passe pour WordPress

 

$ mysql -u root -p
MariaDB [(none)]> create database db_wp;

Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on db_wp.* to user_wp@'localhost' identified by 'motdepasse';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit

Bye

 

Télécharger WordPress (release 4.8.3 au 11/2017)

$ wget https://fr.wordpress.org/wordpress-4.8.3-fr_FR.tar.gz

 

Extraire l’archive et déplacer le contenu dans /var/www/

$ tar -zxf wordpress-4.8.3-fr_FR.tar.gz
$ sudo mv wordpress /var/www/

 

Renommer le fichier wp-config, supprimer le fichier readme, créer le répertoire uploads

$ cd /var/www/wordpress
$ mkdir wp-content/uploads
$ mv wp-config-sample.php wp-config.php
$ rm readme.html

 

Puis configurer le fichier wp-config.php, ajouter les infos précédemment créer dans Mariadb

$ sudo vim wp-config.php
// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
 /** Nom de la base de données de WordPress. */
 define('DB_NAME', 'db_wp');

/** Utilisateur de la base de données MySQL. */
 define('DB_USER', 'user_wp');

/** Mot de passe de la base de données MySQL. */
 define('DB_PASSWORD', 'motdepasse');

/** Adresse de l’hébergement MySQL. */
 define('DB_HOST', 'localhost');

A rajouter également dans wp-config.php pour forcer la connexion en HTTPS, en fin de ligne juste après require_once

require_once(ABSPATH . 'wp-settings.php');

define('WP_HOME','https://srv-wordpress.domaine.local');

define('WP_SITEURL','https://srv-wordpress.domaine.local');

 

Enfin faire un chown pour changer le propriétaire de wordpress puis un chmod 644 sur les fichiers et 755 sur les répertoires.

$ sudo chown -R www-data:www-data /var/www/wordpress/
$ sudo find /var/www/wordpress/ -type f -exec chmod 644 {} +
$ sudo find /var/www/wordpress/ -type d -exec chmod 755 {} +

 

 

  • Configuration du vhost Nginx

 

Création du vhost Nginx, j’ai volontairement commenté les lignes pour les certificats letsencrypt.

$ sudo vim /etc/nginx/sites-available/wordpress
server {
 listen 80;
 server_name srv-wordpress.domaine.local;
 return 301 https://$server_name$request_uri;
}
 
server {
 listen 443 ssl http2;
 server_name srv-wordpress.domaine.local;
 
 root /var/www/wordpress;
 index index.php index.html index.htm;
 
 location / {
 try_files $uri $uri/ /index.php?q=$uri&$args;
 }
 
 error_page 404 /404.html;
 error_page 500 502 503 504 /50x.html;
 location = /index.html {
 root /usr/share/nginx/html;
 }
 
 location ~ \.php$ {
 try_files $uri =404;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
 }
 
 location /wp-config.php {
 deny all;
 }
 
 location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|eot|otf|woff|woff2|ttf|ogg)$ {
 expires 10d;
 }
 
 
#### HTTPS ####
 
 # ssl_certificate /etc/letsencrypt/live/srv-wordpress.domaine.local/fullchain.pem;
 # ssl_certificate_key /etc/letsencrypt/live/srv-wordpress.domaine.local/privkey.pem;
 ssl_session_timeout 5m;
 ssl_session_cache shared:SSL:10m;
 ssl_session_tickets off; 
 
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:";
 ssl_prefer_server_ciphers on;
 
 ssl_ecdh_curve secp384r1;
 
 # ssl_trusted_certificate /etc/letsencrypt/live/srv-wordpress.domaine.local/chain.pem;
 ssl_stapling on;
 ssl_stapling_verify on;
 resolver 8.8.8.8 8.8.4.4 valid=300s;
 resolver_timeout 5s;
 

 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 add_header Content-Security-Policy "default-src 'self';";
 #add_header Content-Security-Policy "default-src 'self'; img-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'";
 add_header Referrer-Policy "no-referrer-when-downgrade";
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Content-Type-Options nosniff;
 add_header X-XSS-Protection "1; mode=block";
}

 

Le fichier de conf nginx doit ressembler a ceci

$ sudo vim /etc/nginx/nginx.conf
user www-data;
 worker_processes auto;
 pid /run/nginx.pid;
 include /etc/nginx/modules-enabled/*.conf;

events {
 worker_connections 768;
 # multi_accept on;
 }

http {

##
 # Basic Settings
 ##

sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 65;
 types_hash_max_size 2048;
 server_tokens off;

# server_names_hash_bucket_size 64;
 # server_name_in_redirect off;

include /etc/nginx/mime.types;
 default_type application/octet-stream;

##
 # SSL Settings
 ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
 ssl_prefer_server_ciphers on;

##
 # Logging Settings
 ##

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

##
 # Gzip Settings
 ##

gzip on;
 gzip_disable "msie6";

 gzip_vary on;
 gzip_proxied any;
 gzip_comp_level 6;
 gzip_buffers 16 8k;
 gzip_http_version 1.1;
 gzip_types text/plain text/css application/json application/javasc$

##
 # Virtual Host Configs
 ##

include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
 }

#mail {
 # # See sample authentication script at:
 # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
 #
 # # auth_http localhost/auth.php;
 # # pop3_capabilities "TOP" "USER";
 # # imap_capabilities "IMAP4rev1" "UIDPLUS";
 #
 # server {
 # listen localhost:110;
 # protocol pop3;
 # proxy on;
 # }
 #
 # server {
 # listen localhost:143;
 # protocol imap;
 # proxy on;
 # }
 #}

 

Faire un lien symbolique et supprimer le vhost par defaut

$ sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress
$ sudo  rm /etc/nginx/sites-enabled/default

 

 

  • Générer un certificat

 

Générer un certificat avec Cerbot

/!\ Attention il faut un nom de domaine valide, et y déclarer un CNAME ou un A, dans mon exemple avec domaine.local cela ne fonctionnera pas.

J’ai fait un article ici

$ sudo certbot-auto

Une fois le certificat généré, celui ci rajoute les lignes nécessaires dans le vhost, pour cela que je les ai commentés plus haut.

 

Ré-éditer le vhost, effacer les lignes rajoutées en fin de fichiers et de-commenter les 3 lignes.

$ sudo vim /etc/nginx/sites-available/wordpress
ssl_certificate /etc/letsencrypt/live/srv-wordpress.domaine.local/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/srv-wordpress.domaine.local/privkey.pem; # managed by Certbot
# ssl_certificate /etc/letsencrypt/live/srv-wordpress.domaine.local/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/srv-wordpress.domaine.local/privkey.pem;
# ssl_trusted_certificate /etc/letsencrypt/live/srv-wordpress.domaine.local/chain.pem;

 

Puis redémarrer les services

$ sudo systemctl restart php7.0-fpm && sudo systemctl restart nginx

 

WordPress est normalement opérationnel

Si vous entrez l’url https://srv-wordpress.domaine.local, vous arrivez sur la page d’accueil pour finaliser l’installation.

Mais avant on va installer la partie firewall.

 

  • Installation et configuration de Netfilter

 

Installer le paquet netfilter

$ sudo apt install iptables-persistent

Les règles iptables actuelles peuvent être sauvegardées dans le fichier de configuration /etc/iptables/rules.v4. Ces règles seront ensuite chargées automatiquement au démarrage du système.
Les règles ne sont sauvegardées automatiquement que pendant l’installation du paquet. Voir la page de manuel de iptables-save (8) pour des instructions sur la mise à jour du fichier de règles.
Enregistrer les règles IPv4 actuelles?

 

Il faudra également confirmer si vous utiliser IPV6

 

Les fichiers iptables se trouvent dans le repertoire /etc/iptables et sont rules.v4 et rules.v6

Pour l’ipv6, je ne l’utilise pas je drop tous les paquets

$ sudo vim /etc/iptables/rules.v6

 

Puis éditer le fichier rules.v4 et créer les règles pour autoriser les flux

$ sudo vim /etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Fri Nov 3 21:19:47 2017
 *filter
 :INPUT DROP [0:0]
 :FORWARD DROP [0:0]
 :OUTPUT DROP [0:0]

# Garder les connexions active pour les retours
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autoriser le loopback
 -A INPUT -i lo -j ACCEPT
 -A OUTPUT -o lo -j ACCEPT

# Connexion au port SSH limité a mes IP public et mon lan
 -A INPUT -p tcp -s 83.x.x.x -m tcp --dport 22 -j ACCEPT
 -A INPUT -p tcp -s 42.x.x.x -m tcp --dport 22 -j ACCEPT
 -A INPUT -p tcp -s 192.168.100.0/24 -m tcp --dport 22 -j ACCEPT

# Pour la resolution dns
 -A INPUT -p tcp --dport 53 -j ACCEPT
 -A INPUT -p udp --dport 53 -j ACCEPT
 -A OUTPUT -p tcp --dport 53 -j ACCEPT
 -A OUTPUT -p udp --dport 53 -j ACCEPT

# Pour le dhcp chez OVH
 -I OUTPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
 -I INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# Autoriser le web
 -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
 -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

COMMIT
 # Completed on Fri Nov 3 21:19:47 201

 

Redémarrer iptables en utilisant la commande netfilter-persistent

$ sudo systemctl restart netfilter-persistent

 

Faire un status pour verifier le bon fonctionnement

$ sudo systemctl status netfilter-persistent
 netfilter-persistent.service - netfilter persistent configuration
 Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled)
 Active: active (exited) since Fri 2017-11-03 22:18:39 CET; 2min 9s ago
 Process: 3757 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS)
 Main PID: 3757 (code=exited, status=0/SUCCESS)

Nov 03 22:18:39 srv-wordpress systemd[1]: Starting netfilter persistent configuration...
Nov 03 22:18:39 srv-wordpress netfilter-persistent[3757]: run-parts: executing /usr/share/netfilter-persiste
Nov 03 22:18:39 srv-wordpress netfilter-persistent[3757]: run-parts: executing /usr/share/netfilter-persiste
Nov 03 22:18:39 srv-wordpress systemd[1]: Started netfilter persistent configuration.

 

Sauvegarder la configuration

$ sudo iptables-save

 

Vérifier iptables

$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination 
ACCEPT udp -- anywhere anywhere udp spts:bootps:bootpc dpts:bootps:bootpc
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere 
ACCEPT tcp -- xxx7x-3-83-x-x-x.fbx.proxad.net anywhere tcp dpt:ssh
ACCEPT tcp -- 42.x.x.x anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.100.0/24 anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere multiport dports http,https

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy DROP)
target prot opt source destination 
ACCEPT udp -- anywhere anywhere udp spts:bootps:bootpc dpts:bootps:bootpc
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere 
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere multiport dports http,https

 

 

  • Lancement de WordPress

Il n’y a plus qu’a relancer le navigateur et a tester wordpress, entrer les informations demandées puis cliquer sur suivant.

 

Entrer l’identifiant précédemment créer

 

Page d’accueil de WordPress

 

 

/!\ 03/2018 – Tips

Améliorer les performances de WordPress avec OPcache

Éditer et modifier le fichier suivant puis redemarrer le service

$ sudo vim /etc/php/7.0/apache2/php.ini

De-commenter et modifier les valeurs comme ci dessous.

$ sudo systemctl restart php5-fpm

 


Ajuster le nombre de cœurs pour utiliser toute la puissance

Pour connaître leur nombre taper la commande

$ grep processor /proc/cpuinfo | wc -l

Puis éditer le fichier et modifier la valeur.

$ sudo vim /etc/nginx/nginx.conf
worker_processes 4; #(4 étant le nombre de cœurs)

Toujours dans le fichier nginx.conf, désactiver le numéro de version de Nginx, pour cela décommentez la directive dans le bloc http

server_tokens off;

Puis redémarrer le service nginx

$ sudo systemctl restart nginx

 

Source: https://howto.wared.fr/installation-wordpress-ubuntu-nginx/

 

 

Rating: 5.0/5. From 4 votes.
Please wait...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.