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
1 |
$ su - |
On va juste l’utiliser pour installer le paquet sudo
1 |
# apt install sudo |
puis faire un visudo pour ajouter l’utilisateur dans le groupe sudoers.
1 |
# 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.
1 |
$ sudo apt update && sudo apt upgrade |
Installer quelques paquets utiles
1 |
$ sudo apt install wget vim |
Éditer la carte réseau et mettre une IP fixe
1 |
$ 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
1 |
$ sudo vim /etc/resolv.conf |
Mettre le dns de votre provider ou autre
Redémarrer la carte réseau
1 |
$ sudo ifdown enp0s3 |
1 |
$ sudo ifup enp0s3 |
ou
1 |
$ sudo /etc/init.d/networking restart |
-
Configuration de WordPress
Procédons a l’installation de MariaDB, PHP et Nginx
1 |
$ 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
1 |
$ sudo systemctl stop apache2 |
1 |
$ sudo systemctl disable apache2 |
1 2 |
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.
1 |
$ sudo systemctl start mariadb |
1 |
$ sudo systemctl enable mariadb |
Sécurisé a minima mysql avec la commande
1 |
$ mysql_secure_installation |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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. <strong>Enter current password for root (enter for none):</strong> OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. <strong>Set root password? [Y/n]</strong> 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. <strong>Remove anonymous users? [Y/n]</strong> ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. <strong>Disallow root login remotely? [Y/n]</strong> ... 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. <strong>Remove test database and access to it? [Y/n]</strong> - 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. <strong>Reload privilege tables now? [Y/n]</strong> ... 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
1 |
$ mysql -u root -p |
1 |
MariaDB [(none)]> create database <strong>db_wp</strong>; |
Query OK, 1 row affected (0.00 sec)
1 |
MariaDB [(none)]> grant all privileges on <strong>db_wp</strong>.* to <strong>user_wp</strong>@'localhost' identified by '<strong>motdepasse</strong>'; |
Query OK, 0 rows affected (0.00 sec)
1 |
MariaDB [(none)]> flush privileges; |
Query OK, 0 rows affected (0.00 sec)
1 |
MariaDB [(none)]> exit |
Bye
Télécharger WordPress (release 4.8.3 au 11/2017)
1 |
$ wget https://fr.wordpress.org/wordpress-4.8.3-fr_FR.tar.gz |
Extraire l’archive et déplacer le contenu dans /var/www/
1 |
$ tar -zxf wordpress-4.8.3-fr_FR.tar.gz |
1 |
$ sudo mv wordpress /var/www/ |
Renommer le fichier wp-config, supprimer le fichier readme, créer le répertoire uploads
1 |
$ cd /var/www/wordpress |
1 |
$ mkdir wp-content/uploads |
1 |
$ mv wp-config-sample.php wp-config.php |
1 |
$ rm readme.html |
Puis configurer le fichier wp-config.php, ajouter les infos précédemment créer dans Mariadb
1 |
$ sudo vim wp-config.php |
1 2 3 4 5 6 7 8 9 10 11 12 |
// ** 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
1 2 3 4 5 |
<span style="color: #808080;">require_once(ABSPATH . 'wp-settings.php'); </span> 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.
1 |
$ sudo chown -R www-data:www-data /var/www/wordpress/ |
1 |
$ sudo find /var/www/wordpress/ -type f -exec chmod 644 {} + |
1 |
$ 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.
1 |
$ sudo vim /etc/nginx/sites-available/wordpress |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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
1 |
$ sudo vim /etc/nginx/nginx.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
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
1 |
$ sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress |
1 |
$ 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
1 |
$ 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.
1 |
$ sudo vim /etc/nginx/sites-available/wordpress |
1 2 |
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 |
1 2 3 |
# 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
1 |
$ 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
1 |
$ 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
1 |
$ sudo vim /etc/iptables/rules.v6 |
Puis éditer le fichier rules.v4 et créer les règles pour autoriser les flux
1 |
$ sudo vim /etc/iptables/rules.v4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 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
1 |
$ sudo systemctl restart netfilter-persistent |
Faire un status pour verifier le bon fonctionnement
1 |
$ sudo systemctl status netfilter-persistent |
1 2 3 4 5 6 7 8 9 10 |
<span style="color: #00ff00;">●</span> netfilter-persistent.service - netfilter persistent configuration Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled) Active: <span style="color: #00ff00;">active (exited)</span> 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
1 |
$ sudo iptables-save |
Vérifier iptables
1 |
$ sudo iptables -L |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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
1 |
$ sudo vim /etc/php/7.0/apache2/php.ini |
De-commenter et modifier les valeurs comme ci dessous.
1 |
$ sudo systemctl restart php5-fpm |
Ajuster le nombre de cœurs pour utiliser toute la puissance
Pour connaître leur nombre taper la commande
1 |
$ grep processor /proc/cpuinfo | wc -l |
Puis éditer le fichier et modifier la valeur.
1 |
$ sudo vim /etc/nginx/nginx.conf |
1 |
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
1 |
server_tokens off; |
Puis redémarrer le service nginx
1 |
$ sudo systemctl restart nginx |
Source: https://howto.wared.fr/installation-wordpress-ubuntu-nginx/