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 += @"
$($result.Url.Substring(0, [Math]::Min(30, $result.Url.Length)))$(if($result.Url.Length -gt 30){"..."}) | -$($result.Reputation) | -$($result.ExpectedAction) | -$($result.Status) | -$correctText | + $HtmlContent += @" +
$($result.Url.Substring(0, [Math]::Min(30, $Result.Url.Length)))$(if($Result.Url.Length -gt 30){"..."}) | +$($Result.Reputation) | +$($Result.ExpectedAction) | +$($Result.Status) | +$CorrectText |