Nginx: Installation de WordPress

Nginx: Installation de WordPress

 

Nginx est un serveur web pouvant aussi faire office de reverse proxy créé par Igor Sysoev en 2002. A la base, il a été développé pour un site russe à fort trafic, et depuis la popularité de nginx n’a cessé d’augmenter ! 

Il est surtout réputé pour ses performances et sa faible consommation mémoire venant de son architecture : au lieu de dédier un processus ou un thread pour traiter chaque requête comme le fait Apache par exemple, NGINX va utiliser un modèle dit événementiel: cela lui permet donc de tenir un grand nombre de connexions simultanées en utilisant bien moins de ressources. De très nombreux sites connus l’ont adoptés, comme par exemple Github ou WordPress justement. 

Sans plus attendre, commençons !

 

1) Activer l’accès SSH à distance et réglages de base

Dans cette première partie je ne vais pas parler de l’installation d’une Debian, qui est quelque chose de relativement aisée. Nous allons simplement voir comment activer l’accès SSH à distance pour pouvoir administrer notre serveur à distance, ainsi que l’installation/désinstallation de certains paquets.

La première chose à faire est donc d’éditer le fichier de configuration SSH se trouvant dans /etc/ssh/sshd_config et de dé-commenter la ligne #Port 22 en prenant bien soin de remplacer ce fameux port par un autre que vous choisirez (cela permet de se prémunir des attaques de bots).

Ensuite, on descend un peu plus dans le fichier et on dé-commente la ligne #PermitRootLogin prohibit-password en supprimant la dernière partie de texte pour rajouter un simple yes. (Même si cela est fortement déconseillé en environnement de production, nous allons laisser l’accès SSH à l’utilisateur root).

Et enfin, on installe quelque paquets de base, à savoir:

  • IPTables, pour créer un pare-feu logiciel par la suite;
  • Htop, pour afficher la charge et la consommation RAM/CPU en temps réelle ainsi que la liste des processus actifs ;
  • ScreenFetch, pour avoir quelques informations de base sur la configuration matériel et logicielle de son serveur ;
  • Fail2Ban, pour bannir temporairement des adresses IP lors de certaines actions (échec du login SSH au bout de X tentatives par exemple) ;

A noter que la partie Iptables/Fail2Ban sera détaillée en fin d’article.

 

2) Installation de MariaDB

La seconde étape par laquelle nous allons procéder est l’installation du logiciel de gestion de base de données. Pour informations, MariaDB est l’équivalent Open-Source de MySQL, qui a été racheté depuis peu par Oracle, devenant donc doucement commercial…

Pour l’installation, rien de plus simple:

apt-get install mariadb-server

Puis nous lançons le script d’installation:

mysql_secure_installation

Ici, il nous sera demandé de renseigner le mot de passe root, d’autoriser l’accès root distant ou non, de supprimer la base de données « test » créée par défaut, etc.

Ensuite, on va se connecter au Shell de MariaDB, créer une base de données, puis créer un utilisateur identifié par un mot de passe et enfin lui donner l’entièreté des droits sur cette dernière avant de rafraîchir les droits

mysql -u root -p
create database site_wordpress;
create user wordpress@localhost identified by 'P@SSwoRD';
grant all privileges on site_wordpress.* to wordpress@localhost;
flush privileges;
exit;

 

3) Téléchargement de WordPress

La troisième étape (et la plus rapide) consiste simplement à télécharger l’archive contenant WordPress, et à la décompresser dans un dossier temporaire (dans notre home par exemple) :

cd /home/it-anthony/
wget http://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz

 

4) Installation de PHP et ses extensions

Passage très rapide ici aussi, nous allons nous contenter d’installer PHP ainsi que quelques extensions très utilisées dans l’installation de sites WordPress (notamment le php-fpm pour NGINX) :

apt-get install php php-fpm php-mysql-y

A noter que lors de l’installation de php, celui-ci va installer apache2 par la même occasion… on va donc stopper le service et le désactiver:

systemctl stop apache2
systemctl disable apache2

  

5) Installation de NGINX

Il nous suffit de vérifier que notre distribution est à jour puis d’effectuer un simple apt-get install nginx, rien de plus facile !

On peut se rendre sur l’adresse IP de notre serveur pour vérifier que tout est correctement installé:

 

6) Création d’un VHost pour WordPress et configuration de NGINX

On se rend donc dans le dossier qui va accueillir notre site, ici ce sera dans le dossier /var/www/wordpress, puis on y déplace le contenu de notre archive récemment extraite (sans oublier de donner les droits nécessaires) :

mv /home/it-anthony/wordpress/ /var/www/
cd /var/www/wordpress
chown -R www-data:www-data /var/www/wordpress/

 

Comme dit dans le titre, nous allons donc modifier quelque peu les paramètres de base de notre serveur web. Pour ce faire, on édite le fichier /etc/nginx/nginx.conf et on va décommenter la ligne #server_tokens off; qui permet donc de cacher la version du serveur web utilisé, la version de PHP, et plusieurs autres informations qu’un potentiel pirate pourrait obtenir.

Bien, c’est à peu près la seule chose à faire (on pourrait éventuellement modifier le nombre de workers maximum mais cela ne nous intéresse pas vraiment). Notre fichier de configuration doit donc ressembler à ceci:

 

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/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# 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;
#	}
#}

Une fois fait, on se rend dans le dossier /etc/nginx/sites-available/ et on copie le vhost existant pour ensuite le modifier:

cp default wordpress
nano wordpress

Voilà le contenu du vhost:

# Upstream to abstract backend connection(s) for php
upstream php {
        server unix:/tmp/php-cgi.socket;
        server 127.0.0.1:9000;
}

server {
        ## Your website name goes here.
        server_name 192.168.1.24;
        ## Your only path reference.
        root /var/www/wordpress;
        ## This should be in your http block and if it is, it's not needed here.
        index index.php;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                # This is cool because no php is touched for static content.
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Pour résumer rapidement les changements effectués:

  • root /var/www/wordpress, qui indique donc le dossier racine de notre site web ;
  • server_name, qui indique le nom de domaine du site web (ici nous sommes dans un lab local, j’ai donc simplement mis l’adresse IP de la machine virtuelle) ;
  •  location ~ .php$, qui permet d’indiquer à NGINX d’utiliser PHP-FPM pour traiter les fichiers php ;

Et pour finir on créer un lien symbolique pour activer notre vhost (l’équivalent du a2ensite de Apache2) :

ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

On peut vérifier si notre configuration est valide en effectuant la commande suivante, qui permet de réaliser du troubleshooting :

nginx -t

Notons aussi qu’il faut modifier le fichier /etc/php/7.0/fpm/pool.d/www.conf et remplacer la ligne listen = /run/php/php7.0-fpm.sock
par listen = 127.0.0.1:9000
ou vous obtiendrez une erreur 502.

  

7) Installation de WordPress

Bien, la partie configuration du serveur web étant enfin terminée, il ne nous reste plus qu’à installer notre CMS ! Pour cela rendons-nous sur l’adresse IP de notre machine, puis il nous suffira de choisir la langue, choisir un nom d’utilisateur et un mot de passe, renseignez les identifiants de la base de données créée en début d’article… Bref, rien de très compliqué en soit.

*Au moment de choisir le préfixe pour les tables, il est toujours bon de changer celui par défaut dans un soucis de sécurité (préférez donc sw_ comme site web par exemple).

Une fois fait, vous pouvez vous rendre sur votre site et tadaaa ! It works !

Après avoir choisi et personnaliser votre thème, il nous reste quelques configurations à effectuer, à savoir:

  • Installer l’extension HideMyWP, permettant de modifier l’URL de la page d’administration et ainsi se prémunir d’attaques de bots ;
  • Créer un nouvel administrateur, et supprimer celui de base, pour une nouvelle fois se prémunir d’attaques de bots ou de scanners ;
  • Aller dans Réglages, et modifier les réglages des permaliens ; 
  • Installer l’extension EU Cookie Law, permettant donc d’afficher un pop-up qui prévient vos utilisateurs que votre site web utilise des cookies ;
  • Retourner dans la section Réglages et modifier l’url de votre site par celui de votre nom de domaine.

Bien entendu, de nombreuses extensions peuvent être rajoutées comme celle de chez Cloudflare si vous désirez passer votre site en HTTPS (voir l’article concerné).

8) Installation du pare-feu Iptables et Jail SSH

Courage, nous approchons de la fin ! Ici nous allons donc créer un pare-feu Iptables qui aura pour but de fermer tout les ports de notre serveur web et de laisser ouverts seulement ceux dont nous avons besoin, pour des raisons évidentes de sécurité.

On se rend donc dans le dossier où se situent les scripts exécutés à chaque démarrage et on créer un fichier que l’on va nommer pare-feu.sh y ajouter notre code (sans oublier de le rendre exécutable) :

cd /etc/init.d/
touch pare-feu.sh
chmod +x pare-feu.sh

Et voici le pare-feu (disponible aussi à cette adresse) :

#!/bin/sh

# Suppression des règles existantes
iptables -F

# Politiques de base
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Maintenir les connexions actives (SSH par exemple)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autoriser le loopback (communication entre services internes)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Autoriser POP
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEP
T
# Autoriser SMTP
iptables -A INPUT -p tcp --dport 125 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 125 -j ACCEPT

# Autoriser IMAP
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# Autoriser DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Autoriser SSH
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 2222 -j ACCEPT

# Autoriser HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

# Autoriser HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

# Autoriser FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT

# Autoriser requête ICMP Echo (Ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

# Bannir certaines adresses IP
iptables -I INPUT -s 159.262.92.118 -j DROP

Bien, on va terminer par créer une jail (c’est-à-dire une sorte de règle) pour le service SSH avec Fail2Ban. Ici, nous allons donc configurer le tout pour qu’au bout de 3 tentatives échouées, l’adresse IP est automatiquement bannie pour une durée de 10 minutes, cela empêchera donc les attaques par Brute-Force (surtout si vous avez changé le port SSH par défaut comme dit en début d’article):

On ouvre donc le fichier de jails locales :

nano /etc/fail2ban/jails.d/defaults-debian.conf

Puis on y colle ce code:

[sshd]
enabled = true
port    = 22
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime = 6000

Pour détailler:

  • Le nom de la règle ;
  • Activer ou non ;
  • Le port en question sur lequel tourne le service ;
  • Utiliser un filtre pré-existant ;
  • Le chemin vers le fichier log utilisé pour vérifier les connexions ;
  • Le nombre de tentatives avant la sanction ;
  • Le nombre en secondes de bannissement.

Enfin on active le service Fail2Ban au démarrage si ce n’est pas déjà fait via la commande systemctl enable fail2ban. Pour vérifier l’état de votre (ou vos) jail(s), on peut utiliser la commande fail2ban-client status, et pour voir la ou les adresses(s) IP bannie(s) on utilise la même commande mais en rajoutant ensuite le nom de la Jail concernée:

(Pour débannir une adresse, il vous suffit d’effectuer la commande fail2ban-client set jail unbanip xxx.xxx.xxx.xxx)

 

Et bien voilà ! On peut à présent redémarrer la machine et commencer à personnaliser notre site web ! On peut aussi par ailleurs tester de se connecter en SSH et volontairement se tromper trois fois de mot de passe pour vérifier que la Jail est bien fonctionnelle.

Ceci conclut donc cet article sur l’insallation et la configuration d’un serveur web NGINX et l’installation de WordPress, avec quelques sécurités de base qui bien entendu ne sont pas complètes, auquel cas cet article serait bien plus long 😊

1 commentaire

Les commentaires sont fermés.