From 751de7569d2678caeb5e6a603fd1a019c0137d1f Mon Sep 17 00:00:00 2001 From: morepudding Date: Wed, 10 Dec 2025 11:21:36 +0100 Subject: [PATCH] =?UTF-8?q?Exercice=20r=C3=A9ussi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EXERCICE.md | 402 +++++++++++++++++++++++++++++++++++ files/index.html | 22 ++ files/style.css | 54 +++++ playbook.yml | 97 ++++++++- templates/nginx-auth.conf.j2 | 28 +++ 5 files changed, 602 insertions(+), 1 deletion(-) create mode 100644 EXERCICE.md create mode 100644 files/index.html create mode 100644 files/style.css create mode 100644 templates/nginx-auth.conf.j2 diff --git a/EXERCICE.md b/EXERCICE.md new file mode 100644 index 0000000..8977baf --- /dev/null +++ b/EXERCICE.md @@ -0,0 +1,402 @@ +# 🎯 Exercice : AmĂ©liorer le serveur Nginx avec Ansible + +## 📋 Objectif de l'exercice + +Tu vas amĂ©liorer ton projet Ansible actuel en ajoutant 3 fonctionnalitĂ©s importantes : +1. ✅ **HTTPS** (sĂ©curiser le site avec un certificat SSL) +2. ✅ **Authentification** (protĂ©ger l'accĂšs avec login/password) +3. ✅ **DĂ©ployer des pages web** (mettre ton propre site HTML) + +--- + +## 🚀 Partie 1 : Configurer HTTPS avec Let's Encrypt + +### đŸ€” C'est quoi HTTPS ? +- HTTP = ton site est accessible mais **pas sĂ©curisĂ©** (pas de cadenas 🔓) +- HTTPS = ton site est **sĂ©curisĂ©** avec un certificat SSL (cadenas vert 🔒) +- Les donnĂ©es sont **chiffrĂ©es** entre le navigateur et le serveur + +### 📝 Ce que tu dois faire : + +#### Étape 1.1 : Installer Certbot +Certbot = outil gratuit pour obtenir un certificat SSL + +**Ajoute cette tĂąche dans `playbook.yml`** (aprĂšs l'installation de Nginx) : +```yaml +- name: Installer Certbot pour Let's Encrypt + apt: + name: + - certbot + - python3-certbot-nginx + state: present +``` + +**💡 Explication** : +- `certbot` = l'outil principal +- `python3-certbot-nginx` = plugin pour configurer automatiquement Nginx + +#### Étape 1.2 : GĂ©nĂ©rer le certificat SSL +**Ajoute cette tĂąche** : +```yaml +- name: Obtenir un certificat SSL avec Certbot + command: certbot --nginx -d defder.fr --non-interactive --agree-tos --email ton-email@exemple.com + args: + creates: /etc/letsencrypt/live/defder.fr/fullchain.pem +``` + +**💡 Explication** : +- `--nginx` = configure automatiquement Nginx +- `-d defder.fr` = ton nom de domaine +- `--non-interactive` = pas de questions (automatique) +- `--agree-tos` = accepte les conditions +- `--email` = **REMPLACE par ton vrai email !** +- `creates: ...` = ne refait pas si le certificat existe dĂ©jĂ  + +#### Étape 1.3 : Renouvellement automatique +Les certificats expirent tous les 90 jours. Il faut les renouveler automatiquement. + +**Ajoute cette tĂąche** : +```yaml +- name: Configurer le renouvellement automatique du certificat + cron: + name: "Renouveler certificat SSL" + minute: "0" + hour: "3" + job: "certbot renew --quiet" +``` + +**💡 Explication** : +- VĂ©rifie chaque jour Ă  3h du matin si le certificat doit ĂȘtre renouvelĂ© +- `--quiet` = ne fait pas de bruit dans les logs + +#### ✅ VĂ©rification Partie 1 +Lance ton playbook : `./run.sh` + +Ensuite, teste dans ton navigateur : `https://defder.fr` +- Tu dois voir le **cadenas vert 🔒** +- Le site est maintenant sĂ©curisĂ© ! + +--- + +## 🔐 Partie 2 : Ajouter une authentification + +### đŸ€” C'est quoi l'authentification ? +Une popup qui demande **login + password** avant d'accĂ©der au site. +Utile pour protĂ©ger un site privĂ©, un backoffice, etc. + +### 📝 Ce que tu dois faire : + +#### Étape 2.1 : Installer les outils nĂ©cessaires +**Ajoute cette tĂąche** : +```yaml +- name: Installer apache2-utils pour htpasswd + apt: + name: apache2-utils + state: present +``` + +**💡 Explication** : +- `htpasswd` = outil pour crĂ©er des fichiers de mots de passe + +#### Étape 2.2 : CrĂ©er un utilisateur avec mot de passe +**Ajoute cette tĂąche** : +```yaml +- name: CrĂ©er un fichier de mots de passe + htpasswd: + path: /etc/nginx/.htpasswd + name: admin + password: "MonMotDePasse123" + owner: root + group: www-data + mode: '0640' +``` + +**💡 Explication** : +- CrĂ©e un fichier `/etc/nginx/.htpasswd` +- Utilisateur : `admin` +- Mot de passe : `MonMotDePasse123` (**CHANGE-LE !**) +- `mode: '0640'` = permissions sĂ©curisĂ©es + +#### Étape 2.3 : CrĂ©er un fichier de configuration Nginx +Tu vas crĂ©er un fichier de config personnalisĂ© pour Nginx. + +**D'abord, crĂ©e un dossier `templates/` dans ton projet** : +``` +iaac/ +├── templates/ +│ └── nginx-auth.conf.j2 +├── playbook.yml +├── inventory.yml +... +``` + +**CrĂ©e le fichier `templates/nginx-auth.conf.j2`** avec ce contenu : +```nginx +server { + listen 80; + server_name defder.fr; + + # Redirection HTTP vers HTTPS + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl; + server_name defder.fr; + + # Certificats SSL (gĂ©nĂ©rĂ©s par Certbot) + ssl_certificate /etc/letsencrypt/live/defder.fr/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/defder.fr/privkey.pem; + + # Dossier racine du site + root /var/www/html; + index index.html; + + # AUTHENTIFICATION + auth_basic "Zone protĂ©gĂ©e - Connexion requise"; + auth_basic_user_file /etc/nginx/.htpasswd; + + location / { + try_files $uri $uri/ =404; + } +} +``` + +**💡 Explication** : +- Redirige automatiquement HTTP → HTTPS +- Active l'authentification avec `auth_basic` +- Pointe vers le fichier de mots de passe + +#### Étape 2.4 : DĂ©ployer la configuration +**Ajoute cette tĂąche dans `playbook.yml`** : +```yaml +- name: DĂ©ployer la configuration Nginx avec authentification + template: + src: templates/nginx-auth.conf.j2 + dest: /etc/nginx/sites-available/defder + notify: Recharger Nginx + +- name: Activer le site + file: + src: /etc/nginx/sites-available/defder + dest: /etc/nginx/sites-enabled/defder + state: link + +- name: DĂ©sactiver le site par dĂ©faut + file: + path: /etc/nginx/sites-enabled/default + state: absent + notify: Recharger Nginx +``` + +#### Étape 2.5 : Ajouter un handler pour recharger Nginx +**À la fin de `playbook.yml`**, ajoute : +```yaml + handlers: + - name: Recharger Nginx + systemd: + name: nginx + state: reloaded +``` + +**💡 Explication** : +- Un handler = une action qui se dĂ©clenche quand un fichier change +- Recharge Nginx quand la config est modifiĂ©e + +#### ✅ VĂ©rification Partie 2 +Lance ton playbook : `./run.sh` + +Visite `https://defder.fr` → Une popup apparaĂźt ! +- Login : `admin` +- Password : `MonMotDePasse123` (ou celui que tu as choisi) + +--- + +## 🎹 Partie 3 : DĂ©ployer des pages web personnalisĂ©es + +### đŸ€” C'est quoi dĂ©ployer des pages ? +Remplacer la page par dĂ©faut de Nginx par **ton propre site HTML**. + +### 📝 Ce que tu dois faire : + +#### Étape 3.1 : CrĂ©er un dossier pour ton site +**Dans ton projet, crĂ©e un dossier `files/`** : +``` +iaac/ +├── files/ +│ ├── index.html +│ └── style.css +├── templates/ +├── playbook.yml +... +``` + +#### Étape 3.2 : CrĂ©er une page HTML +**CrĂ©e `files/index.html`** : +```html + + + + + + Mon site dĂ©ployĂ© avec Ansible + + + +
+

🚀 Bienvenue sur mon serveur !

+

Ce site a été déployé automatiquement avec Ansible.

+ + +
+ + +``` + +#### Étape 3.3 : CrĂ©er un fichier CSS +**CrĂ©e `files/style.css`** : +```css +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} + +.container { + background: white; + padding: 3rem; + border-radius: 15px; + box-shadow: 0 10px 40px rgba(0,0,0,0.3); + max-width: 600px; + text-align: center; +} + +h1 { + color: #667eea; + margin-bottom: 1rem; + font-size: 2.5rem; +} + +p { + color: #333; + margin-bottom: 1rem; + font-size: 1.1rem; +} + +ul { + list-style: none; + margin: 2rem 0; +} + +ul li { + background: #f0f0f0; + padding: 0.8rem; + margin: 0.5rem 0; + border-radius: 8px; + font-size: 1rem; +} + +.footer { + margin-top: 2rem; + font-style: italic; + color: #667eea; +} +``` + +#### Étape 3.4 : DĂ©ployer les fichiers sur le serveur +**Ajoute ces tĂąches dans `playbook.yml`** (avant le handler) : +```yaml +- name: CrĂ©er le dossier du site web + file: + path: /var/www/html + state: directory + owner: www-data + group: www-data + mode: '0755' + +- name: DĂ©ployer la page HTML + template: + src: files/index.html + dest: /var/www/html/index.html + owner: www-data + group: www-data + mode: '0644' + +- name: DĂ©ployer le fichier CSS + copy: + src: files/style.css + dest: /var/www/html/style.css + owner: www-data + group: www-data + mode: '0644' +``` + +**💡 Explication** : +- `template:` pour index.html = permet d'utiliser des variables Ansible (comme la date) +- `copy:` pour style.css = copie simple du fichier +- `owner: www-data` = donne les bons droits Ă  Nginx + +#### ✅ VĂ©rification Partie 3 +Lance ton playbook : `./run.sh` + +Visite `https://defder.fr` : +- Entre login/password +- Tu vois **ton site personnalisĂ©** ! 🎉 + +--- + +## 🎓 RĂ©sumĂ© de ce que tu as appris + +| FonctionnalitĂ© | Module Ansible | UtilitĂ© | +|---------------|----------------|---------| +| **HTTPS** | `command` (certbot) | SĂ©curiser le site | +| **Authentification** | `htpasswd` | ProtĂ©ger l'accĂšs | +| **Configuration Nginx** | `template` | Personnaliser le serveur | +| **DĂ©ploiement de fichiers** | `copy` / `template` | Mettre en ligne ton site | +| **Handlers** | `handlers` | Recharger Nginx automatiquement | + +--- + +## 🚀 Pour aller plus loin (Bonus) + +### IdĂ©es d'amĂ©liorations : +1. **Plusieurs utilisateurs** : Ajoute plusieurs logins dans htpasswd +2. **Variables** : Mets le nom de domaine, email, etc. dans un fichier `vars.yml` +3. **RĂŽles Ansible** : Organise ton code en rĂŽles (nginx, ssl, web) +4. **CI/CD** : Automatise le dĂ©ploiement avec GitHub Actions +5. **Monitoring** : Ajoute un outil pour surveiller le serveur + +--- + +## 📚 Ressources utiles + +- **Documentation Ansible** : https://docs.ansible.com +- **Certbot** : https://certbot.eff.org +- **Nginx** : https://nginx.org/en/docs/ + +--- + +## ✅ Checklist finale + +- [ ] HTTPS fonctionne (cadenas vert) +- [ ] Authentification demande login/password +- [ ] Page personnalisĂ©e affichĂ©e +- [ ] Certificat SSL se renouvelle automatiquement +- [ ] Code versionnĂ© sur Git +- [ ] Playbook s'exĂ©cute sans erreur + +**Bravo ! Tu as créé une infrastructure complĂšte et sĂ©curisĂ©e avec Ansible ! 🎉** diff --git a/files/index.html b/files/index.html new file mode 100644 index 0000000..2e070cc --- /dev/null +++ b/files/index.html @@ -0,0 +1,22 @@ + + + + + + Mon site dĂ©ployĂ© avec Ansible + + + +
+

🚀 Bienvenue sur mon serveur !

+

Ce site a été déployé automatiquement avec Ansible.

+ + +
+ + diff --git a/files/style.css b/files/style.css new file mode 100644 index 0000000..2cfdcd6 --- /dev/null +++ b/files/style.css @@ -0,0 +1,54 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} + +.container { + background: white; + padding: 3rem; + border-radius: 15px; + box-shadow: 0 10px 40px rgba(0,0,0,0.3); + max-width: 600px; + text-align: center; +} + +h1 { + color: #667eea; + margin-bottom: 1rem; + font-size: 2.5rem; +} + +p { + color: #333; + margin-bottom: 1rem; + font-size: 1.1rem; +} + +ul { + list-style: none; + margin: 2rem 0; +} + +ul li { + background: #f0f0f0; + padding: 0.8rem; + margin: 0.5rem 0; + border-radius: 8px; + font-size: 1rem; +} + +.footer { + margin-top: 2rem; + font-style: italic; + color: #667eea; +} diff --git a/playbook.yml b/playbook.yml index 5c3d64e..ed9b785 100644 --- a/playbook.yml +++ b/playbook.yml @@ -14,6 +14,46 @@ name: nginx state: present + - name: Installer apache2-utils pour htpasswd + apt: + name: apache2-utils + state: present + + - name: Installer la librairie Python passlib + apt: + name: python3-passlib + state: present + + - name: Créer un fichier de mots de passe + htpasswd: + path: /etc/nginx/.htpasswd + name: admin + password: "mdp123" + owner: root + group: www-data + mode: '0640' + + - name: Installer Certbot pour Let's Encrypt + apt: + name: + - certbot + - python3-certbot-nginx + state: present + + - name: Obtenir un certificat SSL avec Certbot + command: certbot --nginx -d defder.fr --non-interactive --agree-tos --email bottero.romain1811@gmail.com --redirect + notify: Restart Nginx + args: + creates: /etc/letsencrypt/live/defder.fr/fullchain.pem + + - name: Configurer le renouvellement automatique du certificat + cron: + name: "Renouveler le certificat SSL" + minute: "0" + hour: "3" + job: "certbot renew --quiet" + + - name: S'assurer qu'UFW est installé apt: name: ufw @@ -47,6 +87,25 @@ state: started enabled: yes + - name: Déployer la configuration Nginx avec authentification + template: + src: templates/nginx-auth.conf.j2 + dest: /etc/nginx/sites-available/defder + notify: Recharger Nginx + + - name: Activer le site + file: + src: /etc/nginx/sites-available/defder + dest: /etc/nginx/sites-enabled/defder + state: link + notify: Recharger Nginx + + - name: Désactiver le site par défaut + file: + path: /etc/nginx/sites-enabled/default + state: absent + notify: Recharger Nginx + - name: Vérifier que Nginx est en cours d'exécution service: name: nginx @@ -57,11 +116,47 @@ debug: msg: "Nginx est installé et en cours d'exécution" + - name: Récupérer l'IP du serveur command: hostname -I register: server_ip changed_when: false + - name: Créer le dossier du site web + file: + path: /var/www/html + state: directory + owner: www-data + group: www-data + mode: '0755' + + - name: Déployer la page HTML + template: + src: files/index.html + dest: /var/www/html/index.html + owner: www-data + group: www-data + mode: '0644' + + - name: Déployer le fichier CSS + copy: + src: files/style.css + dest: /var/www/html/style.css + owner: www-data + group: www-data + mode: '0644' + - name: Afficher l'URL d'accÚs debug: - msg: "Nginx est accessible à l'adresse : http://{{ server_ip.stdout.split()[0] }}" + msg: "Nginx est accessible à l'adresse : https://defder.fr (ou http://{{ server_ip.stdout.split()[0] }} qui redirige vers HTTPS)" + + handlers: + - name: Restart Nginx + service: + name: nginx + state: restarted + + - name: Recharger Nginx + systemd: + name: nginx + state: reloaded \ No newline at end of file diff --git a/templates/nginx-auth.conf.j2 b/templates/nginx-auth.conf.j2 new file mode 100644 index 0000000..a56875f --- /dev/null +++ b/templates/nginx-auth.conf.j2 @@ -0,0 +1,28 @@ +server { + listen 80; + server_name defder.fr; + + # Redirection HTTP vers HTTPS + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl; + server_name defder.fr; + + # Certificats SSL (générés par Certbot) + ssl_certificate /etc/letsencrypt/live/defder.fr/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/defder.fr/privkey.pem; + + # Dossier racine du site + root /var/www/html; + index index.html; + + # AUTHENTIFICATION + auth_basic "Zone protégée - Connexion requise"; + auth_basic_user_file /etc/nginx/.htpasswd; + + location / { + try_files $uri $uri/ =404; + } +} \ No newline at end of file