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

@ -1,3 +1,70 @@
# Présentation
Présentation à venir.
Administrateur systèmes et réseaux spécialisé en **automatisation cross-platform** (Ansible/PowerShell/Bash), **virtualisation & conteneurisation** (Proxmox/Docker) et **Active Directory**. Certifié RNCP niveau 6 par OpenClassrooms, compétences acquises via 12 projets techniques couvrant réseaux d'entreprise, supervision, sauvegardes/PRA et sécurité offensive. Homelab en production pour R&D continue.
---
## Les débuts
Tout a commencé comme un simple hobby avec les premières créations de **serveurs Minecraft** en 2013 : lanceur de jeu customisé, gestion de fichiers de configurations, premiers scripts en Bash puis en Python vers 2015.
En 2017, j'ai créé mon premier homelab avec un **Raspberry Pi** qui me servait pour divers projets :
- Serveur audio Bluetooth
- AirPlay
- UPnP
- Console de jeux vidéo rétro
## La découverte du self-hosting
Au départ, j'étais motivé par la volonté de tester et d'expérimenter : voir si je pouvais accéder à mes fichiers ou services à distance. Puis est venu l'aspect pratique et la volonté de conserver mes données sur mes propres machines.
C'est vers **2020** que j'ai découvert **Docker**. Mon premier serveur était très simple : quelques `docker run` avec **Nginx Proxy Manager** et un accès administration via **WireGuard**.
Par la suite, j'ai approfondi mes connaissances :
- Passage aux fichiers **Docker Compose**
- Notions réseau : subnets, VLANs, ACLs
- Transition du bare metal vers la **virtualisation**
Cela m'a permis d'aboutir à mon architecture actuelle : un serveur Ubuntu déployé sous **Proxmox**, automatisé via **Ansible** et des fichiers Docker Compose.
## La reconversion professionnelle
Avant l'informatique, j'ai suivi un parcours en **Lettres** : licence à l'Université de Caen, puis professeur de français contractuel dans l'Éducation Nationale pour des classes de seconde, première STMG et BTS.
En parallèle, j'ai travaillé comme coordinateur de service civique en prévention santé à la LMDE, et animateur BAFA pendant plusieurs années.
Après une période de voyages et de travail saisonnier, j'ai décidé de concrétiser ce qui était jusque-là un hobby passionné : faire de l'administration systèmes et réseaux mon métier. En **novembre 2024**, j'ai intégré la formation **Administrateur Systèmes, Réseaux et Sécurité** chez **OpenClassrooms**.
## La formation OpenClassrooms
Cette formation, sanctionnée par une **certification RNCP niveau 6** (équivalent Bac+3/4), m'a permis de formaliser et d'approfondir mes compétences à travers **12 projets techniques** couvrant l'ensemble du spectre SysAdmin/DevOps :
- **Gestion ITSM** : ticketing GLPI, méthodologie ITIL
- **Architecture réseau** : conception LAN multi-VLAN, firewalls, plans d'adressage
- **Conteneurisation** : déploiement d'architectures n-tiers avec Docker
- **Sécurisation** : durcissement Apache, Fail2ban, certificats SSL, FTP chiffré
- **Infrastructure Windows** : VPN site-à-site, Active Directory, RODC, GPO
- **Réseau Cisco** : VLAN, ACL, EtherChannel, NAT/PAT, IPv6
- **Supervision** : Nagios, sondes personnalisées, centralisation syslog
- **Automatisation** : Ansible cross-platform, intégration GLPI
- **Sauvegardes** : scripts Bash rsync (FULL/INC/DIFF), PRA
- **Conformité** : application des guides ANSSI pour SI de santé
- **Sécurité offensive** : audit Active Directory, pentesting (nmap, Mimikatz, Kerberoasting)
- **Cloud** : migration AWS, architecture technique, estimation des coûts
J'ai obtenu ma certification par anticipation le **6 novembre 2025**, après moins d'un an de formation.
Le détail de chaque projet est disponible dans la section [Projets OpenClassrooms](/docs/category/projets-openclassrooms).
## Vers l'Infrastructure as Code et le DevOps
L'aspect **Infrastructure as Code** m'a immédiatement plu et m'a amené à m'intéresser à :
- La philosophie **DevOps**
- **Terraform** et sa contrepartie open source **OpenTofu**
- **Git** et les pipelines **CI/CD**
- **Kubernetes**
- Le stockage distribué et la haute disponibilité
Mon objectif actuel : un **cluster Proxmox** à trois machines (deux machines de prod et une witness pour le quorum), après avoir envisagé d'utiliser tous ces outils sur une seule machine pour des raisons de coût.
Cette architecture est actuellement en cours de réalisation sur mon [dépôt Homelab](https://forgejo.tellserv.fr/Tellsanguis/Homelab). L'ancienne architecture reste déployée en parallèle pour assurer une migration en douceur.

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)