Update cybersecurity/Network Reputation Service/script-nrs.ps1

This commit is contained in:
2025-09-03 21:14:31 +02:00
parent 13631c40d6
commit 376236c203

View File

@@ -1,7 +1,7 @@
# Script d'Audit Firewall - Network Reputation Service # Script d'Audit Firewall - Network Reputation Service
# Auteur: Hubert Cornet # Auteur: Hubert Cornet
# Date: 03/09/2025 # Date: 03/09/2025
# Version: 1.1 # Version: 1.2
Clear-Host Clear-Host
@@ -27,7 +27,7 @@ $GradeColors = @{
### Functions ### ### Functions ###
## Function Write-ColorOutput ## Function Write-ColorOutput : pour afficher du texte en couleur
Function Write-ColorOutput { Function Write-ColorOutput {
Param( Param(
[string]$Text, [string]$Text,
@@ -42,7 +42,7 @@ Function Write-ColorOutput {
} }
} }
## Function Prerequisites ## Function Prerequisites : vérifie les prérequis
Function Prerequisites { Function Prerequisites {
Write-ColorOutput "`n === Vérification des prérequis ===" "Cyan" Write-ColorOutput "`n === Vérification des prérequis ===" "Cyan"
@@ -52,7 +52,7 @@ Function Prerequisites {
If(-not (Test-Path $JsonFile)) { If(-not (Test-Path $JsonFile)) {
Write-ColorOutput "ERREUR: Le fichier 'file-nrs.json' n'existe pas!" "Red" 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 "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" Write-ColorOutput "Le fichier doit être placé dans le même dossier que ce script." "Yellow"
Return $false Return $false
@@ -85,10 +85,10 @@ Function Prerequisites {
Import-Module $Module -Force Import-Module $Module -Force
} }
return $true Return $True
} }
## Function Check-Categories ## Function Check-Categories : pour tester les catégories et URLs
Function Check-Categories { Function Check-Categories {
Param( Param(
[array]$Categories, [array]$Categories,
@@ -105,10 +105,10 @@ Function Check-Categories {
Foreach($Category in $Categories.Categorie) { Foreach($Category in $Categories.Categorie) {
$CategoryCount++ $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 "`n === Test de la catégorie: $($Category.nom) ===" "Cyan"
#Write-ColorOutput "Description: $($category.description)" "Gray" #Write-ColorOutput "`nDescription: $($Category.description)" "Gray"
$CategoryResults = @() $CategoryResults = @()
$UrlCount = 0 $UrlCount = 0
@@ -116,7 +116,7 @@ Function Check-Categories {
Foreach($UrlObj in $Category.urls) { Foreach($UrlObj in $Category.urls) {
$UrlCount++ $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" 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")) 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 Write-ColorOutput " → Résultat: $($TestResult.Status) | Attendu: $($TestResult.ExpectedAction) | Correct: $($TestResult.IsCorrect)" $statusColor
$categoryResults += $testResult $CategoryResults += $TestResult
$allResults += $testResult $AllResults += $TestResult
} }
$CategoryScore = Calculate-CategoryScore -Results $categoryResults $CategoryScore = Calculate-CategoryScore -Results $CategoryResults
$CategoryGrade = Convert-ScoreToGrade -Score $categoryScore $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 -Id 1 -Activity "Test des catégories" -Completed
Write-Progress -Activity "Test des URLs" -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 { Function Show-ProgressBar {
Param( Param(
[int]$Current, [int]$Current,
[int]$Total, [int]$Total,
[int]$Id,
[string]$Activity, [string]$Activity,
[string]$Status = "" [string]$Status = ""
) )
$Percent = [math]::Round(($Current / $Total) * 100, 1) $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 { Function Calculate-CategoryScore {
Param( Param(
[array]$Results [array]$Results
@@ -196,7 +197,7 @@ Function Calculate-CategoryScore {
Return [math]::Round(($CorrectResults / $TotalUrls) * 100, 2) Return [math]::Round(($CorrectResults / $TotalUrls) * 100, 2)
} }
## Function Convert-ScoreToGrade ## Function Convert-ScoreToGrade : convertit un score en une note
Function Convert-ScoreToGrade { Function Convert-ScoreToGrade {
Param([double]$Score) 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 { Function Get-UrlStatus {
Param( Param(
[string]$Url, [string]$Url,
@@ -277,13 +278,11 @@ Function Get-UrlStatus {
If($KeywordFound) { If($KeywordFound) {
$Result.ActualResult = "Bloqué" $Result.ActualResult = "Bloqué"
# $Result.Score = 1
$Result.Details = "Page de blocage détectée." $Result.Details = "Page de blocage détectée."
$Result.StatusCode = $Response.StatusCode $Result.StatusCode = $Response.StatusCode
} }
Else { Else {
$Result.ActualResult = "Autorisé" $Result.ActualResult = "Autorisé"
# $Result.Score = 0
$Result.Details = "Le site a été atteint sans blocage." $Result.Details = "Le site a été atteint sans blocage."
$Result.StatusCode = $Response.StatusCode $Result.StatusCode = $Response.StatusCode
} }
@@ -292,16 +291,11 @@ Function Get-UrlStatus {
Catch [System.Net.WebException] { Catch [System.Net.WebException] {
If($_.Exception.Status -eq 'Timeout') { If($_.Exception.Status -eq 'Timeout') {
$Result.ActualResult = "Bloqué (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.Details = "La requête a expiré, indiquant un blocage probable par le pare-feu ou le proxy."
$Result.StatusCode = $Response.StatusCode $Result.StatusCode = $Response.StatusCode
$Result.ResponseTime = "$Timeout" $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 { Else {
# On considère les autres erreurs réseau comme un blocage aussi # On considère les autres erreurs réseau comme un blocage aussi
$Result.ActualResult = "Erreur de Connexion" $Result.ActualResult = "Erreur de Connexion"
@@ -313,9 +307,6 @@ Function Get-UrlStatus {
$Result.ActualResult = "Erreur Script" $Result.ActualResult = "Erreur Script"
$Result.Details = "Erreur inattendue: $($_.Exception.Message)" $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 # Un test en erreur ne doit pas donner de point
return $result return $result
} }
@@ -335,7 +326,7 @@ Function Get-UrlStatus {
Return $Result Return $Result
} }
## Function Generate-HtmlReport ## Function Generate-HtmlReport : génère le rapport HTML
Function Generate-HtmlReport { Function Generate-HtmlReport {
Param( Param(
[array]$Results, [array]$Results,
@@ -366,7 +357,7 @@ Function Generate-HtmlReport {
# Score global # Score global
$GlobalScore = Calculate-CategoryScore -Results $Results $GlobalScore = Calculate-CategoryScore -Results $Results
$GlobalGrade = Convert-ScoreToGrade -Score $GlobalScore $GlobalGrade = Convert-ScoreToGrade -Score $GlobalScore
$GlobalColor = $GradeColors[$globalGrade] $GlobalColor = $GradeColors[$GlobalGrade]
# Génération du HTML # Génération du HTML
$HtmlContent = @" $HtmlContent = @"
@@ -479,7 +470,7 @@ Function Generate-HtmlReport {
# Ajout des lignes du tableau # Ajout des lignes du tableau
Foreach($CatScore in $CategoryScores) { Foreach($CatScore in $CategoryScores) {
$htmlContent += @" $HtmlContent += @"
<tr> <tr>
<td><strong>$($catScore.Category)</strong></td> <td><strong>$($catScore.Category)</strong></td>
<td>$($catScore.Score)%</td> <td>$($catScore.Score)%</td>
@@ -502,17 +493,17 @@ Function Generate-HtmlReport {
"@ "@
# Ajout des catégories # Ajout des catégories
$categoryIndex = 0 $CategoryIndex = 0
Foreach($CatScore in $CategoryScores) { Foreach($CatScore in $CategoryScores) {
$CategoryIndex++ $CategoryIndex++
$HtmlContent += @" $HtmlContent += @"
<div class="category-item"> <div class="category-item">
<div class="category-header" onclick="toggleCategory('cat-$categoryIndex')"> <div class="category-header" onclick="toggleCategory('cat-$CategoryIndex')">
<div class="category-title">$($catScore.Category) <span class="toggle-btn" id="btn-cat-$categoryIndex"></span></div> <div class="category-title">$($CatScore.Category) <span class="toggle-btn" id="btn-cat-$CategoryIndex"></span></div>
<span class="category-score" style="background-color: $($catScore.Color);">$($catScore.Grade) - $($catScore.Score)%</span> <span class="category-score" style="background-color: $($CatScore.Color);">$($CatScore.Grade) - $($CatScore.Score)%</span>
</div> </div>
<div class="category-content" id="cat-$categoryIndex"> <div class="category-content" id="cat-$CategoryIndex">
<table class="detail-table"> <table class="detail-table">
<thead> <thead>
<tr> <tr>
@@ -527,22 +518,22 @@ Function Generate-HtmlReport {
"@ "@
# Ajout des résultats de chaque URL # Ajout des résultats de chaque URL
Foreach ($result in $catScore.Results) { Foreach($Result in $CatScore.Results) {
$rowClass = if ($result.IsCorrect) { "correct" } else { "incorrect" } $RowClass = if($Result.IsCorrect) { "correct" } else { "incorrect" }
$correctText = if ($result.IsCorrect) { "✅ Oui" } else { "❌ Non" } $CorrectText = if($Result.IsCorrect) { "✅ Oui" } else { "❌ Non" }
$htmlContent += @" $HtmlContent += @"
<tr class="$rowClass"> <tr class="$RowClass">
<td title="$($result.Url)">$($result.Url.Substring(0, [Math]::Min(30, $result.Url.Length)))$(if($result.Url.Length -gt 30){"..."})</td> <td title="$($Result.Url)">$($result.Url.Substring(0, [Math]::Min(30, $Result.Url.Length)))$(if($Result.Url.Length -gt 30){"..."})</td>
<td>$($result.Reputation)</td> <td>$($Result.Reputation)</td>
<td>$($result.ExpectedAction)</td> <td>$($Result.ExpectedAction)</td>
<td>$($result.Status)</td> <td>$($Result.Status)</td>
<td>$correctText</td> <td>$CorrectText</td>
</tr> </tr>
"@ "@
} }
$htmlContent += @" $HtmlContent += @"
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -550,7 +541,7 @@ Function Generate-HtmlReport {
"@ "@
} }
$htmlContent += @" $HtmlContent += @"
</div> </div>
</div> </div>
@@ -576,19 +567,19 @@ Function Generate-HtmlReport {
@{Grade='F'; Score='0-45%'; Interpretation='Très faible, action immédiate requise'; Color='#dc3545'} @{Grade='F'; Score='0-45%'; Interpretation='Très faible, action immédiate requise'; Color='#dc3545'}
) )
Foreach ($gradeInfo in $gradingScale) { Foreach($GradeInfo in $GradingScale) {
$htmlContent += @" $HtmlContent += @"
<div class="grade-item"> <div class="grade-item">
<div class="grade-badge" style="background-color: $($gradeInfo.Color);">$($gradeInfo.Grade)</div> <div class="grade-badge" style="background-color: $($GradeInfo.Color);">$($GradeInfo.Grade)</div>
<div> <div>
<strong>$($gradeInfo.Score)</strong><br> <strong>$($GradeInfo.Score)</strong><br>
<span style="color: #666;">$($gradeInfo.Interpretation)</span> <span style="color: #666;">$($GradeInfo.Interpretation)</span>
</div> </div>
</div> </div>
"@ "@
} }
$htmlContent += @" $HtmlContent += @"
</div> </div>
</div> </div>
</div> </div>
@@ -598,11 +589,12 @@ Function Generate-HtmlReport {
const content = document.getElementById(categoryId); const content = document.getElementById(categoryId);
const btn = document.getElementById('btn-' + categoryId); const btn = document.getElementById('btn-' + categoryId);
if (content.classList.contains('active')) { If(content.classList.contains('active')) {
content.classList.remove('active'); content.classList.remove('active');
btn.classList.remove('active'); btn.classList.remove('active');
content.style.display = 'none'; content.style.display = 'none';
} else { }
Else {
content.classList.add('active'); content.classList.add('active');
btn.classList.add('active'); btn.classList.add('active');
content.style.display = 'block'; content.style.display = 'block';
@@ -626,7 +618,7 @@ Function Generate-HtmlReport {
# Écriture du fichier HTML # Écriture du fichier HTML
Try{ Try{
$htmlContent | Out-File -FilePath $OutputPath -Encoding UTF8 $HtmlContent | Out-File -FilePath $OutputPath -Encoding UTF8
Write-ColorOutput "✓ Rapport généré: $OutputPath" "Green" Write-ColorOutput "✓ Rapport généré: $OutputPath" "Green"
} }
Catch { Catch {
@@ -634,7 +626,7 @@ Function Generate-HtmlReport {
} }
} }
## Function Main ## Function Main : fonction principale
Function Main { Function Main {
Write-ColorOutput @" Write-ColorOutput @"