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:
parent
40a8985942
commit
ed989ff004
86 changed files with 24243 additions and 1 deletions
24
docs/projets-openclassrooms/index.md
Normal file
24
docs/projets-openclassrooms/index.md
Normal 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 |
|
||||
81
docs/projets-openclassrooms/p02-gestion-itsm.md
Normal file
81
docs/projets-openclassrooms/p02-gestion-itsm.md
Normal 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é
|
||||
65
docs/projets-openclassrooms/p03-architecture-reseau.md
Normal file
65
docs/projets-openclassrooms/p03-architecture-reseau.md
Normal 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>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Schéma logique</summary>
|
||||
|
||||

|
||||
|
||||
</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
|
||||
148
docs/projets-openclassrooms/p04-architecture-ntiers.md
Normal file
148
docs/projets-openclassrooms/p04-architecture-ntiers.md
Normal 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
|
||||
193
docs/projets-openclassrooms/p05-securisation-web.md
Normal file
193
docs/projets-openclassrooms/p05-securisation-web.md
Normal 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
|
||||
310
docs/projets-openclassrooms/p06-site-distant.md
Normal file
310
docs/projets-openclassrooms/p06-site-distant.md
Normal 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>
|
||||
|
||||

|
||||
|
||||
</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>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Capture GPO restriction disque amovible</summary>
|
||||
|
||||

|
||||
|
||||
</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
|
||||
70
docs/projets-openclassrooms/p07-reseau-cisco.md
Normal file
70
docs/projets-openclassrooms/p07-reseau-cisco.md
Normal 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
|
||||
73
docs/projets-openclassrooms/p08-supervision-nagios.md
Normal file
73
docs/projets-openclassrooms/p08-supervision-nagios.md
Normal 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>
|
||||
|
||||

|
||||
|
||||
</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é
|
||||
235
docs/projets-openclassrooms/p09-gestion-parc-ansible.md
Normal file
235
docs/projets-openclassrooms/p09-gestion-parc-ansible.md
Normal 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
|
||||
639
docs/projets-openclassrooms/p10-sauvegardes-rsync.md
Normal file
639
docs/projets-openclassrooms/p10-sauvegardes-rsync.md
Normal 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
|
||||
63
docs/projets-openclassrooms/p11-conformite-anssi.md
Normal file
63
docs/projets-openclassrooms/p11-conformite-anssi.md
Normal 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é)
|
||||
80
docs/projets-openclassrooms/p12-audit-securite-ad.md
Normal file
80
docs/projets-openclassrooms/p12-audit-securite-ad.md
Normal 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
|
||||
70
docs/projets-openclassrooms/p13-migration-cloud-aws.md
Normal file
70
docs/projets-openclassrooms/p13-migration-cloud-aws.md
Normal 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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue