From 376236c20370086c28de9a5ce322d532503a1b7d Mon Sep 17 00:00:00 2001 From: Hubert Cornet Date: Wed, 3 Sep 2025 21:14:31 +0200 Subject: [PATCH] Update cybersecurity/Network Reputation Service/script-nrs.ps1 --- .../Network Reputation Service/script-nrs.ps1 | 174 +++++++++--------- 1 file changed, 83 insertions(+), 91 deletions(-) diff --git a/cybersecurity/Network Reputation Service/script-nrs.ps1 b/cybersecurity/Network Reputation Service/script-nrs.ps1 index f3f2097..2927251 100644 --- a/cybersecurity/Network Reputation Service/script-nrs.ps1 +++ b/cybersecurity/Network Reputation Service/script-nrs.ps1 @@ -1,7 +1,7 @@ # Script d'Audit Firewall - Network Reputation Service # Auteur: Hubert Cornet # Date: 03/09/2025 -# Version: 1.1 +# Version: 1.2 Clear-Host @@ -27,14 +27,14 @@ $GradeColors = @{ ### Functions ### -## Function Write-ColorOutput +## Function Write-ColorOutput : pour afficher du texte en couleur Function Write-ColorOutput { Param( [string]$Text, [string]$Color = "White" ) - Try { + Try{ Write-Host $Text -ForegroundColor $Color } Catch { @@ -42,9 +42,9 @@ Function Write-ColorOutput { } } -## Function Prerequisites +## Function Prerequisites : vérifie les prérequis Function Prerequisites { - Write-ColorOutput "`n=== Vérification des prérequis ===" "Cyan" + Write-ColorOutput "`n === Vérification des prérequis ===" "Cyan" # Vérification du fichier JSON $JsonFile = Join-Path $PSScriptRoot "file-nrs.json" @@ -52,7 +52,7 @@ Function Prerequisites { If(-not (Test-Path $JsonFile)) { Write-ColorOutput "ERREUR: Le fichier 'file-nrs.json' n'existe pas!" "Red" Write-ColorOutput "Veuillez télécharger ou créer le fichier depuis:" "Yellow" - Write-ColorOutput "https://github.com/your-repo/file-nrs.json" "Blue" + Write-ColorOutput "https://gitea.tips-of-mine.com/Tips-Of-Mine/Powershell/src/branch/main/cybersecurity/Network%20Reputation%20Service/file-nrs.json" "Blue" Write-ColorOutput "Le fichier doit être placé dans le même dossier que ce script." "Yellow" Return $false @@ -63,11 +63,11 @@ Function Prerequisites { # Vérification/Installation des modules requis $RequiredModules = @('PSWriteHTML', 'PSWriteColor') - Foreach ($Module in $RequiredModules) { + Foreach($Module in $RequiredModules) { If(-not (Get-Module -ListAvailable -Name $Module)) { Write-ColorOutput "Installation du module $Module..." "Yellow" - Try { + Try{ Install-Module -Name $Module -Force -Scope CurrentUser -AllowClobber Write-ColorOutput "✓ Module $Module installé" "Green" @@ -85,10 +85,10 @@ Function Prerequisites { Import-Module $Module -Force } - return $true + Return $True } -## Function Check-Categories +## Function Check-Categories : pour tester les catégories et URLs Function Check-Categories { Param( [array]$Categories, @@ -102,21 +102,21 @@ Function Check-Categories { $BlockKeywors = @("site bloqué", "access denied", "filtrage web", "Access Denied", "Site Blocked") # Définir les mots-clés des page des blocage - Foreach ($Category in $Categories.Categorie) { + Foreach($Category in $Categories.Categorie) { $CategoryCount++ - Show-ProgressBar -Current $CategoryCount -Total $Categories.Categorie.Count -Activity "Test des catégories" -Status "Catégorie: $($category.Categorie.nom)" + Show-ProgressBar -Id 1 -Current $CategoryCount -Total $Categories.Categorie.Count -Activity "Test des catégories" -Status "Catégorie: $($category.Categorie.nom)" - Write-ColorOutput "`n=== Test de la catégorie: $($Category.nom) ===" "Cyan" - #Write-ColorOutput "Description: $($category.description)" "Gray" + Write-ColorOutput "`n === Test de la catégorie: $($Category.nom) ===" "Cyan" + #Write-ColorOutput "`nDescription: $($Category.description)" "Gray" $CategoryResults = @() - $UrlCount = 0 + $UrlCount = 0 - Foreach ($UrlObj in $Category.urls) { + Foreach($UrlObj in $Category.urls) { $UrlCount++ - Show-ProgressBar -Current $UrlCount -Total $Category.urls.Count -Activity "Test des URLs de '$($Category.nom)'" -Status $UrlObj.url + Show-ProgressBar -Id 2 -Current $UrlCount -Total $Category.urls.Count -Activity "Test des URLs de '$($Category.nom)'" -Status $UrlObj.url Write-ColorOutput "Test de: $($UrlObj.url)" "Yellow" @@ -138,40 +138,41 @@ Function Check-Categories { IsCorrect = (($TestResult.Status -eq "Bloqué" -and $UrlObj.expected_action -eq "block") -or ($TestResult.Status -eq "Autorisé" -and $UrlObj.expected_action -eq "allow")) } - $StatusColor = If($testResult.IsCorrect) { "Green" } Else { "Red" } + $StatusColor = If($TestResult.IsCorrect) { "Green" } Else { "Red" } Write-ColorOutput " → Résultat: $($TestResult.Status) | Attendu: $($TestResult.ExpectedAction) | Correct: $($TestResult.IsCorrect)" $statusColor - $categoryResults += $testResult - $allResults += $testResult + $CategoryResults += $TestResult + $AllResults += $TestResult } - $CategoryScore = Calculate-CategoryScore -Results $categoryResults - $CategoryGrade = Convert-ScoreToGrade -Score $categoryScore + $CategoryScore = Calculate-CategoryScore -Results $CategoryResults + $CategoryGrade = Convert-ScoreToGrade -Score $CategoryScore - Write-ColorOutput "Score de la catégorie '$($Category.nom)': $categoryScore% (Note: $CategoryGrade)" "Magenta" + Write-ColorOutput "Score de la catégorie '$($Category.nom)': $CategoryScore% (Note: $CategoryGrade)" "Magenta" } - Write-Progress -Activity "Test des catégories" -Completed - Write-Progress -Activity "Test des URLs" -Completed + Write-Progress -Id 1 -Activity "Test des catégories" -Completed + Write-Progress -Id 2 -Activity "Test des URLs" -Completed - return $allResults + return $AllResults } -## Function Show-ProgressBar +## Function Show-ProgressBar : affiche une barre de progression Function Show-ProgressBar { Param( [int]$Current, [int]$Total, + [int]$Id, [string]$Activity, [string]$Status = "" ) $Percent = [math]::Round(($Current / $Total) * 100, 1) - Write-Progress -Activity $Activity -Status "$Status ($Current/$Total)" -PercentComplete $Percent + Write-Progress -Id $Id -Activity $Activity -Status "$Status ($Current/$Total)" -PercentComplete $Percent } -## FunctionCalculate-CategoryScore +## FunctionCalculate-CategoryScore : calcule le score d'une catégorie Function Calculate-CategoryScore { Param( [array]$Results @@ -180,7 +181,7 @@ Function Calculate-CategoryScore { $TotalUrls = $Results.Count $CorrectResults = 0 - Foreach ($Result in $Results) { + Foreach($Result in $Results) { $IsBlocked = $Result.Status -eq "Bloqué" $ShouldBeBlocked = $result.ExpectedAction -eq "block" @@ -196,7 +197,7 @@ Function Calculate-CategoryScore { Return [math]::Round(($CorrectResults / $TotalUrls) * 100, 2) } -## Function Convert-ScoreToGrade +## Function Convert-ScoreToGrade : convertit un score en une note Function Convert-ScoreToGrade { Param([double]$Score) @@ -216,7 +217,7 @@ Function Convert-ScoreToGrade { } } -## Function Get-UrlStatus +## Function Get-UrlStatus : teste une URL et détermine si elle est bloquée ou autorisée Function Get-UrlStatus { Param( [string]$Url, @@ -249,10 +250,10 @@ Function Get-UrlStatus { $Response = $Null # Ajout des paramètres du proxy s'ils sont fournis - If (-not [string]::IsNullOrEmpty($ProxyAddress)) { + If(-not [string]::IsNullOrEmpty($ProxyAddress)) { $IWRParams.Add('Proxy', $ProxyAddress) - If ($ProxyUseAuthentication) { + If($ProxyUseAuthentication) { # Demande les identifiants de manière sécurisée et les ajoute à la commande $Creds = Get-Credential -Message "Veuillez saisir les identifiants pour le proxy $ProxyAddress" $IWRParams.Add('ProxyCredential', $Creds) @@ -260,48 +261,41 @@ Function Get-UrlStatus { } # -- Exécution du test -- - Try { + Try{ # Exécution de la requête en utilisant les paramètres définis dans la hashtable $Response = Invoke-WebRequest @IWRParams # On vérifie si la réponse contient des mots-clés de la page de blocage $KeywordFound = $False - Foreach ($Keyword in $BlockPageKeywords) { - If ($Response.Content -match $Keyword) { + Foreach($Keyword in $BlockPageKeywords) { + If($Response.Content -match $Keyword) { $KeywordFound = $True break } } - If ($KeywordFound) { + If($KeywordFound) { $Result.ActualResult = "Bloqué" -# $Result.Score = 1 $Result.Details = "Page de blocage détectée." $Result.StatusCode = $Response.StatusCode } Else { $Result.ActualResult = "Autorisé" -# $Result.Score = 0 $Result.Details = "Le site a été atteint sans blocage." $Result.StatusCode = $Response.StatusCode } } Catch [System.Net.WebException] { - If ($_.Exception.Status -eq 'Timeout') { + If($_.Exception.Status -eq 'Timeout') { $Result.ActualResult = "Bloqué (Timeout)" -# $Result.Score = 1 + $Result.Details = "La requête a expiré, indiquant un blocage probable par le pare-feu ou le proxy." $Result.StatusCode = $Response.StatusCode $Result.ResponseTime = "$Timeout" } -# Elseif ($_.Exception.Response) { -# $Result.Status = "Bloqué (Erreur HTTP)" -# $Result.Score = 1 -# $Result.Details = "Réponse HTTP non-200 reçue : $($_.Exception.Response.StatusCode)" -# } Else { # On considère les autres erreurs réseau comme un blocage aussi $Result.ActualResult = "Erreur de Connexion" @@ -313,15 +307,12 @@ Function Get-UrlStatus { $Result.ActualResult = "Erreur Script" $Result.Details = "Erreur inattendue: $($_.Exception.Message)" - #$Result.StatusCode = 0 <= A trouver - #$Result.ResponseTime = 0 <= A trouver - # Un test en erreur ne doit pas donner de point return $result } # Le test est réussi si l'action attendue correspond au résultat réel. - If (($Result.Expected -eq 'block' -and $Result.ActualResult -eq 'Bloqué') -or ($Result.Expected -eq 'allow' -and $Result.ActualResult -eq 'Autorisé')) { + If(($Result.Expected -eq 'block' -and $Result.ActualResult -eq 'Bloqué') -or ($Result.Expected -eq 'allow' -and $Result.ActualResult -eq 'Autorisé')) { $Result.TestStatus = "Conforme" $Result.Score = 1 # Le test est un succès ! $Result.Details += " (Résultat conforme à l'attendu)" @@ -335,7 +326,7 @@ Function Get-UrlStatus { Return $Result } -## Function Generate-HtmlReport +## Function Generate-HtmlReport : génère le rapport HTML Function Generate-HtmlReport { Param( [array]$Results, @@ -348,7 +339,7 @@ Function Generate-HtmlReport { $Categories = $Results | Group-Object Category $CategoryScores = @() - Foreach ($Cat in $Categories) { + Foreach($Cat in $Categories) { $Score = Calculate-CategoryScore -Results $Cat.Group $Grade = Convert-ScoreToGrade -Score $Score @@ -366,7 +357,7 @@ Function Generate-HtmlReport { # Score global $GlobalScore = Calculate-CategoryScore -Results $Results $GlobalGrade = Convert-ScoreToGrade -Score $GlobalScore - $GlobalColor = $GradeColors[$globalGrade] + $GlobalColor = $GradeColors[$GlobalGrade] # Génération du HTML $HtmlContent = @" @@ -478,8 +469,8 @@ Function Generate-HtmlReport { "@ # Ajout des lignes du tableau - Foreach ($CatScore in $CategoryScores) { - $htmlContent += @" + Foreach($CatScore in $CategoryScores) { + $HtmlContent += @" $($catScore.Category) $($catScore.Score)% @@ -502,17 +493,17 @@ Function Generate-HtmlReport { "@ # Ajout des catégories - $categoryIndex = 0 + $CategoryIndex = 0 - Foreach ($CatScore in $CategoryScores) { + Foreach($CatScore in $CategoryScores) { $CategoryIndex++ $HtmlContent += @"
-
-
$($catScore.Category)
- $($catScore.Grade) - $($catScore.Score)% +
+
$($CatScore.Category)
+ $($CatScore.Grade) - $($CatScore.Score)%
-
+
@@ -527,22 +518,22 @@ Function Generate-HtmlReport { "@ # Ajout des résultats de chaque URL - Foreach ($result in $catScore.Results) { - $rowClass = if ($result.IsCorrect) { "correct" } else { "incorrect" } - $correctText = if ($result.IsCorrect) { "✅ Oui" } else { "❌ Non" } + Foreach($Result in $CatScore.Results) { + $RowClass = if($Result.IsCorrect) { "correct" } else { "incorrect" } + $CorrectText = if($Result.IsCorrect) { "✅ Oui" } else { "❌ Non" } - $htmlContent += @" - - - - - - + $HtmlContent += @" + + + + + + "@ } - $htmlContent += @" + $HtmlContent += @"
$($result.Url.Substring(0, [Math]::Min(30, $result.Url.Length)))$(if($result.Url.Length -gt 30){"..."})$($result.Reputation)$($result.ExpectedAction)$($result.Status)$correctText
$($result.Url.Substring(0, [Math]::Min(30, $Result.Url.Length)))$(if($Result.Url.Length -gt 30){"..."})$($Result.Reputation)$($Result.ExpectedAction)$($Result.Status)$CorrectText
@@ -550,7 +541,7 @@ Function Generate-HtmlReport { "@ } - $htmlContent += @" + $HtmlContent += @"
@@ -576,19 +567,19 @@ Function Generate-HtmlReport { @{Grade='F'; Score='0-45%'; Interpretation='Très faible, action immédiate requise'; Color='#dc3545'} ) - Foreach ($gradeInfo in $gradingScale) { - $htmlContent += @" + Foreach($GradeInfo in $GradingScale) { + $HtmlContent += @"
-
$($gradeInfo.Grade)
+
$($GradeInfo.Grade)
- $($gradeInfo.Score)
- $($gradeInfo.Interpretation) + $($GradeInfo.Score)
+ $($GradeInfo.Interpretation)
"@ } - $htmlContent += @" + $HtmlContent += @"
@@ -598,11 +589,12 @@ Function Generate-HtmlReport { const content = document.getElementById(categoryId); const btn = document.getElementById('btn-' + categoryId); - if (content.classList.contains('active')) { + If(content.classList.contains('active')) { content.classList.remove('active'); btn.classList.remove('active'); content.style.display = 'none'; - } else { + } + Else { content.classList.add('active'); btn.classList.add('active'); content.style.display = 'block'; @@ -625,8 +617,8 @@ Function Generate-HtmlReport { "@ # Écriture du fichier HTML - Try { - $htmlContent | Out-File -FilePath $OutputPath -Encoding UTF8 + Try{ + $HtmlContent | Out-File -FilePath $OutputPath -Encoding UTF8 Write-ColorOutput "✓ Rapport généré: $OutputPath" "Green" } Catch { @@ -634,7 +626,7 @@ Function Generate-HtmlReport { } } -## Function Main +## Function Main : fonction principale Function Main { Write-ColorOutput @" ╔══════════════════════════════════════════════════════════════════════════════╗ @@ -651,7 +643,7 @@ Function Main { } # Chargement du fichier JSON - Try { + Try{ $JsonFile = Join-Path $PSScriptRoot "file-nrs.json" $Categories = Get-Content $JsonFile -Raw -Encoding UTF8 | ConvertFrom-Json @@ -668,11 +660,11 @@ Function Main { $ReportsDir = Join-Path $PSScriptRoot "Rapports" $OutputDir = Join-Path $ReportsDir $ReportDate - If (-not (Test-Path $ReportsDir)) { + If(-not (Test-Path $ReportsDir)) { New-Item -ItemType Directory -Path $ReportsDir -Force | Out-Null } - If (-not (Test-Path $OutputDir)) { + If(-not (Test-Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null } @@ -710,9 +702,9 @@ Function Main { Write-ColorOutput "`n Rapport disponible à: $ReportPath" "Cyan" # Ouverture automatique du rapport - If (Get-Command "Start-Process" -ErrorAction SilentlyContinue) { + If(Get-Command "Start-Process" -ErrorAction SilentlyContinue) { $OpenReport = Read-Host "`n Voulez-vous ouvrir le rapport maintenant? (O/N)" - If ($OpenReport -eq "O" -or $OpenReport -eq "o" -or $OpenReport -eq "Y" -or $OpenReport -eq "y") { + If($OpenReport -eq "O" -or $OpenReport -eq "o" -or $OpenReport -eq "Y" -or $OpenReport -eq "y") { Start-Process $ReportPath } } @@ -723,7 +715,7 @@ Function Main { Clear-Host # Exécution du script principal -Try { +Try{ Main } Catch {