-- Tyc-Tac & Cr4Sh --
members of Be Cyber Community
Pour qui ?
Le Security Guide est un référentiel destiné à toute personne souhaitant sécuriser ses infrastuctures, que ce soit au niveau de ses serveurs et/ou son site basé sur un CMS Wordpress, même sans connaissances poussées en développement ni en réseau.
Les propos seront donc le plus vulgarisés possibles afin de vous accompagner, étape par étape, pour la mise en place des bonnes pratiques et l'installation de plugins reconnus en la matière.
Disclaimer
Par définition un système d'information ne peut être inviolable et la cybersécurité évolue à une vitesse importante. Ce support ne peut garantir une sécurité sans faille face aux risques de piratage.
Nous déclinons donc toute responsabilité quant à la mise en pratique des éléments de ce support, des outils et plugins utilisés, nous ferons cependant de notre mieux pour maintenir ce support à jour au fur et à mesure des évolutions dans le domaine.
Le Security Guide est rédigé et mis à disposition gratuitement pour toute personne souhaitant renforcer la sécurité de ses infrastructures.
Notre objectif est d'aider la communauté à réduire sa surface d'attaque pour contribuer à un Web plus sûr. Par conséquent, ce guide est partageable dans les conditions de la licence CC BY-NC-ND 4.0 DEED à des fins informatives et communautaire. Cependant, toute utilisation commerciale de ce référentiel autre que par ses auteurs est FORMELLEMENT INTERDITE.
Date de mise à jour : 2024-04-19
- Installer et sécuriser Apache
- Installer et sécuriser Nginx
- Installer et sécuriser PHP
- Installer MariaDb pour Wordpress
La première chose à faire avant de faire des installations ... est de mettre à jour votre système.
Note : Toutes les commandes sont ici considérées comme étant logué sur l'utilisateur
root
, si ce n'est pas le cas, switchez enroot
ou rajoutez la commandesudo
devant toutes les commandes.
Testé en environnement
DEBIAN 12
sur VPS
# Mise à jour du système et mise à jour des dépendances existantes
apt update && apt upgrade -y
Ensuite, vous pouvez installer les dépendances dont vous avez besoin.
# Installation des dépendences
apt install ca-certificates apt-transport-https software-properties-common lsb-release curl -y
# Installation d'Apache
apt install apache2-utils libapache2-mod-security2 apache2 -y
apt info apache2
Nous allons créer un groupe et un utilisateur pour Apache
Avant toute choses, pensez à stoper Apache
systemctl stop apache2
Vous pouvez maintenant créer un nouveau groupe, un nouvel utilisateur, supprimer l'utilisateur www-data et le groupe www-data.
# Créons un nouveau groupe
addgroup --system "votre-groupe"
# Créons un utilisateur pour Apache qui sera rattaché au groupe que vous avez créé :
adduser --system --no-create-home --disabled-login --ingroup "votre-groupe" --disabled-password "votre-utilisateur"
# Cette commande créée un utilisateur système nommé "votre-utilisateur" sans répertoire personnel (--no-create-home), sans possibilité de se connecter (--disabled-login), et le place dans le groupe "votre-groupe".
# Supprimez l'utilisateur www-data :
deluser www-data
# Assurez-vous qu'il n'y a pas de services ou de processus critiques qui dépendent de cet utilisateur avant de le supprimer.
# Supprimez le groupe www-data :
delgroup www-data
Note : Si vous avez une erreur pour la suppression de l'utilisateur
www-data
, regardez le processus utilisé et retourné dans le message d'erreur afin de vous assurer qu'il n'est pas critique. S'il n'est pas critique, terminez le processus avec la commandekill numéroProcessus
Vu que nous avons créé un utilisateur et un groupe pour notre Apache, il va falloir apporter quelques modifications au fichier envvars:
Note : Si vous avez peur de faire une erreur lorsque vous modifiez un fichier, il vous suffit de commenter la ligne en ajoutant un
#
devant, et de recopier la ligne juste en dessous avec les nouvelles valeurs.Dans l'exemple ci-dessous, vous commentez
#export APACHE_RUN_USER=www-data
et écrivez juste en dessousexport APACHE_RUN_USER="votre-utilisateur"
# Une fois cela fait, on modifie le fichier envvars
nano /etc/apache2/envvars
Dans ce fichier, nous effectuons les modifications suivantes en remplaçant www-data
par les informations de groupe et d'utilisateur que vous avez créé :
# Dans le fichier /etc/apache2/envvars
export APACHE_RUN_USER="votre-utilisateur"
export APACHE_RUN_GROUP="votre-groupe"
# On redémarre le serveur Apache
systemctl restart apache2
Nous allons ensuite renforcer la sécurité de notre Apache en modifiant et ajoutant quelques règles dans notre fichier /etc/apache2/conf-available/security.conf
# Nous allons modifier le fichier avec les règles pour le renforcer
nano /etc/apache2/conf-available/security.conf
Une fois dans notre fichier, cherchez les lignes correspondantes pour modifier les règles suivantes.
Note : Si les lignes n'existent pas déjà et que vous avez bien vérifié, rajoutez les lignes manquantes à votre fichier de configuration :
# Dans le fichier etc/apache2/conf-available/security.conf
# Cachez la version du serveur apache
ServerTokens Prod
ServerSignature Off
# Désactivez la méthode TRACE
TraceEnable Off
# Configurez X-Frame-Options
Header always append X-Frame-Options SAMEORIGIN
# Activez X-XSS-Protection
Header always set X-XSS-Protection: "1; mode=block"
# Réduisez les risques de sécurité de type MIME
Header always set X-Content-Type-Options: "nosniff"
# HSTS - HTTP Strict Transport Sercurity
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Sécurisation des cookies
Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Avant d'activer le module a2enmod php8.*
, pensez à installer PHP
# Modifcation des entêtes
a2enmod headers
# Réécriture des urls
a2enmod rewrite
# Activation de ssl pour https
a2enmod ssl
# Activation de php
a2enmod php8.*
# Autres options disponible
# a2enmod cache Pour activer le mode cache
# a2enmod cache_disk Pour activer le mode cache
systemctl reload apache2
L'activation du module a2enmod ssl
va créer un fichier de configuration */etc/apache2/mods-enabled/ssl.conf *
Il va nous falloir le modifier pour désactiver certains protocoles obsolètes.
# Désactivez les protocoles SSL/TLS obsolètes
nano /etc/apache2/mods-enabled/ssl.conf
Trouvez les lignes correspondant à ces configurations et modifiez les valeurs.
# Dans le fichier /etc/apache2/mods-enabled/ssl.conf
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
Une fois effectué, nous pouvons vérifier que nos configuration ont bien été enregistrées :
grep -ir SSLProtocol /etc/apache2/*
Dans certains cas, curl
n'est pas installé, il faudra donc l'installé avec la commande apt install curl
afant de lancer le test.
curl -v http://localhost:80/ | head
Nous avons correctement configuré notre serveur Apache enjoy !!
apt-get install nginx && apt-get install nginx-extras
systemctl enable nginx
systemctl start nginx
systemctl status nginx
curl -I http://127.0.0.1/
# On voit la version de notre serveur nginx
# Désactivez la signature
nano /etc/nginx/nginx.conf
#Dans le fichier /etc/nginx/nginx.conf
server_tokens off;
# Modifiez la ligne ssl comme suit TLS 1 et TLS 1.1 obsolète
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
systemctl reload nginx
curl -I http://127.0.0.1/
# La signature est bien désactivée, mais cela affiche Nginx corrigeons cela
nano /etc/nginx/nginx.conf
#Dans le fichier /etc/nginx/nginx.conf
# Ajoutez cela en dessous du commentaire basic
more_set_headers 'Server: ';
systemctl reload nginx
curl -I http://127.0.0.1/
# Voilà, parfait cela n'affiche plus Nginx
nano /etc/nginx/nginx.conf
# Dans le fichier /etc/nginx/nginx.conf
# Ajout des protections pour les headers
more_set_headers "X-Content-Type-Options : nosniff";
more_set_headers "X-XSS-Protection : 1; mode=block";
more_set_headers "X-Download-Options : noopen";
more_set_headers "X-Permitted-Cross-Domain-Policies : none";
more_set_headers "X-Frame-Options : SAMEORIGIN";
# Vous pouvez ajouter CSP
systemctl reload nginx
curl -I http://127.0.0.1/
# Pour la sécurité, c'est tout, mais vous pouvez envisager bien plus au niveau de vos optimisations
Nous allons installer PHP8.3 qui est la dernière version de php
# Récuperation de la clé
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
# Ajout aux sources
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
# Mise à jour
apt update
# Installation des paquets PHP utilisés par Wordpress
apt-get install php8.3 php8.3-cli php8.3-common php8.3-imap php8.3-redis php8.3-snmp php8.3-xml php8.3-mysqli php8.3-zip php8.3-mbstring php8.3-curl libapache2-mod-php8.3 -y
# Voir la version de PHP
php -v
# Ajout du fichier phpinfo pour voir notre configuration
echo "<?php phpinfo(); ?>" | tee /var/www/html/phpinfo.php
ATTENTION : Votre fichier
phpinfo.php
révèle beaucoup trop d'information pour le laisser accessible, surtout sur un serveur en ligne.Si vous avez ajouter le fichier phpinfo pour voir votre configuration, nous vous conseillons d'aller le supprimer dès que vous n'en aurez plus besoin et si possible, jamais sur un serveur en ligne.
Dans le cas où vous ayez créé le fichier phpinfo.php
, vous pouvez l'utiliser de la sorte :
#Ouvrir la page
http://votreurl/phinfo.php
Comme vous pouvez le voir un certain nombre de choses ne sont pas bonnes d'un point de vu sécurité
Pour supprimer le phpinfo.php
si vous l'avez créé précédemment :
# Supprimer le fichier phpinfo.php
rm /var/www/html/phpinfo.php
# Tout se passe ici
nano /etc/php/8.3/apache2/php.ini
Note : Dans le cas où vous ayez créer un fichier
phpinfo.php
précédemment, nous vous conseillons de rajouter,phpinfo
à la fin de la lignedisable_function
# Désactivation d'un certain nombre de fonctions inutiles dans notre cas
disable_functions = exec, shell_exec, system, passthru, popen, proc_open, symlink, eval, assert, pcntl_exec, pcntl_fork, pcntl_signal, pcntl_waitpid, pcntl_wexitstatus, pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wifcontinued, pcntl_wstopsig, pcntl_wtermsig, pcntl_strerror, pcntl_get_last_error, pcntl_signal_dispatch, pcntl_sigprocmask, pcntl_sigwaitinfo, pcntl_sigtimedwait, pcntl_async_signals, pcntl_unshare, pcntl_setpriority, pcntl_getpriority
# Désactivation de la version de php
expose_php = Off
# Révocation l'inclusion de fichier
allow_url_include = Off
# Seuls les fichiers dans votre site Web peuvent être inclus
allow_url_fopen = Off
Félicitations PHP est maintenant sécurisé
# Installation de Mariadb
apt install mariadb-server -y
# Activation
systemctl enable mariadb
# Démarrage
systemctl start mariadb
# Vérification
systemctl status mariadb
# Sécurisation de votre installation avec des mots de passe fort
mariadb-secure-installation
# Par défaut, votre utilisateur root n'a pas de mot de passe, il vous faut en rentrer un le plus robuste possible pour cet utilisateur.
# Connexion à Mariadb
mysql -u root -p
--Création de nos tables pour Wordpress
CREATE USER 'anyone'@'localhost' IDENTIFIED BY 'YourStrongPasswordHere';
CREATE DATABASE tstSecure;
GRANT ALL PRIVILEGES ON tstSecur.* TO 'anyone'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Déplacez-vous dans le dossier html
cd /var/www/html
# Télécharger la dernière version de Wordpress
wget https://wordpress.org/latest.zip
# Dézipper le fichier reçu
unzip latest.zip
# Supprimer le fichier latest.zip après l'avoir dézippé
rm latest.zip
# Déplacer tous les fichiers contenus dans le dossier wordpress directement dans le dossier html
mv wordpress/* .
# Enfin supprimer le dossier Wordpress
rm -r wordpress/
Note : Dans le dossier
/var/www/html
vous avez un fichierindex.html
qui est installé par défaut, il vous faudra le déplacer (ou le supprimer) afin que votre serveur puisse se lancer correctement sur votre site Wordpress.
Remerciements :
Ce référentiel à été réalisé afin de permettre à toute personne, même peu à l'aise avec le code, de pouvoir améliorer la sécurisation de ses infrastructures, de manière la plus simple possible, en ce contexte cyber assez particulier.
Nous espérons que ce référentiel vous a plu, qu'il aidera le plus de monde possible, alors n'hésitez pas à le partager à toute personne qui en aurait besoin.
Nous le tiendrons à jour le plus régulièrement possible et nous le ferons évoluer sur différents sujet Cyber, alors gardez ce référentiel en favori pour en profiter 👩💻👨💻
Merci pour votre intérêt et nous vous disons à très bientôt pour plus de contenu.
Crédits :
-
Tyc-Tac : Be.Cyber Community
-
Cr4Sh : Be.Cyber Community - Edu.Cyber