129 lines
4.7 KiB
PowerShell
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."
|