Ajout documentation projets OpenClassrooms (P02-P13) avec support bilingue

- Add all project documentation pages in French and English
- Include PDF viewers for presentations and documents (P10, P12)
- Add collapsible sections for scripts and logs (P10)
- Add static assets for all projects
- Update sidebars with new projets-openclassrooms category
- Add npm start:en script for testing English locale
This commit is contained in:
Tellsanguis 2025-11-22 16:18:20 +01:00
parent 40a8985942
commit ed989ff004
86 changed files with 24243 additions and 1 deletions

View file

@ -0,0 +1,24 @@
# Projets OpenClassrooms
Cette section regroupe les **12 projets techniques** réalisés dans le cadre de ma formation **Administrateur Systèmes, Réseaux et Sécurité** chez OpenClassrooms (novembre 2024 - novembre 2025).
Chaque projet correspond à une mise en situation professionnelle avec des livrables concrets : documentation technique, configurations, scripts, présentations.
---
## Vue d'ensemble
| Projet | Thématique | Technologies clés |
|--------|------------|-------------------|
| P2 | Gestion ITSM | GLPI, ITIL |
| P3 | Architecture réseau | VLAN, Firewall, Draw.io |
| P4 | Architecture n-tiers | Docker, LAMP, DNS |
| P5 | Sécurisation web | Apache, Fail2ban, SSL, vsftpd |
| P6 | Site distant | VPN IPsec, AD DS, RODC, GPO |
| P7 | Réseau Cisco | VLAN, ACL, NAT, IPv6, Packet Tracer |
| P8 | Supervision | Nagios, Rsyslog |
| P9 | Gestion de parc | Ansible, GLPI, AGDLP |
| P10 | Sauvegardes | Bash, Rsync, Cron |
| P11 | Conformité ANSSI | Cartographie SI, Architecture |
| P12 | Audit sécurité AD | Pentesting, Mimikatz, Kerberoasting |
| P13 | Migration Cloud | AWS, DAT, Gantt |

View file

@ -0,0 +1,81 @@
---
sidebar_position: 2
---
# Gestion des demandes au quotidien
## Contexte
Mise en place d'un système de gestion des demandes et incidents informatiques selon les bonnes pratiques ITIL, avec l'outil GLPI.
## Objectifs
- Configurer et utiliser GLPI pour la gestion des tickets
- Appliquer la méthodologie ITIL pour le traitement des incidents et demandes
- Mettre en place un inventaire automatisé du parc informatique
- Créer des procédures et logigrammes de traitement
## Technologies utilisées
- **GLPI** : gestion de parc et ticketing
- **Agent GLPI** : inventaire automatisé
- **ITIL** : méthodologie de gestion des services IT
## Livrables
<details>
<summary>Export base GLPI (SQL)</summary>
Le fichier SQL est volumineux (export complet de la base GLPI). Voici un extrait de sa structure :
```sql
-- MariaDB dump 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: glpi
-- ------------------------------------------------------
-- Server version 10.11.6-MariaDB-0+deb12u1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
-- Table structure for table `glpi_agents`
CREATE TABLE `glpi_agents` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`deviceid` varchar(255) NOT NULL,
`entities_id` int(10) unsigned NOT NULL DEFAULT 0,
`name` varchar(255) DEFAULT NULL,
`agenttypes_id` int(10) unsigned NOT NULL,
`last_contact` timestamp NULL DEFAULT NULL,
`version` varchar(255) DEFAULT NULL,
-- ... autres colonnes
PRIMARY KEY (`id`),
UNIQUE KEY `deviceid` (`deviceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
[Télécharger le fichier SQL complet](/assets/projets-oc/p02/bene_mael_1_export_122024.sql)
</details>
<details>
<summary>Présentation de l'agent GLPI (PDF)</summary>
<iframe src="/assets/projets-oc/p02/bene_mael_3_agent_GLPI_122024.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Logigrammes - Processus de traitement des demandes (PDF)</summary>
<iframe src="/assets/projets-oc/p02/bene_mael_4_logigramme_122024.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Configuration d'un outil ITSM
- Application des processus ITIL (gestion des incidents, des demandes, des problèmes)
- Rédaction de procédures techniques
- Mise en place d'un inventaire automatisé

View file

@ -0,0 +1,65 @@
---
sidebar_position: 3
---
# Conception réseau d'entreprise
## Contexte
Conception de l'architecture réseau complète pour une startup (Hill Start), incluant les plans physique et logique, l'adressage IP et les règles de sécurité.
## Objectifs
- Concevoir une architecture réseau multi-VLAN adaptée aux besoins métier
- Élaborer les plans d'adressage IP
- Définir les règles de filtrage firewall
- Produire une documentation technique complète (DAT)
## Technologies utilisées
- **VLAN** : segmentation réseau
- **Firewall** : règles de filtrage inter-VLAN
- **Draw.io** : schémas d'architecture
- **Subnetting** : plans d'adressage IPv4
## Livrables
<details>
<summary>Schéma physique</summary>
![Schéma physique de l'architecture réseau](/assets/projets-oc/p03/schemaphysique.jpg)
</details>
<details>
<summary>Schéma logique</summary>
![Schéma logique de l'architecture réseau](/assets/projets-oc/p03/schemalogique.jpg)
</details>
<details>
<summary>Plan d'adressage réseau (Excel)</summary>
Le fichier Excel contient le plan d'adressage IP complet.
[Télécharger le plan d'adressage](/assets/projets-oc/p03/plan_adressagereseau.xlsx)
</details>
<details>
<summary>Règles firewall (Excel)</summary>
Le fichier Excel contient les règles de filtrage firewall inter-VLAN.
[Télécharger les règles firewall](/assets/projets-oc/p03/regles_firewall.xlsx)
</details>
## Compétences acquises
- Analyse des besoins réseau d'une organisation
- Conception d'architectures LAN segmentées
- Calcul de sous-réseaux et plans d'adressage
- Rédaction de documentation technique normalisée
- Définition de politiques de sécurité réseau

View file

@ -0,0 +1,148 @@
---
sidebar_position: 4
---
# Architecture n-tiers Docker
## Contexte
Déploiement d'une architecture n-tiers conteneurisée pour l'entreprise BeeSafe, comprenant un serveur web, une base de données et un serveur DNS.
## Objectifs
- Conteneuriser une application web LAMP
- Configurer un serveur DNS avec Bind9
- Mettre en place un reverse proxy
- Documenter l'architecture technique
## Technologies utilisées
- **Docker / Docker Compose** : conteneurisation
- **Apache/PHP** : serveur web
- **MySQL** : base de données
- **Bind9** : serveur DNS
## Architecture déployée
```
+-------------+
| Client |
+------+------+
|
+------v------+
| DNS Bind9 |
+------+------+
|
+------v------+
| Apache |
| + PHP |
+------+------+
|
+------v------+
| MySQL |
+-------------+
```
## Livrables
<details>
<summary>Schéma d'architecture (PDF)</summary>
<iframe src="/assets/projets-oc/p04/schema_archi_ntiers.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Docker Compose</summary>
```yaml
services:
web:
build:
context: .
dockerfile: Dockerfile
container_name: apache_php
ports:
- "80:80"
volumes:
- ./web:/var/www/html
- ./apache/beesafe.conf:/etc/apache2/sites-available/beesafe.conf
depends_on:
- db
- dns
networks:
- backend
restart: unless-stopped
db:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootclassroom
MYSQL_DATABASE: beesafe_db
volumes:
- db_data:/var/lib/mysql
- ./sql:/docker-entrypoint-initdb.d
networks:
- backend
restart: unless-stopped
dns:
image: internetsystemsconsortium/bind9:9.18
container_name: bind9
ports:
- "53:53/tcp"
- "53:53/udp"
volumes:
- ./bind9/etc:/etc/bind
- ./bind9/cache:/var/cache/bind
- ./bind9/lib:/var/lib/bind
- ./bind9/log:/var/log
command: ["-g"]
networks:
- backend
restart: unless-stopped
networks:
backend:
driver: bridge
volumes:
db_data:
```
</details>
<details>
<summary>Dockerfile</summary>
```dockerfile
FROM php:8.0-apache
# Mise à jour et installation des dépendances
RUN apt-get update && apt-get install -y \
libzip-dev \
unzip \
&& docker-php-ext-install mysqli \
&& docker-php-ext-enable mysqli
# Activer le site beesafe.conf et désactiver le site par défaut 000-default.conf
RUN a2ensite beesafe.conf && \
a2dissite 000-default.conf && \
service apache2 reload
# Nettoyage des fichiers inutiles pour réduire la taille de l'image
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Commande pour garder Apache en fonctionnement
CMD ["apache2-foreground"]
```
</details>
## Compétences acquises
- Conteneurisation d'applications multi-tiers
- Configuration de serveurs DNS
- Orchestration avec Docker Compose
- Architecture applicative découplée

View file

@ -0,0 +1,193 @@
---
sidebar_position: 5
---
# Sécurisation de services web
## Contexte
Sécurisation de l'infrastructure web de Rainbow Bank : mise en place de HTTPS, protection contre les attaques, et configuration d'un serveur FTP chiffré.
## Objectifs
- Configurer Apache avec SSL/TLS (HTTPS)
- Mettre en place des protections contre les attaques (Fail2ban, mod_evasive)
- Déployer un serveur FTP sécurisé (vsftpd)
- Documenter les configurations de sécurité
## Technologies utilisées
- **Apache** : serveur web avec mod_ssl, mod_evasive
- **Let's Encrypt / Certificats SSL** : chiffrement HTTPS
- **Fail2ban** : protection contre le brute-force
- **vsftpd** : serveur FTP sécurisé (FTPS)
- **Netplan** : configuration réseau multi-NIC
## Configurations clés
### VirtualHost HTTPS avec HSTS
```apache
<VirtualHost *:443>
ServerName extranet.rainbowbank.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/extranet.crt
SSLCertificateKeyFile /etc/ssl/private/extranet.key
Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>
```
### Protection Fail2ban
```ini
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
maxretry = 3
bantime = 3600
```
## Livrables
<details>
<summary>Configuration services web (ZIP)</summary>
Archive contenant l'ensemble des fichiers de configuration web.
[Télécharger l'archive de configuration](/assets/projets-oc/p05/bene_mael_1_config_service_web_022025.zip)
</details>
<details>
<summary>Configuration vsftpd</summary>
```ini
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/rainbowbank.com.crt
rsa_private_key_file=/etc/ssl/private/rainbowbank.com.key
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
log_ftp_protocol=YES
xferlog_enable=YES
xferlog_std_format=NO
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
```
</details>
<details>
<summary>Configuration Fail2ban (jail.local)</summary>
```ini
[DEFAULT]
backend = auto
banaction = iptables-multiport
protocol = tcp
chain = INPUT
action = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
[apache-custom]
enabled = true
port = http,https,5501,5502
filter = apache-custom
logpath = /var/log/apache2/*_access.log
maxretry = 3
findtime = 300
bantime = 300
[nginx-custom]
enabled = true
port = http,https,5501,5502
filter = nginx-custom
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 300
bantime = 300
[vsftpd-custom]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd-custom
logpath = /var/log/vsftpd.log
maxretry = 3
findtime = 300
bantime = 300
```
</details>
<details>
<summary>Règles iptables</summary>
```bash
# Generated by iptables-save v1.8.10 (nf_tables) on Tue Feb 18 18:27:58 2025
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [2:240]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ens33 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ens34 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i ens34 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i ens35 -p tcp -m tcp --dport 5501 -j ACCEPT
-A INPUT -i ens35 -p tcp -m tcp --dport 5502 -j ACCEPT
-A INPUT -i ens35 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i ens35 -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -i ens35 -p tcp -m tcp --dport 10000:10100 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -j LOG --log-prefix "IPTables-Dropped: "
-A FORWARD -i ens34 -o ens33 -j ACCEPT
-A FORWARD -i ens35 -o ens33 -j ACCEPT
-A FORWARD -i ens33 -o ens34 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ens33 -o ens35 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o ens33 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT
# Completed on Tue Feb 18 18:27:58 2025
# Generated by iptables-save v1.8.10 (nf_tables) on Tue Feb 18 18:27:58 2025
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens33 -j MASQUERADE
COMMIT
# Completed on Tue Feb 18 18:27:58 2025
```
</details>
## Compétences acquises
- Déploiement de certificats SSL/TLS
- Durcissement de serveurs web Apache
- Configuration de systèmes de protection (IPS)
- Mise en place de services FTP sécurisés
- Gestion réseau multi-interfaces

View file

@ -0,0 +1,310 @@
---
sidebar_position: 6
---
# Raccordement d'un site distant
## Contexte
Intégration d'un site distant au système d'information existant via VPN site-à-site, avec déploiement d'un contrôleur de domaine en lecture seule (RODC) et application de stratégies de groupe.
## Objectifs
- Configurer un VPN IPsec site-à-site avec pfSense
- Déployer un RODC (Read-Only Domain Controller)
- Étendre l'Active Directory au site distant
- Appliquer des GPO adaptées au contexte distant
- Mettre en place des sauvegardes automatisées
## Technologies utilisées
- **pfSense** : firewall et VPN IPsec
- **Windows Server** : AD DS, RODC
- **Active Directory** : gestion centralisée des identités
- **GPO** : stratégies de groupe
- **PowerShell** : scripts de sauvegarde (Robocopy)
- **VMware** : virtualisation
## Architecture
```
Site Principal Site Distant
+-------------+ +-------------+
| DC | | RODC |
| (AD DS) | | (Lecture |
+------+------+ | seule) |
| +------+------+
+------v------+ VPN IPsec +------v------+
| pfSense |<--------------->| pfSense |
+-------------+ +-------------+
```
## Livrables
<details>
<summary>Script GPO horaires de travail (PowerShell)</summary>
```powershell
<#
.DESCRIPTION
Script pour définir les heures de connexion de 6h à 20h tous les jours de la semaine
.NOTES
Date de création : 17/03/2025
.AUTEUR
BENE Maël
.VERSION
1.0
#>
# Récupération récursive des utilisateurs (inclut les membres des sous-groupes)
$users = Get-ADGroupMember -Identity OpenBank -Recursive | Select-Object -ExpandProperty SamAccountName
# Création du tableau de 21 octets (168 heures dans une semaine)
$LogonHours = New-Object byte[] 21
# Dimanche = index 0, Lundi = index 1, ..., Samedi = index 6
# Définition des heures de connexion (6h à 20h) pour tous les jours de la semaine
for ($day = 0; $day -le 6; $day++) { # Dimanche (0) à Samedi (6)
for ($hour = 5; $hour -lt 19; $hour++) { # De 6h à 20h
$byteIndex = [math]::Floor(($day * 24 + $hour) / 8)
$bitIndex = ($day * 24 + $hour) % 8
$LogonHours[$byteIndex] = $LogonHours[$byteIndex] -bor (1 -shl $bitIndex)
}
}
# Appliquer la restriction à l'utilisateur
foreach ($user in $users)
{
Set-ADUser -Identity $user -Replace @{logonHours=$LogonHours}
}
```
</details>
<details>
<summary>Capture GPO horaires de travail</summary>
![GPO horaires de travail](/assets/projets-oc/p06/BENE_Mael_gpo_horairesdetravail.png)
</details>
<details>
<summary>Script GPO installation Flux (Batch)</summary>
```batch
@echo off
REM Vérification de l'utilisateur
if "%username%"=="agarcia" (
echo Installation de flux-setup.exe pour %username%
winget install -e --id flux.flux --silent --accept-package-agreements --accept-source-agreements
) else (
echo Installation non applicable pour cet utilisateur.
exit /b
)
```
</details>
<details>
<summary>Capture GPO installation Flux</summary>
![GPO installation Flux](/assets/projets-oc/p06/BENE_Mael_gpo_installflux.png)
</details>
<details>
<summary>Capture GPO restriction disque amovible</summary>
![GPO restriction disque amovible](/assets/projets-oc/p06/BENE_Mael_gpo_restrictiondisqueamovible.png)
</details>
<details>
<summary>Configuration VPN pfSense Nantes (XML)</summary>
```xml
<ipsec>
<client></client>
<phase1>
<ikeid>1</ikeid>
<iketype>ikev2</iketype>
<interface>opt1</interface>
<remote-gateway>194.0.0.1</remote-gateway>
<protocol>inet</protocol>
<myid_type>address</myid_type>
<myid_data>194.0.0.2</myid_data>
<peerid_type>address</peerid_type>
<peerid_data>194.0.0.1</peerid_data>
<encryption>
<item>
<encryption-algorithm>
<name>aes</name>
<keylen>256</keylen>
</encryption-algorithm>
<hash-algorithm>sha256</hash-algorithm>
<prf-algorithm>sha256</prf-algorithm>
<dhgroup>14</dhgroup>
</item>
</encryption>
<lifetime>28800</lifetime>
<pre-shared-key>bc4b31bbe6ac6eba857a44b8941ed31389cdb6c678635384b676ae34</pre-shared-key>
<authentication_method>pre_shared_key</authentication_method>
<descr><![CDATA[Tunnel vers Paris]]></descr>
<nat_traversal>on</nat_traversal>
<mobike>off</mobike>
<dpd_delay>10</dpd_delay>
<dpd_maxfail>5</dpd_maxfail>
</phase1>
<phase2>
<ikeid>1</ikeid>
<uniqid>67cf001195fba</uniqid>
<mode>tunnel</mode>
<reqid>1</reqid>
<localid>
<type>network</type>
<address>10.0.2.0</address>
<netbits>24</netbits>
</localid>
<remoteid>
<type>network</type>
<address>10.0.1.0</address>
<netbits>24</netbits>
</remoteid>
<protocol>esp</protocol>
<encryption-algorithm-option>
<name>aes</name>
<keylen>256</keylen>
</encryption-algorithm-option>
<hash-algorithm-option>hmac_sha256</hash-algorithm-option>
<pfsgroup>14</pfsgroup>
<lifetime>3600</lifetime>
<pinghost>10.0.1.1</pinghost>
<keepalive>disabled</keepalive>
<descr><![CDATA[Trafic LAN Paris-Nantes]]></descr>
</phase2>
</ipsec>
```
</details>
<details>
<summary>Configuration VPN pfSense Paris (XML)</summary>
```xml
<ipsec>
<client></client>
<phase1>
<ikeid>1</ikeid>
<iketype>ikev2</iketype>
<interface>opt1</interface>
<remote-gateway>194.0.0.2</remote-gateway>
<protocol>inet</protocol>
<myid_type>address</myid_type>
<myid_data>194.0.0.1</myid_data>
<peerid_type>address</peerid_type>
<peerid_data>194.0.0.2</peerid_data>
<encryption>
<item>
<encryption-algorithm>
<name>aes</name>
<keylen>256</keylen>
</encryption-algorithm>
<hash-algorithm>sha256</hash-algorithm>
<prf-algorithm>sha256</prf-algorithm>
<dhgroup>14</dhgroup>
</item>
</encryption>
<lifetime>28800</lifetime>
<pre-shared-key>bc4b31bbe6ac6eba857a44b8941ed31389cdb6c678635384b676ae34</pre-shared-key>
<authentication_method>pre_shared_key</authentication_method>
<descr><![CDATA[Tunnel vers Nantes]]></descr>
<nat_traversal>on</nat_traversal>
<mobike>off</mobike>
<dpd_delay>10</dpd_delay>
<dpd_maxfail>5</dpd_maxfail>
</phase1>
<phase2>
<ikeid>1</ikeid>
<uniqid>67ceff22aa6e4</uniqid>
<mode>tunnel</mode>
<reqid>1</reqid>
<localid>
<type>network</type>
<address>10.0.1.0</address>
<netbits>24</netbits>
</localid>
<remoteid>
<type>network</type>
<address>10.0.2.0</address>
<netbits>24</netbits>
</remoteid>
<protocol>esp</protocol>
<encryption-algorithm-option>
<name>aes</name>
<keylen>256</keylen>
</encryption-algorithm-option>
<hash-algorithm-option>hmac_sha256</hash-algorithm-option>
<pfsgroup>14</pfsgroup>
<lifetime>3600</lifetime>
<pinghost>10.0.2.1</pinghost>
<keepalive>disabled</keepalive>
<descr><![CDATA[Trafic LAN Paris-Nantes]]></descr>
</phase2>
</ipsec>
```
</details>
<details>
<summary>Script PowerShell de sauvegarde (Robocopy)</summary>
```powershell
<#
.DESCRIPTION
Script pour copier les données du disque D vers G:\Mon Drive\projet6
.NOTES
Date de création : 17/03/2025
.AUTEUR
BENE Maël
.VERSION
1.1
#>
# Chemins source et destination
$SourcePath = "D:\"
$DestinationPath = "G:\Mon Drive\projet6"
# Copie des fichiers avec Robocopy
Write-Host "Copie des données en cours de $SourcePath vers $DestinationPath..." -ForegroundColor Cyan
try {
Robocopy.exe "$SourcePath" "$DestinationPath" /E /COPY:DAT /R:2 /W:5 /MT:8 /XD "System Volume Information" "$RECYCLE.BIN" "Recovery" # Ajout d'exceptions pour les fichiers systèmes
# Affichage détaillé du résultat
switch ($LASTEXITCODE) {
0 { Write-Host "Aucun fichier copié - Tous les fichiers étaient déjà synchronisés." -ForegroundColor Green }
1 { Write-Host "Fichiers copiés avec succès." -ForegroundColor Green }
2 { Write-Host "Fichiers supplémentaires détectés." -ForegroundColor Yellow }
4 { Write-Host "Fichiers mal assortis détectés." -ForegroundColor Yellow }
8 { Write-Host "Erreurs de copie détectées." -ForegroundColor Red }
16 { Write-Host "Erreur grave dans la copie." -ForegroundColor Red }
default { Write-Host "Code de sortie Robocopy: $LASTEXITCODE" -ForegroundColor Magenta }
}
} catch {
Write-Host "Erreur lors de l'exécution de Robocopy: $_" -ForegroundColor Red
}
Write-Host "Opération terminée." -ForegroundColor Cyan
```
</details>
## Compétences acquises
- Configuration de tunnels VPN IPsec site-à-site
- Déploiement et gestion de RODC
- Extension d'infrastructure Active Directory
- Conception de GPO pour sites distants
- Automatisation de sauvegardes avec PowerShell

View file

@ -0,0 +1,70 @@
---
sidebar_position: 7
---
# Configuration d'équipements Cisco
## Contexte
Configuration complète d'une infrastructure réseau Cisco : VLANs, ACLs, agrégation de liens, NAT/PAT et adressage IPv6.
## Objectifs
- Configurer des VLANs et le routage inter-VLAN
- Mettre en place des ACLs pour le filtrage du trafic
- Configurer l'agrégation de liens (EtherChannel)
- Implémenter NAT/PAT pour l'accès Internet
- Déployer l'adressage IPv6 en dual-stack
## Technologies utilisées
- **Cisco IOS** : système d'exploitation des équipements
- **VLAN / Trunk** : segmentation réseau
- **ACL** : listes de contrôle d'accès
- **EtherChannel (LACP)** : agrégation de liens
- **NAT/PAT** : translation d'adresses
- **IPv6** : adressage nouvelle génération
- **Packet Tracer** : simulation réseau
## Configuration exemple - ACL
```cisco
ip access-list extended VLAN10_TO_SERVERS
permit tcp 10.0.10.0 0.0.0.255 host 10.0.20.10 eq 80
permit tcp 10.0.10.0 0.0.0.255 host 10.0.20.10 eq 443
permit icmp 10.0.10.0 0.0.0.255 10.0.20.0 0.0.0.255
deny ip any any log
```
## Livrables
<details>
<summary>Documentation configuration (PDF)</summary>
<iframe src="/assets/projets-oc/p07/bene_mael_1_config_equipements_052025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Maquette Packet Tracer</summary>
Fichier de simulation réseau Cisco Packet Tracer (.pkt).
[Télécharger la maquette Packet Tracer](/assets/projets-oc/p07/bene_mael_2_maquette_packet_tracer_052025.pkt)
</details>
<details>
<summary>Préconisations (PDF)</summary>
<iframe src="/assets/projets-oc/p07/bene_mael_3_preconisations_052025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Configuration avancée d'équipements Cisco
- Conception et implémentation de VLANs
- Rédaction et application d'ACLs
- Configuration de l'agrégation de liens
- Maîtrise du NAT/PAT et de l'IPv6

View file

@ -0,0 +1,73 @@
---
sidebar_position: 8
---
# Supervision avec Nagios
## Contexte
Mise en place d'une solution de supervision pour MediaSanté : déploiement de Nagios avec sondes personnalisées et centralisation des logs avec Rsyslog.
## Objectifs
- Installer et configurer Nagios Core
- Créer des sondes de supervision personnalisées
- Centraliser les logs avec Rsyslog
- Définir des indicateurs SLA et produire des rapports
## Technologies utilisées
- **Nagios Core** : supervision d'infrastructure
- **NRPE** : exécution de sondes distantes
- **Rsyslog** : centralisation des logs
- **SNMP** : supervision réseau
## Sondes configurées
| Service | Seuil Warning | Seuil Critical | Action opérateur |
|---------|---------------|----------------|------------------|
| CPU | > 80% | > 95% | Identifier processus consommateurs |
| RAM | > 85% | > 95% | Vérifier fuites mémoire |
| Disque | > 80% | > 90% | Nettoyage ou extension |
| HTTP | latence > 2s | indisponible | Redémarrage service |
| MySQL | connexions > 80% | > 95% | Analyse requêtes |
## Livrables
<details>
<summary>Configuration Nagios (capture)</summary>
![Configuration Nagios](/assets/projets-oc/p08/BENE_Mael_1_config_nagios_062025.png)
</details>
<details>
<summary>Configuration Rsyslog (archive)</summary>
Archive contenant les fichiers de configuration Rsyslog pour la centralisation des logs.
[Télécharger l'archive de configuration Rsyslog](/assets/projets-oc/p08/BENE_Mael_2_config_Rsyslog_062025.tar.gz)
</details>
<details>
<summary>Indicateurs SLA (PDF)</summary>
<iframe src="/assets/projets-oc/p08/BENE_Mael_3_indicateurs_062025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Documentation des sondes (PDF)</summary>
<iframe src="/assets/projets-oc/p08/BENE_Mael_4_documentation_062025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Déploiement d'une solution de supervision
- Création de sondes personnalisées
- Centralisation et analyse de logs
- Définition d'indicateurs de performance (KPI/SLA)
- Production de rapports de disponibilité

View file

@ -0,0 +1,235 @@
---
sidebar_position: 9
---
# Gestion de parc avec Ansible
## Contexte
Automatisation de la gestion du parc informatique de l'entreprise Barzini : déploiement multi-OS avec Ansible, intégration GLPI et mise en place d'une architecture AGDLP.
## Objectifs
- Automatiser les tâches d'administration avec Ansible
- Gérer un parc hétérogène (Windows/Linux)
- Intégrer l'inventaire avec GLPI
- Implémenter une architecture de permissions AGDLP
## Technologies utilisées
- **Ansible** : automatisation multi-OS
- **GLPI** : gestion de parc et inventaire
- **Active Directory** : gestion des identités (AGDLP)
- **PowerShell / Bash** : scripts complémentaires
## Exemples de playbooks
### Mise à jour multi-OS
```yaml
- name: Mise à jour Linux
hosts: linux
become: yes
tasks:
- name: Update apt cache and upgrade
apt:
update_cache: yes
upgrade: dist
- name: Mise à jour Windows
hosts: windows
tasks:
- name: Install Windows updates
win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
```
### Montage partage CIFS
```yaml
- name: Monter partage Windows
ansible.posix.mount:
path: /mnt/share
src: "//server/share"
fstype: cifs
opts: "credentials=/root/.smbcredentials,uid=1000"
state: mounted
```
## Livrables
<details>
<summary>Rapport Ansible (PDF)</summary>
<iframe src="/assets/projets-oc/p09/rapport_ansible.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Playbooks Ansible (ZIP)</summary>
Archive contenant l'ensemble des playbooks Ansible du projet.
[Télécharger les playbooks Ansible](/assets/projets-oc/p09/ansible.zip)
</details>
<details>
<summary>Script de montage partages Linux (Bash)</summary>
```bash
#!/bin/bash
# ============================================================================
# Script : mount_shares.sh
# Version : 1.0
# Date : 14/07/2025
# Auteur : BENE Maël
# Description: Montage automatique des partages CIFS personnels et de groupe
# ============================================================================
DOMAIN="BARZINI.INTERNAL"
SERVER="SRV-AD"
user="$(id -un)"
uid="$(id -u)"
gid="$(id -g)"
groups="$(id -Gn)"
# Liste fixe des partages de groupe disponibles
share_names=("Admins" "Audio" "Commercial" "Direction" "Developpeurs" "Graphisme" "Responsables" "Tests")
# Montage du partage personnel
home_share="//${SERVER}/${user}\$"
home_mount="${user_home}/Dossier_perso"
echo "Montage du dossier personnel : $home_share"
if [ ! -d "$home_mount" ]; then
mkdir -p "$home_mount"
chown "$uid:$gid" "$home_mount"
fi
if ! mountpoint -q "$home_mount"; then
sudo mount -t cifs -o "sec=krb5,cruid=${user},uid=${uid},gid=${gid},nofail" "$home_share" "$home_mount" && \
echo "Partage personnel monté sur $home_mount" || \
echo "Échec du montage du partage personnel"
else
echo "Déjà monté : $home_mount"
fi
# Montage des partages de groupe
for share in "${share_names[@]}"; do
for grp in $groups; do
clean_grp=$(echo "$grp" | tr '[:upper:]' '[:lower:]')
clean_share=$(echo "$share" | tr '[:upper:]' '[:lower:]')
if [[ "$clean_grp" == *"$clean_share"* ]]; then
share_path="//${SERVER}/${share}"
mount_point="${user_home}/${share}"
echo "Tentative de montage de $share_path"
if [ ! -d "$mount_point" ]; then
mkdir -p "$mount_point"
chown "$uid:$gid" "$mount_point"
fi
if ! mountpoint -q "$mount_point"; then
sudo mount -t cifs -o "sec=krb5,cruid=${user},uid=${uid},gid=${gid},nofail" "$share_path" "$mount_point" && \
echo "Partage monté : $mount_point" || \
echo "Échec du montage : $share_path"
else
echo "Déjà monté : $mount_point"
fi
break
fi
done
done
```
</details>
<details>
<summary>Script de montage partages Windows (PowerShell)</summary>
```powershell
# ============================================================================
# Script : MapDrives.ps1
# Version : 1.1
# Date : 29/07/2025
# Auteur : BENE Maël
# Description: Montage automatique des partages réseau personnels et de groupe
# ============================================================================
# Fonction pour supprimer les accents (normalisation)
function Remove-Accents($text) {
$normalized = [System.Text.NormalizationForm]::FormD
$string = [System.String]::new($text).Normalize($normalized)
$sb = New-Object System.Text.StringBuilder
foreach ($c in $string.ToCharArray()) {
if (-not [Globalization.CharUnicodeInfo]::GetUnicodeCategory($c).ToString().StartsWith("NonSpacingMark")) {
[void]$sb.Append($c)
}
}
return $sb.ToString().Normalize([System.Text.NormalizationForm]::FormC)
}
# Table de correspondance sans accents dans les clés
$groupShareMap = @{
"G_Admins" = "Admins"
"G_Audio" = "Audio"
"G_Commercial" = "Commercial"
"G_Direction" = "Direction"
"G_Developpeurs" = "Developpeurs"
"G_Graphisme" = "Graphisme"
"G_Responsables" = "Responsables"
"G_Testeurs" = "Tests"
}
# Récupération de l'utilisateur et des groupes AD
$user = $env:USERNAME
$userGroupsRaw = ([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups | ForEach-Object {
$_.Translate([System.Security.Principal.NTAccount]).Value.Split('\')[-1]
}
# Normalisation des noms de groupes
$userGroups = @()
foreach ($grp in $userGroupsRaw) {
$grpNorm = Remove-Accents $grp
$userGroups += $grpNorm
}
# Montage du partage personnel
$homeShare = "\\SRV-AD\$user`$"
Write-Host "Tentative de montage : $homeShare"
net use * $homeShare /persistent:no
if ($LASTEXITCODE -eq 0) {
Write-Host "Partage personnel monté avec succès."
} else {
Write-Host "Échec du montage du partage personnel."
}
# Montage des partages de groupe
foreach ($group in $userGroups) {
if ($groupShareMap.ContainsKey($group)) {
$shareName = $groupShareMap[$group]
$sharePath = "\\SRV-AD\$shareName"
Write-Host "Tentative de montage : $sharePath (via groupe $group)"
net use * $sharePath /persistent:no
if ($LASTEXITCODE -eq 0) {
Write-Host "Partage $shareName monté avec succès."
} else {
Write-Host "Échec du montage de $shareName."
}
}
}
```
</details>
## Compétences acquises
- Automatisation cross-platform avec Ansible
- Gestion centralisée de parc informatique
- Architecture de permissions AGDLP
- Intégration d'outils de gestion (GLPI)
- Utilisation d'Ansible Vault pour les secrets

View file

@ -0,0 +1,639 @@
---
sidebar_position: 10
---
# Solution de sauvegarde robuste
## Contexte
Conception et mise en place d'une solution de sauvegarde complète pour une mairie : scripts Bash avec rsync supportant les modes FULL, incrémental et différentiel.
## Objectifs
- Développer des scripts de sauvegarde paramétrables
- Implémenter les trois modes de sauvegarde (FULL/INC/DIFF)
- Mettre en place la rotation et rétention des sauvegardes
- Créer des scripts de restauration
- Automatiser via cron
## Technologies utilisées
- **Bash** : scripting
- **Rsync** : synchronisation de fichiers
- **SSH** : transfert sécurisé distant
- **Cron** : planification des tâches
## Comparatif des types de sauvegarde
### Sauvegarde FULL (complète)
Copie intégrale de toutes les données à chaque exécution.
| Avantages | Inconvénients |
|-----------|---------------|
| Restauration simple et rapide (1 seul jeu) | Consomme beaucoup d'espace disque |
| Indépendante des sauvegardes précédentes | Temps d'exécution long |
| Fiabilité maximale | Bande passante importante si distant |
### Sauvegarde incrémentale (INC)
Copie uniquement les fichiers modifiés depuis la **dernière sauvegarde** (FULL ou INC).
| Avantages | Inconvénients |
|-----------|---------------|
| Très rapide à exécuter | Restauration complexe (FULL + toutes les INC) |
| Espace disque minimal | Dépendance à la chaîne complète |
| Faible bande passante | Si une INC est corrompue, les suivantes sont inutilisables |
### Sauvegarde différentielle (DIFF)
Copie uniquement les fichiers modifiés depuis le **dernier FULL**.
| Avantages | Inconvénients |
|-----------|---------------|
| Restauration simple (FULL + dernière DIFF) | Taille croissante au fil du temps |
| Plus rapide qu'un FULL | Plus lent qu'une INC |
| Moins de dépendances qu'une INC | Nécessite plus d'espace qu'une INC |
### Tableau comparatif
| Critère | FULL | INC | DIFF |
|---------|------|-----|------|
| Temps de sauvegarde | Long | Court | Moyen |
| Espace utilisé | Important | Minimal | Croissant |
| Temps de restauration | Court | Long | Moyen |
| Complexité restauration | Faible | Élevée | Moyenne |
| Tolérance aux pannes | Excellente | Faible | Bonne |
## Architecture des scripts
```
backup/
├── backup.sh # Script principal
├── restore.sh # Script de restauration
├── config/
│ └── backup.conf # Configuration
├── logs/
│ └── backup_YYYYMMDD.log
└── data/
├── FULL_20250801/
├── INC_20250802/
└── latest -> INC_20250802/
```
## Livrables
### Présentation
<details>
<summary>Support de présentation (PDF)</summary>
<iframe src="/assets/projets-oc/p10/Bene_Mael_1_support_presentation_082025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
### Scripts de sauvegarde
<details>
<summary>sauvegarde_inc.sh - Sauvegarde incrémentale</summary>
```bash
#!/bin/bash
# Auteur : BENE Maël
# Version : 1.2
# Description : Sauvegarde incrémentale avec rotation, lien latest, et gestion automatique des FULL via le nom du dossier
set -euo pipefail
# Vérifie les paramètres
if [ "$#" -lt 2 ]; then
echo "Usage : $0 \"DOSSIER1 DOSSIER2 ...\" NOMBRE_JOURS_DE_RETENTION"
exit 1
fi
# Paramètres
DOSSIERS="$1"
RETENTION_JOURS="$2"
# Configuration
SOURCE_DIR="$HOME/mairie"
DEST_USER="backup-user"
DEST_HOST="stockage"
DEST_BASE="/home/$DEST_USER/backup"
LOG_DIR="$HOME/backup-logs"
DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
CUMULATIVE_LOG="$LOG_DIR/sauvegardes_inc.log"
mkdir -p "$LOG_DIR"
# En-tête log
{
echo "====================================================="
echo "[$(date '+%F %T')] > DÉBUT DE LA SAUVEGARDE INCRÉMENTALE"
echo "Dossiers sauvegardés : $DOSSIERS"
echo "Rétention prévue : $RETENTION_JOURS jour(s)"
echo "Horodatage de départ : $DATE"
echo "====================================================="
} >> "$CUMULATIVE_LOG"
# Vérification de la connexion SSH
if ! ssh -q "$DEST_USER@$DEST_HOST" exit; then
echo "Erreur : impossible de se connecter à $DEST_USER@$DEST_HOST"
exit 2
fi
for dossier in $DOSSIERS; do
echo "-----------------------------------------------------" >> "$CUMULATIVE_LOG"
echo "[$(date '+%F %T')] > Traitement du dossier : $dossier" >> "$CUMULATIVE_LOG"
# Détection de la dernière FULL dans la période de rétention
LAST_FULL=$(ssh "$DEST_USER@$DEST_HOST" "find '$DEST_BASE/$dossier' -maxdepth 1 -type d -name '*_FULL' -mtime -$RETENTION_JOURS 2>/dev/null" | sort -r | head -n 1)
FORCE_FULL=0
TYPE_SUFFIX=""
if [ -z "$LAST_FULL" ]; then
FORCE_FULL=1
TYPE_SUFFIX="_FULL"
echo "[$(date '+%F %T')] > Aucune FULL récente trouvée -> SAUVEGARDE DE TYPE : FULL" >> "$CUMULATIVE_LOG"
else
TYPE_SUFFIX="_INC"
echo "[$(date '+%F %T')] > Sauvegarde de TYPE : INCRÉMENTALE (base : $LAST_FULL)" >> "$CUMULATIVE_LOG"
fi
BACKUP_ID="${DATE}${TYPE_SUFFIX}"
DEST_PATH="$DEST_BASE/$dossier/$BACKUP_ID"
# Créer le dossier de destination
ssh "$DEST_USER@$DEST_HOST" "mkdir -p '$DEST_PATH'" >> "$CUMULATIVE_LOG" 2>&1
# rsync avec ou sans link-dest
if [ "$FORCE_FULL" -eq 1 ]; then
rsync -av --delete -e ssh "$SOURCE_DIR/$dossier/" "$DEST_USER@$DEST_HOST:$DEST_PATH/" \
>> "$CUMULATIVE_LOG" 2>&1
else
rsync -av --delete --link-dest="$LAST_FULL" -e ssh "$SOURCE_DIR/$dossier/" "$DEST_USER@$DEST_HOST:$DEST_PATH/" \
>> "$CUMULATIVE_LOG" 2>&1
fi
echo "[$(date '+%F %T')] > Fin de la sauvegarde de $dossier" >> "$CUMULATIVE_LOG"
# Mettre à jour le lien symbolique latest
ssh "$DEST_USER@$DEST_HOST" bash -c "'
cd \"$DEST_BASE/$dossier\"
ln -sfn \"$BACKUP_ID\" latest
'" >> "$CUMULATIVE_LOG" 2>&1
# Rotation : conserver les $RETENTION_JOURS plus récentes (tous types confondus)
ssh "$DEST_USER@$DEST_HOST" bash -c "'
cd \"$DEST_BASE/$dossier\"
ls -1dt 20* | tail -n +$((RETENTION_JOURS + 1)) | xargs -r rm -rf
'" >> "$CUMULATIVE_LOG" 2>&1
done
echo "[$(date '+%F %T')] SAUVEGARDE JOURNALIÈRE TERMINÉE" >> "$CUMULATIVE_LOG"
echo >> "$CUMULATIVE_LOG"
```
</details>
<details>
<summary>sauvegarde_dif.sh - Sauvegarde différentielle</summary>
```bash
#!/bin/bash
# Auteur : BENE Maël
# Version : 1.1
# Description : Sauvegarde différentielle avec temps d'exécution dans les logs
set -euo pipefail
# Configuration
DOSSIER="MACHINES"
SOURCE_DIR="$HOME/mairie/$DOSSIER"
DEST_USER="backup-user"
DEST_HOST="stockage"
DEST_PATH="/home/$DEST_USER/backup/$DOSSIER"
LOG_DIR="$HOME/backup-logs"
DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
CUMULATIVE_LOG="$LOG_DIR/sauvegardes_dif.log"
mkdir -p "$LOG_DIR"
start=0
rsync_started=false
# Fonction exécutée même en cas de plantage ou d'interruption
on_exit() {
if $rsync_started; then
local end=$(date +%s)
local duration=$((end - start))
echo "[$(date '+%F %T')] > Durée de la sauvegarde : ${duration} secondes" >> "$CUMULATIVE_LOG"
fi
}
trap on_exit EXIT
# Log de début
{
echo "====================================================="
echo "[$(date '+%F %T')] > DÉBUT DE LA SAUVEGARDE DIFFÉRENTIELLE"
echo "Dossier : $DOSSIER"
echo "Source : $SOURCE_DIR"
echo "Destination : $DEST_USER@$DEST_HOST:$DEST_PATH"
echo "Horodatage : $DATE"
echo "====================================================="
} >> "$CUMULATIVE_LOG"
# Préparation du dossier distant
echo "[$(date '+%F %T')] > Vérification du dossier distant..." >> "$CUMULATIVE_LOG"
ssh "$DEST_USER@$DEST_HOST" "mkdir -p '$DEST_PATH'" >> "$CUMULATIVE_LOG" 2>&1
echo "[$(date '+%F %T')] > Dossier distant prêt." >> "$CUMULATIVE_LOG"
# Mesure du temps
start=$(date +%s)
rsync_started=true
# Lancement de rsync
echo "[$(date '+%F %T')] > Lancement de rsync..." >> "$CUMULATIVE_LOG"
rsync -av --inplace --partial --append -e ssh "$SOURCE_DIR/" "$DEST_USER@$DEST_HOST:$DEST_PATH/" \
>> "$CUMULATIVE_LOG" 2>&1
# Si rsync a terminé normalement, on continue le log
echo "[$(date '+%F %T')] SAUVEGARDE DIFFÉRENTIELLE TERMINÉE" >> "$CUMULATIVE_LOG"
echo >> "$CUMULATIVE_LOG"
```
</details>
### Scripts de restauration
<details>
<summary>restore_inc.sh - Restauration incrémentale</summary>
```bash
#!/bin/bash
# Auteur : BENE Maël
# Version : 1.1
# Description : Restauration interactive d'un dossier ou d'un fichier individuel (version améliorée avec journalisation)
set -euo pipefail
# Configuration
DEST_USER="backup-user"
DEST_HOST="stockage"
DEST_BASE="/home/$DEST_USER/backup"
BASE_RESTORE_DIR="/home/oclassroom/mairie"
LOG_FILE="/home/oclassroom/backup-logs/restores_inc.log"
# Fonction de log
log_header() {
local type="$1" # "Dossier complet" ou "Fichier spécifique"
{
echo "====================================================="
echo "[$START_DATE] > DÉBUT DE LA RESTAURATION INCRÉMENTALE"
echo "Dossier restauré : $DOSSIER"
echo "Type : $type"
echo "Horodatage de la sauvegarde : $BACKUP_TIMESTAMP"
echo "====================================================="
} >> "$LOG_FILE"
}
# Liste des dossiers disponibles (hors MACHINES)
DIR_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1 $DEST_BASE" | grep -v '^MACHINES$')
if [ -z "$DIR_LIST" ]; then
echo "Aucun dossier de sauvegarde trouvé."
exit 1
fi
echo "Dossiers disponibles à la restauration :"
DIR_ARRAY=()
i=1
while read -r line; do
echo " $i) $line"
DIR_ARRAY+=("$line")
((i++))
done <<< "$DIR_LIST"
read -rp "Numéro du dossier à restaurer : " DIR_NUM
DOSSIER="${DIR_ARRAY[$((DIR_NUM - 1))]}"
# Liste des sauvegardes disponibles
BACKUP_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1dt $DEST_BASE/$DOSSIER/20*_* 2>/dev/null")
if [ -z "$BACKUP_LIST" ]; then
echo "Aucune sauvegarde trouvée pour $DOSSIER."
exit 1
fi
echo "Sauvegardes disponibles pour '$DOSSIER' :"
BACKUP_ARRAY=()
i=1
while read -r line; do
SHORT=$(echo "$line" | sed "s|$DEST_BASE/||")
echo " $i) $SHORT"
BACKUP_ARRAY+=("$line")
((i++))
done <<< "$BACKUP_LIST"
read -rp "Numéro de la sauvegarde à restaurer (Entrée = latest) : " BACKUP_NUM
if [ -z "$BACKUP_NUM" ]; then
SELECTED_BACKUP=$(ssh "$DEST_USER@$DEST_HOST" "readlink -f '$DEST_BASE/$DOSSIER/latest'" || true)
if [ -z "$SELECTED_BACKUP" ]; then
echo "Aucun lien 'latest' trouvé pour ce dossier."
exit 1
fi
else
SELECTED_BACKUP="${BACKUP_ARRAY[$((BACKUP_NUM - 1))]}"
fi
echo "Sauvegarde sélectionnée : $(echo "$SELECTED_BACKUP" | sed "s|$DEST_BASE/||")"
# Horodatage pour les logs
START_DATE=$(date '+%Y-%m-%d %H:%M:%S')
BACKUP_TIMESTAMP=$(basename "$SELECTED_BACKUP")
# Choix entre restauration complète ou fichier spécifique
echo "Que voulez-vous restaurer ?"
select CHOIX in "Dossier complet" "Fichier spécifique"; do
case $REPLY in
1)
RESTORE_PATH="$BASE_RESTORE_DIR/$DOSSIER"
echo "> Restauration complète dans : $RESTORE_PATH"
mkdir -p "$RESTORE_PATH"
log_header "Dossier complet"
rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/" "$RESTORE_PATH/" >> "$LOG_FILE" 2>&1
echo "Dossier restauré avec succès."
break
;;
2)
echo "Liste des fichiers disponibles :"
FILE_LIST=$(ssh "$DEST_USER@$DEST_HOST" "cd '$SELECTED_BACKUP' && find . -type f" | sed 's|^\./||')
if [ -z "$FILE_LIST" ]; then
echo "Aucun fichier trouvé dans la sauvegarde."
exit 1
fi
FILE_ARRAY=()
i=1
while read -r file; do
echo " $i) $file"
FILE_ARRAY+=("$file")
((i++))
done <<< "$FILE_LIST"
read -rp "Numéro du fichier à restaurer : " FILE_NUM
FILE_TO_RESTORE="${FILE_ARRAY[$((FILE_NUM - 1))]}"
DEST_PATH="$BASE_RESTORE_DIR/$DOSSIER/$(dirname "$FILE_TO_RESTORE")"
mkdir -p "$DEST_PATH"
log_header "Fichier spécifique"
echo "> Restauration de '$FILE_TO_RESTORE' vers '$DEST_PATH'" >> "$LOG_FILE"
rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/$FILE_TO_RESTORE" "$DEST_PATH/" >> "$LOG_FILE" 2>&1
echo "Fichier restauré avec succès."
break
;;
*)
echo "Choix invalide."
;;
esac
done
```
</details>
<details>
<summary>restore_dif.sh - Restauration différentielle</summary>
```bash
#!/bin/bash
# Auteur : BENE Maël
# Version : 1.1
# Description : Restauration manuelle de sauvegarde différentielle (VMs) avec journalisation cumulative
set -euo pipefail
# Configuration
DOSSIER="MACHINES"
DEST_USER="backup-user"
DEST_HOST="stockage"
DEST_PATH="/home/$DEST_USER/backup/$DOSSIER"
RESTORE_DIR="$HOME/mairie/$DOSSIER"
LOG_FILE="$HOME/backup-logs/restores_dif.log"
mkdir -p "$HOME/backup-logs"
mkdir -p "$RESTORE_DIR"
START_DATE=$(date '+%Y-%m-%d %H:%M:%S')
{
echo "====================================================="
echo "[$START_DATE] > DÉBUT DE LA RESTAURATION DIFFÉRENTIELLE"
echo "Dossier restauré : $DOSSIER"
echo "Destination locale : $RESTORE_DIR"
echo "Source distante : $DEST_USER@$DEST_HOST:$DEST_PATH"
echo "====================================================="
} >> "$LOG_FILE"
# Restauration avec rsync (différentielle)
rsync -av -e ssh "$DEST_USER@$DEST_HOST:$DEST_PATH/" "$RESTORE_DIR/" >> "$LOG_FILE" 2>&1
{
echo "[$(date '+%Y-%m-%d %H:%M:%S')] > FIN DE LA RESTAURATION"
echo
} >> "$LOG_FILE"
```
</details>
### Configuration cron
<details>
<summary>crontab - Planification des sauvegardes</summary>
```bash
# Sauvegarde différentielle de la VM qui force l'arrêt après 3h (donc à 4h du matin)
0 1 * * * timeout 3h /home/oclassroom/backup_script/backup/differentielle.sh
# Sauvegardes journalières avec 7 jours de rétention
0 4 * * * /home/oclassroom/backup_script/backup/incrementale.sh "FICHIERS" 7
0 5 * * * /home/oclassroom/backup_script/backup/incrementale.sh "MAILS" 7
0 6 * * * /home/oclassroom/backup_script/backup/incrementale.sh "RH" 7
30 6 * * * /home/oclassroom/backup_script/backup/incrementale.sh "TICKETS" 7
# Sauvegarde de SITE tous les 3 jours à 7h, avec 15 jours de rétention
0 7 */3 * * /home/oclassroom/backup_script/backup/incrementale.sh "SITE" 15
```
</details>
### Logs d'exécution
<details>
<summary>sauvegardes_inc.log - Logs des sauvegardes incrémentales</summary>
```log
=====================================================
[2025-08-12 12:00:00] > DÉBUT DE LA SAUVEGARDE INCRÉMENTALE
Dossiers sauvegardés : FICHIERS
Rétention prévue : 7 jour(s)
Horodatage de départ : 2025-08-12_12-00-00
=====================================================
-----------------------------------------------------
[2025-08-12 12:00:00] > Traitement du dossier : FICHIERS
[2025-08-12 12:00:00] > Aucune FULL récente trouvée -> SAUVEGARDE DE TYPE : FULL
sending incremental file list
./
doc1.txt
doc2.txt
fichier_2025-08-12_1.txt
fichier_2025-08-12_2.txt
sent 449 bytes received 95 bytes 1.088,00 bytes/sec
total size is 94 speedup is 0,17
[2025-08-12 12:00:01] > Fin de la sauvegarde de FICHIERS
[2025-08-12 12:00:01] SAUVEGARDE JOURNALIÈRE TERMINÉE
=====================================================
[2025-08-13 12:00:00] > DÉBUT DE LA SAUVEGARDE INCRÉMENTALE
Dossiers sauvegardés : FICHIERS
Rétention prévue : 7 jour(s)
Horodatage de départ : 2025-08-13_12-00-00
=====================================================
-----------------------------------------------------
[2025-08-13 12:00:00] > Traitement du dossier : FICHIERS
[2025-08-13 12:00:00] > Sauvegarde de TYPE : INCRÉMENTALE (base : /home/backup-user/backup/FICHIERS/2025-08-12_12-00-00_FULL)
sending incremental file list
./
fichier_2025-08-13_1.txt
fichier_2025-08-13_2.txt
sent 361 bytes received 57 bytes 836,00 bytes/sec
total size is 154 speedup is 0,37
[2025-08-13 12:00:01] > Fin de la sauvegarde de FICHIERS
[2025-08-13 12:00:01] SAUVEGARDE JOURNALIÈRE TERMINÉE
=====================================================
[2025-08-20 12:00:00] > DÉBUT DE LA SAUVEGARDE INCRÉMENTALE
Dossiers sauvegardés : FICHIERS
Rétention prévue : 7 jour(s)
Horodatage de départ : 2025-08-20_12-00-00
=====================================================
-----------------------------------------------------
[2025-08-20 12:00:00] > Traitement du dossier : FICHIERS
[2025-08-20 12:00:00] > Aucune FULL récente trouvée -> SAUVEGARDE DE TYPE : FULL
sending incremental file list
[...]
[2025-08-20 12:00:01] > Fin de la sauvegarde de FICHIERS
[2025-08-20 12:00:01] SAUVEGARDE JOURNALIÈRE TERMINÉE
```
</details>
<details>
<summary>sauvegardes_dif.log - Logs des sauvegardes différentielles</summary>
```log
=====================================================
[2025-08-12 17:26:10] > DÉBUT DE LA SAUVEGARDE DIFFÉRENTIELLE
Dossier : MACHINES
Source : /home/oclassroom/mairie/MACHINES
Destination : backup-user@stockage:/home/backup-user/backup/MACHINES
Horodatage : 2025-08-12_17-26-10
=====================================================
[2025-08-12 17:26:10] > Vérification du dossier distant...
[2025-08-12 17:26:10] > Dossier distant prêt.
[2025-08-12 17:26:10] > Lancement de rsync...
sending incremental file list
./
fichier_gros.test
rsync error: unexplained error (code 255) at rsync.c(716) [sender=3.2.7]
[2025-08-12 17:26:35] > Durée de la sauvegarde : 25 secondes
=====================================================
[2025-08-12 17:26:42] > DÉBUT DE LA SAUVEGARDE DIFFÉRENTIELLE
Dossier : MACHINES
Source : /home/oclassroom/mairie/MACHINES
Destination : backup-user@stockage:/home/backup-user/backup/MACHINES
Horodatage : 2025-08-12_17-26-42
=====================================================
[2025-08-12 17:26:42] > Vérification du dossier distant...
[2025-08-12 17:26:42] > Dossier distant prêt.
[2025-08-12 17:26:42] > Lancement de rsync...
sending incremental file list
./
fichier_gros.test
sent 668.597.769 bytes received 38 bytes 148.577.290,44 bytes/sec
total size is 5.368.709.120 speedup is 8,03
[2025-08-12 17:26:46] SAUVEGARDE DIFFÉRENTIELLE TERMINÉE
[2025-08-12 17:26:46] > Durée de la sauvegarde : 4 secondes
```
</details>
<details>
<summary>restores_inc.log - Logs des restaurations incrémentales</summary>
```log
=====================================================
[2025-08-12 17:23:56] > DÉBUT DE LA RESTAURATION INCRÉMENTALE
Dossier restauré : FICHIERS
Type : Fichier spécifique
Horodatage de la sauvegarde : 2025-08-25_12-00-00_INC
=====================================================
> Restauration de 'doc1.txt' vers '/home/oclassroom/mairie/FICHIERS/.'
receiving incremental file list
doc1.txt
sent 43 bytes received 139 bytes 121,33 bytes/sec
total size is 18 speedup is 0,10
=====================================================
[2025-08-12 17:24:13] > DÉBUT DE LA RESTAURATION INCRÉMENTALE
Dossier restauré : FICHIERS
Type : Dossier complet
Horodatage de la sauvegarde : 2025-08-25_12-00-00_INC
=====================================================
receiving incremental file list
./
doc2.txt
fichier_2025-08-12_1.txt
[...]
fichier_2025-08-25_2.txt
sent 578 bytes received 2.750 bytes 6.656,00 bytes/sec
total size is 862 speedup is 0,26
```
</details>
<details>
<summary>restores_dif.log - Logs des restaurations différentielles</summary>
```log
=====================================================
[2025-08-12 17:29:42] > DÉBUT DE LA RESTAURATION DIFFÉRENTIELLE
Dossier restauré : MACHINES
Destination locale : /home/oclassroom/mairie/MACHINES
Source distante : backup-user@stockage:/home/backup-user/backup/MACHINES
=====================================================
receiving incremental file list
./
fichier_1Go.bin
fichier_gros.test
sent 65 bytes received 6.444.024.019 bytes 186.783.306,78 bytes/sec
total size is 6.442.450.944 speedup is 1,00
[2025-08-12 17:30:16] > FIN DE LA RESTAURATION
```
</details>
## Compétences acquises
- Développement de scripts Bash avancés
- Maîtrise de rsync et ses options
- Conception de stratégies de sauvegarde (3-2-1)
- Gestion de la rétention et rotation
- Automatisation avec cron
- Documentation de procédures de restauration

View file

@ -0,0 +1,63 @@
---
sidebar_position: 11
---
# Conformité ANSSI pour SI de santé
## Contexte
Application des recommandations ANSSI pour la sécurisation du système d'information d'OpenPharma : cartographie, administration sécurisée et budget d'évolution.
## Objectifs
- Analyser et synthétiser les guides ANSSI applicables
- Réaliser la cartographie du SI existant
- Proposer une architecture cible conforme
- Établir un budget matériel et logiciel
- Planifier le projet de mise en conformité
## Guides ANSSI appliqués
- **Cartographie du système d'information** (v1b, 2018)
- **Administration sécurisée des SI** (v3.0)
## Technologies et solutions proposées
| Besoin | Solution | Justification |
|--------|----------|---------------|
| Bastion d'administration | Teleport | Open source, audit intégré |
| SIEM | Wazuh | Détection, conformité, gratuit |
| Firewall | FortiGate 60F | UTM, support constructeur |
| Sauvegarde | Synology RS822+ | NAS rack, snapshots, réplication |
## Livrables
<details>
<summary>Cartographie du SI (PDF)</summary>
<iframe src="/assets/projets-oc/p11/BENE_Mael_1_cartographie_092025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Plan projet (PDF)</summary>
<iframe src="/assets/projets-oc/p11/BENE_Mael_2_plan_projet_092025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Documentation utilisateurs et administrateurs (PDF)</summary>
<iframe src="/assets/projets-oc/p11/BENE_Mael_3_documentation_092025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Analyse et application des référentiels ANSSI
- Cartographie de systèmes d'information
- Conception d'architectures sécurisées
- Élaboration de budgets IT
- Gestion de projet de mise en conformité
- Prise en compte des contraintes sectorielles (santé)

View file

@ -0,0 +1,80 @@
---
sidebar_position: 12
---
# Audit de sécurité Active Directory
## Contexte
Audit de sécurité offensive du domaine Windows et de l'Active Directory d'une clinique : tests d'intrusion, identification des vulnérabilités et plan de remédiation.
## Objectifs
- Réaliser un audit de sécurité complet de l'AD
- Identifier les vulnérabilités exploitables
- Démontrer les risques par des preuves de concept
- Proposer un plan d'actions correctives aligné ANSSI/NIST
## Méthodologie
1. **Reconnaissance** : énumération du domaine
2. **Exploitation** : tests d'intrusion contrôlés
3. **Post-exploitation** : élévation de privilèges
4. **Rapport** : vulnérabilités et remédiations
## Outils utilisés
| Outil | Utilisation |
|-------|-------------|
| **nmap** | Scan réseau et services |
| **enum4linux** | Énumération SMB/AD |
| **Kerberoasting** | Extraction de tickets Kerberos |
| **Mimikatz** | Extraction de credentials |
| **BloodHound** | Analyse des chemins d'attaque AD |
## Vulnérabilités identifiées (exemples)
| Vulnérabilité | Criticité | Risque |
|---------------|-----------|--------|
| Comptes avec SPN et mot de passe faible | Critique | Kerberoasting -> accès privilégié |
| NTLM activé | Élevée | Pass-the-Hash |
| Délégation non contrainte | Élevée | Usurpation d'identité |
| Mots de passe en clair (GPP) | Critique | Compromission immédiate |
## Livrables
<details>
<summary>Rapport de pentest (PDF)</summary>
Document détaillé des tests d'intrusion réalisés et des vulnérabilités identifiées.
<iframe src="/assets/projets-oc/p12/BENE_Mael_1_rapport_pentest_102025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Plan d'actions correctives (PDF)</summary>
Plan de remédiation avec priorisation des actions selon le niveau de criticité.
<iframe src="/assets/projets-oc/p12/BENE_Mael_2_plan_action_102025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Présentation de restitution (PDF)</summary>
Support de présentation pour la restitution aux parties prenantes.
<iframe src="/assets/projets-oc/p12/BENE_Mael_3_restitution_102025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Méthodologie d'audit de sécurité
- Utilisation d'outils de pentesting
- Analyse de vulnérabilités Active Directory
- Rédaction de rapports d'audit
- Élaboration de plans de remédiation
- Restitution des résultats aux parties prenantes

View file

@ -0,0 +1,70 @@
---
sidebar_position: 13
---
# Migration vers le Cloud AWS
## Contexte
Accompagnement de l'entreprise Patronus dans sa migration vers AWS : dossier d'architecture technique, veille technologique, planning et estimation des coûts.
## Objectifs
- Réaliser une veille technologique sur les services Cloud
- Produire un Dossier d'Architecture Technique (DAT)
- Comparer les modèles on-premise, IaaS et PaaS
- Établir un planning de migration (Gantt)
- Estimer les charges humaines et financières
## Services AWS évalués
| Service | Équivalent on-prem | Utilisation |
|---------|-------------------|-------------|
| **EC2** | Serveurs physiques | Compute |
| **RDS** | MySQL/PostgreSQL | Base de données managée |
| **S3** | NAS/SAN | Stockage objet |
| **CloudFront** | CDN | Distribution de contenu |
| **VPC** | Réseau local | Isolation réseau |
| **IAM** | Active Directory | Gestion des accès |
## Comparaison des modèles
| Critère | On-premise | IaaS (EC2) | PaaS (Elastic Beanstalk) |
|---------|------------|------------|--------------------------|
| Contrôle | Total | Élevé | Limité |
| Maintenance | Interne | Partagée | AWS |
| Scalabilité | Limitée | Bonne | Excellente |
| Coût initial | Élevé | Faible | Faible |
| Coût récurrent | Faible | Variable | Variable |
## Livrables
<details>
<summary>Veille technologique (PDF)</summary>
<iframe src="/assets/projets-oc/p13/bene_mael__1_resultat-veille_112025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Plan de migration (PDF)</summary>
<iframe src="/assets/projets-oc/p13/bene_mael_2_migration_Patronus_112025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
<details>
<summary>Présentation (PDF)</summary>
<iframe src="/assets/projets-oc/p13/bene_mael_3_diaporama_112025.pdf" width="100%" height="600px" style={{border: 'none'}}></iframe>
</details>
## Compétences acquises
- Veille technologique structurée
- Compréhension des modèles Cloud (IaaS/PaaS/SaaS)
- Rédaction de dossiers d'architecture technique
- Estimation de charges et coûts de projet
- Planification de migration (Gantt)
- Communication avec les parties prenantes (kickoff)