Portfolio de Brice BERNARDIN

Stage à l'université de la Réunion: Projet BRICE

SAE 304

Projet BRICE

Le projet BRICE (Blocage et Régulation de l’Internet en Conditions d’Examen) a été conçu pour permettre aux professeurs de bloquer l’accès à Internet dans les salles informatiques pendant les examens, tout en laissant l’accès à des sites autorisés comme moodle-central.univ-reunion.fr. Il répond à un besoin de sécurisation des conditions d’examen dans un environnement réseau contrôlé. Le développement du projet a été réalisé en utilisant PHP pour la partie serveur et PowerShell pour l’automatisation des scripts de blocage et de configuration réseau.

Compétences ciblées :

Objectifs et problématique professionnelle :

L’objectif principal du projet BRICE est de garantir des conditions d’examen équitables et sécurisées dans les salles informatiques de l’université. Le professionnel doit concevoir une solution capable de bloquer sélectivement les connexions Internet, tout en maintenant l’accès à des plateformes autorisées nécessaires au bon déroulement des épreuves. Ce projet répond à la problématique de la gestion fine des accès réseau en environnement académique.

Descriptif générique :

Le projet repose sur une architecture où un serveur central gère les politiques d’accès réseau. Les scripts PowerShell sont utilisés pour appliquer ou lever les restrictions de connexion sur les postes clients, tandis que l’interface web en PHP permet aux enseignants d’activer le mode examen, de gérer les listes de sites autorisés et de surveiller l’état des connexions.

Mots-clés :

Sécurité réseau, blocage Internet, PowerShell, PHP, automatisation, contrôle d’accès, examen en ligne, filtrage réseau, scripts d’administration, serveur web

Mise en situation professionnelle :

Dans le cadre de mon stage, nous avons participé au développement du projet BRICE (Blocage et Régulation de l’Internet en Conditions d’Examen), destiné à sécuriser l’accès réseau dans les salles informatiques pendant les épreuves universitaires. Ce projet nous a permis de travailler sur la conception d’un système capable de bloquer l’accès à Internet tout en maintenant la connexion à des sites autorisés comme moodle-central.univ-reunion.fr.

Nous avons développé une interface web en PHP permettant aux enseignants d’activer ou désactiver le mode examen, ainsi que d’administrer la liste des sites autorisés. Parallèlement, nous avons utilisé des scripts PowerShell pour automatiser le blocage et le déblocage des connexions sur les postes clients.

Cette mise en situation nous a permis d’acquérir des compétences en administration réseau, en automatisation et en développement d’outils web intégrés à un environnement contrôlé. Nous avons également pris en compte les problématiques de sécurité, de fiabilité et de facilité d’utilisation, essentielles dans le cadre d’examens surveillés.

Descriptif de l'application Web

Fonctionnalités principales :

Interface Web :

Interface web du projet BRICE Vue de la journalisation des actions Exemple de gestion des utilisateurs Exemple de gestion des utilisateurs Exemple de l'état des examens

L’interface web développée en PHP permet aux enseignants d’activer ou de désactiver le mode examen, de gérer la liste des sites autorisés et de suivre l’état du réseau. Les interactions avec les postes clients sont automatisées via des scripts PowerShell exécutés à distance.

Schéma de l’architecture :

Schéma du fonctionnement du projet BRICE

Le schéma illustre le fonctionnement global du système : le serveur web (PHP) centralise les commandes et communique avec les postes clients grâce à des scripts PowerShell. Cette architecture permet une gestion centralisée, sécurisée et rapide du réseau en conditions d’examen.

Exemple de code de blocage et déblocage :

POWERSHELL

# 🔒 Bloquer tout le trafic entrant et sortant

netsh advfirewall set allprofiles firewallpolicy blockinbound,blockoutbound

# ✅ Autoriser Site

$nomSite = "Nom du site"

$ips = "AdresseIP,AdresseIP"

# Règle sortante

netsh advfirewall firewall add rule name="DSI BRICE : Autoriser $nomSite OUT ($ips)" dir=out action=allow remoteip=$ips protocol=any

# Règle entrante

netsh advfirewall firewall add rule name="DSI BRICE : Autoriser $nomSite IN ($ips)" dir=in action=allow remoteip=$ips protocol=any

Write-Host "Configuration terminée."

Ce script PowerShell permet de bloquer tout le trafic entrant et sortant sur les postes clients, puis d’autoriser uniquement l’accès aux sites spécifiquement autorisés pour le mode examen. Il configure des règles entrantes et sortantes via `netsh advfirewall`.


POWERSHELL

# Supprimer toutes les règles dont le DisplayName commence par 'DSI BRICE'

Get-NetFirewallRule | Where-Object { $_.DisplayName -like 'DSI BRICE*' } | Remove-NetFirewallRule

# Réinitialiser la politique firewall : bloquer inbound, autoriser outbound

netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound

Ce script supprime toutes les règles précédemment créées par BRICE et réinitialise la politique du firewall. Il est utilisé pour remettre les postes clients dans un état sûr et réutilisable après la fin d’un examen ou d’un test.


POWERSHELL

# Déclaration des paramètres

param (

[Parameter(Mandatory = $true)][string]$Action,

[Parameter(Mandatory = $true)][string]$Campus,

[Parameter(Mandatory = $true)][string]$Salle,

[int]$DurationMinutes = 0

)

# Infos MySQL

$mysqlPath = "/usr/bin/mysql"

$server = "*****"

$database = "*****"

$username = "*****"

$password = "*****"

$UID = [guid]::NewGuid().ToString()

$hostFile = "/tmp/ip_list_$UID.txt"

$lockFile = "/tmp/lock_${Campus}_${Salle}.lock"

if (Test-Path $lockFile) {

Write-Error "❌ Une exécution est déjà en cours pour la salle '$Salle' du campus '$Campus'."

exit 1

}

New-Item -ItemType File -Path $lockFile | Out-Null

# Requête IPs

$query = @@

"

SET NAMES utf8mb4;

SELECT ips.ip_adresse

FROM ips

JOIN salles ON ips.salle_id = salles.id

JOIN campus ON salles.campus_id = campus.id

WHERE campus.nom = '$Campus' AND salles.nom = '$Salle';

"@

try {

$args = @("-h", $server, "-u", $username, "-p$password", "-D", $database, "-s", "-N", "-e", $query)

$IPs = & $mysqlPath @args | ForEach-Object { $_.Trim() }

if (-not $IPs -or $IPs.Count -eq 0) {

Write-Error "❌ Aucune IP trouvée pour Campus='$Campus' et Salle='$Salle'"

Remove-Item -Path $lockFile -Force

exit 1

}

} catch {

Write-Error "Erreur MySQL : $_"

Remove-Item -Path $lockFile -Force

exit 1

}

# Création fichier IPs

$IPs | ForEach-Object { "*****@$_" } | Set-Content -Path $hostFile

# Choix des scripts à copier et exécuter

switch ($Action.ToLower()) {

"blockall" {

$scriptActivate = "/var/www/html/Script/activate_mode_examen_complet.ps1"

$scriptDeactivate = "/var/www/html/Script/desactive_mode_examen.ps1"

$remoteActivate = "C:\Windows\Temp\activate_mode_examen_complet.ps1"

$remoteDeactivate = "C:\Windows\Temp\desactive_mode_examen.ps1"

}

"blockmoodle" {

$scriptActivate = "/var/www/html/Script/activate_mode_examen_only_moodle.ps1"

$scriptDeactivate = "/var/www/html/Script/desactive_mode_examen.ps1"

$remoteActivate = "C:\Windows\Temp\activate_mode_examen_only_moodle.ps1"

$remoteDeactivate = "C:\Windows\Temp\desactive_mode_examen.ps1"

}

"blockUness" {

$scriptActivate = "/var/www/html/Script/activate_mode_examen_only_uness.ps1"

$scriptDeactivate = "/var/www/html/Script/desactive_mode_examen.ps1"

$remoteActivate = "C:\Windows\Temp\activate_mode_examen_only_uness.ps1"

$remoteDeactivate = "C:\Windows\Temp\desactive_mode_examen.ps1"

}

"unblock" {

$scriptActivate = "/var/www/html/Script/desactive_mode_examen.ps1"

$remoteActivate = "C:\Windows\Temp\desactive_mode_examen.ps1"

}

default {

Write-Error "❌ Action inconnue : $Action"

Remove-Item -Path $lockFile -Force

exit 1

}

}

# Copie des scripts nécessaires et exécution distante

parallel-scp -h $hostFile -l ***** -t 25 -x "-o StrictHostKeyChecking=no -o PasswordAuthentication=no" $scriptActivate $remoteActivate > $null 2>&1

if ($Action -ne "unblock") {

parallel-scp -h $hostFile -l ***** -t 25 -x "-o StrictHostKeyChecking=no -o PasswordAuthentication=no" $scriptDeactivate $remoteDeactivate > $null 2>&1

}

# Création d'un script temporaire d'exécution distant

$execScriptPath = "/tmp/exec_mode_examen_$UID.ps1"

$remoteExecScript = "C:\Windows\Temp\exec_mode_examen.ps1"

$execContent = @@"

powershell -ExecutionPolicy Bypass -File "$remoteActivate"

"@

# Planification d'une tâche de déblocage si nécessaire

if ($DurationMinutes -gt 0 -and $Action.ToLower() -ne "unblock") {

$reunionTime = Get-Date

$timeToRun = $reunionTime.AddMinutes($DurationMinutes).ToString("HH:mm")

$taskName = "Unblock_${Campus}_${Salle}_$([guid]::NewGuid().ToString().Substring(0,8))"

$schtasksCmd = "schtasks /Create /SC ONCE /TN `"$taskName`" /TR `"powershell -ExecutionPolicy Bypass -File `"$remoteDeactivate`"`" /ST $timeToRun /F /RL HIGHEST /RU SYSTEM"

$sshCmd = @" parallel-ssh -h $hostFile -l ***** -t 25 -x "-o StrictHostKeyChecking=no -o PasswordAuthentication=no" '$schtasksCmd' > /dev/null 2>&1 "@

$result = Invoke-Expression $sshCmd

if ($LASTEXITCODE -ne 0) { Write-Error "❌ Erreur lors de la création de la tâche planifiée à distance." ; Remove-Item -Path $lockFile -Force }

else { Write-Host "✅ Tâche planifiée créée avec succès sur toutes les machines : $taskName" }

}

# Enregistrement et exécution du script distant

Set-Content -Path $execScriptPath -Value $execContent -Encoding UTF8

parallel-scp -h $hostFile -l ***** -t 25 -x "-o StrictHostKeyChecking=no -o PasswordAuthentication=no" $execScriptPath $remoteExecScript > $null 2>&1

$cmd = "powershell -ExecutionPolicy Bypass -File `"$remoteExecScript`""

$psshCommand = "parallel-ssh -h $hostFile -l ***** -t 25 -x '-o StrictHostKeyChecking=no -o PasswordAuthentication=no' `"$cmd`""

Invoke-Expression $psshCommand > $null 2>&1

# Nettoyage

Remove-Item -Path $execScriptPath, $hostFile -Force -ErrorAction SilentlyContinue

Remove-Item -Path $lockFile -Force

if ($Action -eq "unblock") {

Write-Host "✅ Exécution terminée pour $Action dans $Campus/$Salle."

} elseif ($timeToRun -ne 0 -and $null -ne $timeToRun) {

Write-Host "✅ Exécution terminée pour $Action dans $Campus/$Salle jusqu'à $timeToRun"

} else {

Write-Host "✅ Exécution terminée pour $Action dans $Campus/$Salle. N'oubliez pas d'enlever le mode à la fin de votre examen"

}

Ce script est le cœur de l’automatisation BRICE. Il récupère dynamiquement les adresses IP des postes d’une salle et d’un campus via MySQL, vérifie qu’aucune autre instance n’est en cours, et choisit les scripts à exécuter selon l’action demandée (blocage complet, blocage partiel ou déblocage). Il inclut la gestion des fichiers temporaires et la sécurisation des opérations.