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
Voir la solutionMasquer la solution
É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-AuthenticodeSignatureavant 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.