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.
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.
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.
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
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.
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.
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.
# 🔒 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`.
# 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.
# 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.