Sophie clôt la section sécurité avec un ticket de synthèse : « Reprends le script de supervision qu’on a construit depuis la section 7. Je veux qu’il soit signé, qu’il ne contienne plus aucun secret en clair, et qu’il journalise tout ce qu’il fait. »
Objectif
Appliquer les trois piliers de la section 10 — signature (10.1), gestion des secrets (10.2) et logging (10.3) — à un seul et même script, en repartant de la version déjà construite en section 8 et 9.
Consignes
Étape 1 — Créez un certificat de signature de code auto-signé, et signez le script rapport-supervision.ps1 construit au TP N°4 de la section 8.
Indice : revoyez la leçon 10.1, New-SelfSignedCertificate puis Set-AuthenticodeSignature.
Étape 2 — Vérifiez que la signature est valide avec Get-AuthenticodeSignature.
Étape 3 — Installez SecretManagement et SecretStore, enregistrez un coffre, puis stockez-y la clé de l’API de ticketing utilisée en section 9 (ApiTicketingNordika) ainsi qu’un mot de passe fictif pour le compte de service svc-supervision.
Étape 4 — Modifiez le script pour qu’il récupère ces deux secrets depuis le coffre plutôt que depuis une variable en dur ou une variable d’environnement.
Étape 5 — Entourez l’ensemble du script d’un Start-Transcript/Stop-Transcript, avec un nom de fichier horodaté par jour, en -Append.
Étape 6 (bonus) — Ajoutez une vérification en tout début de script : si la signature du script lui-même n’est plus valide au moment de l’exécution, le script s’arrête immédiatement sans rien exécuter d’autre.
Solution commentée
Étapes 1 et 2 :
$certificat = New-SelfSignedCertificate -Subject "CN=Nordika Script Signing" `
-Type CodeSigningCert `
-CertStoreLocation "Cert:\CurrentUser\My"
Set-AuthenticodeSignature -FilePath "C:\Nordika\Scripts\rapport-supervision.ps1" -Certificate $certificat
Get-AuthenticodeSignature -FilePath "C:\Nordika\Scripts\rapport-supervision.ps1"
# Vérifier que Status = Valid
Étape 3 :
Install-Module -Name Microsoft.PowerShell.SecretManagement -Scope CurrentUser
Install-Module -Name Microsoft.PowerShell.SecretStore -Scope CurrentUser
Register-SecretVault -Name "NordikaVault" -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
Set-Secret -Name "ApiTicketingNordika" -Secret "a1b2c3d4-nordika-secret"
$credentialService = Get-Credential -UserName "NORDIKA\svc-supervision"
Set-Secret -Name "CompteServiceSupervision" -SecretValue $credentialService
Étapes 4, 5 et 6 — rapport-supervision.ps1 final :
# Étape 6 : vérification de la signature avant toute exécution
$signatureScript = Get-AuthenticodeSignature -FilePath $MyInvocation.MyCommand.Path
if ($signatureScript.Status -ne "Valid") {
throw "Signature du script invalide (statut : $($signatureScript.Status)). Exécution annulée."
}
# Étape 5 : logging
$logPath = "C:\Nordika\Logs\supervision-$(Get-Date -Format 'yyyyMMdd').txt"
Start-Transcript -Path $logPath -Append
try {
# Étape 4 : récupération des secrets depuis le coffre
$cleApi = Get-Secret -Name "ApiTicketingNordika" -AsPlainText
$credentialService = Get-Secret -Name "CompteServiceSupervision"
$serveurs = Get-Content -Path "C:\Nordika\Scripts\serveurs.txt"
$resultats = Invoke-Command -ComputerName $serveurs -Credential $credentialService -ScriptBlock {
$volume = Get-Volume -DriveLetter C
[PSCustomObject]@{
Serveur = $env:COMPUTERNAME
EspaceLibrePourcent = [math]::Round(($volume.SizeRemaining / $volume.Size) * 100, 1)
}
} -ErrorAction Stop
$resultats | Format-Table -AutoSize
Write-Output "Rapport généré avec succès pour $($resultats.Count) serveur(s)"
} catch {
Write-Warning "Échec du script de supervision : $($_.Exception.Message)"
} finally {
Stop-Transcript
}
Points clés à retenir :
$MyInvocation.MyCommand.Path (rencontré ici pour la première fois) renvoie le chemin du script en cours d’exécution lui-même — indispensable pour vérifier sa propre signature dynamiquement, sans coder le chemin en dur.- La vérification de signature (étape 6) se place avant même
Start-Transcript : si le script a été altéré, on ne veut pas qu’il exécute quoi que ce soit, pas même l’ouverture du journal. - Toute modification ultérieure du script, même mineure, invalidera sa signature — il faudra alors le re-signer avec
Set-AuthenticodeSignature avant tout redéploiement, un réflexe à intégrer dans le pipeline CI/CD vu en 8.3 et repris en 10.1.
Retour d’expérience terrain : ce script représente, dans sa forme finale, à peu près ce qu’on peut raisonnablement attendre d’un script d’administration système « prêt pour la production » en entreprise : signé, sans secret en clair, journalisé, avec gestion d’erreurs et compte de service dédié. Ce n’est évidemment pas le seul chemin possible, mais chacun de ces éléments répond à un incident réel qu’on finit tôt ou tard par rencontrer sans lui.