TP6 : Sécurisation du service web public - PasRP-Theo/Admin-II GitHub Wiki

TP6 : Sécurisation du service web public

2. Sécurisation serveur

3. Sécurisation des données

3.1. Isolation de la base de données

Modifications effectuées

Séparation par réseaux Docker :

  • Le conteneur mariadb (DB) est uniquement rattaché au réseau db_net (IPv4 : 172.21.0.3)
  • Le conteneur php est connecté aux deux réseaux (dmz et db_net) afin de servir l'application web et d'accéder à la DB
  • Le conteneur nginx est uniquement sur le réseau dmz, empêchant tout accès direct à la base de données

Configuration dans docker-compose.yml (web) : voir fichier docker-compose.yml

Procédure de validation

Test depuis le conteneur nginx :

  • Un ping vers mariadb échoue ✗ (isolation confirmée)

Test depuis le conteneur php :

  • Le ping vers mariadb réussit ✓ (accès autorisé)

3.2. Configuration d'un utilisateur non privilégié

Modifications effectuées
  • Création de l'utilisateur non privilégié via le fichier user.sql
  • Configuration de résolution DNS : utilisation du fichier my-resolve.cnf pour désactiver la résolution des noms
  • Montage du volume my-resolve.cnf dans le docker-compose
  • Sécurisation des credentials : utilisation d'un fichier .env pour éviter d'afficher les mots de passe en clair
Procédure de validation

Vérification des privilèges :

  • L'utilisateur peut exécuter SELECT
  • L'opération INSERT est refusée ✗ (privilèges limités confirmés)

3.3. Backup de la base de données

Procédure de backup

Dans le fichier docker-compose.yml, nous déclarons un volume externe monté sur /var/lib/mysql, où est stockée la base de données.

Caractéristiques :

  • La directive external: true indique que ce volume est géré en dehors de Docker Compose
  • Le volume existe déjà sur l'hôte
  • Avantage : Même si nous supprimons et reconstruisons le conteneur, les données contenues dans ce volume seront conservées

3.4. Logs de la base de données

Accès aux logs

Commande :

docker logs [id du docker mariadb]

Cette commande permet d'afficher les logs en temps réel du conteneur MariaDB pour le monitoring et le débogage.


4. Sécurisation des communications avec HTTPS

4.1. HTTPS via un certificat auto-signé

4.1.1. Génération du certificat auto-signé avec OpenSSL

Génération effectuée avec les outils OpenSSL standard.

❓ Question : Analyse du certificat par le navigateur

Problématique identifiée : Le certificat auto-signé n'étant pas validé par une autorité de certification reconnue, le navigateur affiche une alerte indiquant que la connexion n'est pas sécurisée.

Explication :

  • Le certificat n'est pas digne de confiance
  • L'authenticité du site ne peut pas être garantie
  • Cela met en évidence l'importance des autorités de certification (CA) dans l'écosystème PKI

4.1.2. Configuration de Nginx en HTTPS pour le virtualhost www

Configuration HTTPS

Fichier nginx.conf :

  • Utilise un certificat et une clé fournis par Let's Encrypt
  • Garantit l'authenticité du site
  • Les directives ssl_certificate et ssl_certificate_key pointent vers les fichiers de certificat
  • Redirection automatique : les serveurs configurés sur le port 80 redirigent automatiquement les requêtes HTTP vers HTTPS

Résultat : Toutes les connexions se font de manière sécurisée.

4.2. Obtention d'un certificat Let's Encrypt pour le site www

Configuration et validation

❓ Questions d'analyse des logs

Examen des logs /var/log/letsencrypt/letsencrypt.log :

Les éléments suivants devaient être identifiés :

  • Les trois challenges ACME proposés par Let's Encrypt
  • Le token utilisé
  • La configuration nginx temporaire utilisée par certbot pour répondre au challenge
  • L'URL où se trouve le token sur le serveur nginx
  • La composition du certificat reçu
  • L'emplacement des fichiers du certificat et de la clé privée générées par certbot

Note : Les logs temporaires ne sont plus disponibles suite à un redémarrage récent.

Modifications de la configuration nginx

Changements apportés :

  • Ajout des clés SSL
  • Ouverture du port 443
Validation du certificat

Vérifications effectuées :

  • Le site web possède un certificat signé par Let's Encrypt
  • Le certificat est accepté par le navigateur
  • Examen avec OpenSSL : identification des champs de signature du CA dans les "Signature Algorithm"
Problématique du second Virtual Host

Site concerné : blog.l2-2.ephec-ti.be

Problème identifié : Avec un certificat ne couvrant que www, le sous-domaine blog n'est pas compris dans la couverture certificat.

Solution proposée : Utilisation d'un certificat wildcard pour couvrir à la fois :

  • www.l2-2.ephec-ti.ephec.be
  • blog.l2-2.ephec-ti.ephec.be

4.3. Obtention manuelle d'un certificat wildcard pour le domaine

Validation du certificat wildcard

Preuve de fonctionnement : On peut observer sur le certificat la présence du caractère * devant .l2-2.ephec-ti.be, ce qui confirme l'utilisation du wildcard.

Avantage : Ce certificat couvre tous les sous-domaines du domaine principal.


⚠️ **GitHub.com Fallback** ⚠️