Files
Infra-LAB/projects/MDT/Scripts/SupportHDF/ps1/Init-KeyAndPwd.ps1
T

129 lines
4.7 KiB
PowerShell

<#
.SYNOPSIS
Initialise key.bin (clé symétrique) et pwd.sec (mot de passe chiffré) dans un dossier cible.
.DESCRIPTION
Script à exécuter sur une machine sécurisée pour préparer une clé USB contenant:
- key.bin : clé symétrique AES-256 au format base64
- pwd.sec : mot de passe chiffré (ConvertFrom-SecureString -Key)
.PARAMETER OutDir
Dossier cible où écrire key.bin et pwd.sec. Défaut : dossier courant.
.PARAMETER UserName
(Optionnel) Nom d'utilisateur associé au mot de passe (sera affiché dans le message).
.PARAMETER Force
Écrase les fichiers existants si présent.
.EXAMPLE
.\Init-KeyAndPwd.ps1 -OutDir "E:\" -UserName "EDU\ajoutpc"
.NOTES
Exécuter sur une machine sécurisée. Conserver la clé (key.bin) en sécurité.
#>
param(
[string]$OutDir = (Get-Location).Path,
[string]$UserName = "EDU\ajoutpc",
[switch]$Force
)
function Write-Log {
param([string]$msg)
$ts = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss')
Write-Host "[$ts] $msg"
}
function Set-RestrictiveAcl {
param([string]$Path)
try {
if (-not (Test-Path -Path $Path)) { return }
$acl = Get-Acl -Path $Path
# Désactiver l'héritage et supprimer règles explicites (best-effort)
$acl.SetAccessRuleProtection($true, $false)
# Tentative de suppression des règles existantes (peut échouer sur certains supports)
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) }
$admin = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators")
$system = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM")
$ruleAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule($admin,"FullControl","None","Allow")
$ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule($system,"FullControl","None","Allow")
$acl.AddAccessRule($ruleAdmin)
$acl.AddAccessRule($ruleSystem)
Set-Acl -Path $Path -AclObject $acl -ErrorAction Stop
Write-Log "ACL restrictive appliquée à $Path"
} catch {
Write-Log "Impossible d'appliquer ACL restrictive sur $Path : $_"
}
}
try {
# Normalisation du dossier cible
$OutDir = (Resolve-Path -Path $OutDir).Path
} catch {
Write-Error "Dossier cible invalide : $OutDir"
exit 1
}
$keyFile = Join-Path -Path $OutDir -ChildPath "key.bin"
$pwdFile = Join-Path -Path $OutDir -ChildPath "pwd.sec"
# Vérifications
if ((Test-Path $keyFile -PathType Leaf -ErrorAction SilentlyContinue) -and -not $Force) {
Write-Error "Le fichier key.bin existe déjà dans $OutDir. Utilisez -Force pour écraser."
exit 1
}
if ((Test-Path $pwdFile -PathType Leaf -ErrorAction SilentlyContinue) -and -not $Force) {
Write-Error "Le fichier pwd.sec existe déjà dans $OutDir. Utilisez -Force pour écraser."
exit 1
}
# Génération de la clé (32 octets -> AES-256)
Write-Log "Génération de la clé symétrique (AES-256)..."
$rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$keyBytes = New-Object byte[] 32
$rng.GetBytes($keyBytes)
$keyB64 = [Convert]::ToBase64String($keyBytes)
# Écriture du fichier key.bin
try {
Set-Content -Path $keyFile -Value $keyB64 -Encoding ASCII -Force
Write-Log "Clé écrite dans : $keyFile"
Set-RestrictiveAcl -Path $keyFile
} catch {
Write-Error "Erreur lors de l'écriture de key.bin : $_"
exit 1
}
# Lecture du mot de passe (SecureString) et chiffrement
Write-Host ""
Write-Host "Saisir le mot de passe à chiffrer pour l'utilisateur : $UserName"
$securePass = Read-Host -AsSecureString "Mot de passe (ne s'affiche pas)"
if (-not $securePass) {
Write-Error "Mot de passe non fourni. Abandon."
exit 1
}
try {
# ConvertFrom-SecureString -Key attend un tableau d'octets
$encString = $securePass | ConvertFrom-SecureString -Key $keyBytes
Set-Content -Path $pwdFile -Value $encString -Encoding ASCII -Force
Write-Log "Mot de passe chiffré écrit dans : $pwdFile"
Set-RestrictiveAcl -Path $pwdFile
} catch {
Write-Error "Erreur lors du chiffrement / écriture du mot de passe : $_"
# Tenter de supprimer les fichiers générés pour laisser l'état propre
if (Test-Path $keyFile) { Remove-Item -Path $keyFile -Force -ErrorAction SilentlyContinue }
if (Test-Path $pwdFile) { Remove-Item -Path $pwdFile -Force -ErrorAction SilentlyContinue }
exit 1
}
Write-Host ""
Write-Log "Initialisation terminée."
Write-Host ""
Write-Host "IMPORTANT:"
Write-Host " - Déplacez key.bin et pwd.sec sur la clé USB (ou gardez-les ensemble sur la clé)."
Write-Host " - PROTÉGEZ la clé USB physiquement et restreignez l'accès au fichier."
Write-Host " - Pour tester : copiez les fichiers sur une machine cible et exécutez votre script de join en pointant vers ces fichiers."