Comment gérer Active Directory Certificates Services avec PowerShell ?

Salut à tous

Synthèse du besoin
Gérer une autorité de certification Microsoft hébergé sur un serveur Windows 2008 R2 Enterprise SP1 avec PowerShell. Le but est de :
1. Exporter automatiquement tout nouveau certificat émis au format PFX via la fonctionnalité d’agent de récupération / archivage de clés privées.
2. Générer un rapport avec la liste des certificats révoqués.
3. Générer un rapport avec la liste des certificats qui vont expirés.

A savoir
Il n’existe pas de module PowerShell fournis par Microsoft pour gérer Active Directory Certificates Services avec Windows 2008 R2 (contrairement à Windows 2012).
En faisant quelques recherches sur Internet, j’ai découvert le module PowerShell PSPKI. Ce dernier est vraiment très bien fait.

Solution
Nous allons nous appuyer sur les fonctionnalités de l’audit et le module PowerShell PSPKI pour répondre aux besoins.

Etape 1 : activation de l’audit au niveau de la PKI et des GPO
Il faut activer l’audit comme expliqué dans l’article Microsoft ci-dessous :
http://technet.microsoft.com/fr-fr/library/cc772451.aspx

Etape 2 : installation du module PSPKI
Installer le module PSPKI disponible sur le serveur Active Directory Certificates Services ou sur votre serveur d’administration.
http://poweradmin.se/blog/2011/08/09/adcs-certificate-expiration-report-tool/
http://pspki.codeplex.com/

Etape 3 : autoriser l’exécution des scripts PowerShell non signés
Entrer la commande PowerShell ci dessous :
Set-ExecutionPolicy Unrestricted
Une solution alternative est de signer vos scripts (plus sécurisés).

Etape 4 : activer l’archivage des clés privées au niveau de l’autorité de certification
L’autorité de certification doit être configurée pour déployer le modèle de certificat Agent de récupération des clés privées. Le modèle par défaut a été modifiée afin de ne pas demander d’approbation à la génération du certificat. Seuls les membres du groupe Admins du domaine peuvent effectuer une demande pour ce modèle de certificats.
Un compte utilisateur AdminPKI a été créé. Ce compte a été défini en tant que membre du groupe Admins du domaine. Le mot de passe de ce compte a été défini pour ne jamais expirer. Un certificat basé sur le modèle Key Recovery Agent a été généré pour ce compte.
L’autorité de certification a ensuite été configurée pour archiver les clés privées avec ce certificat (au niveau des propriétés de l’autorité de certification). Une procédure pas à pas est fournis par Microsoft à ces emplacements :
http://technet.microsoft.com/en-us/library/cc753011.aspx
http://technet.microsoft.com/en-us/library/cc730721.aspx
http://technet.microsoft.com/en-us/library/cc770588.aspx

Etape 5 : Associer un script à l’événement d’audit correspondant à la génération d’un certificat
Le script ci dessous permet de générer un fichier PFX du dernier certificat émis par l’autorité de certification via la fonctionnalité d’archivage des clés privées.
Copier pour cela le script ci-dessous dans le fichier c:\script.ps1.
# Importation du module PSPKI
Import-Module PSPKI
# Liste tous les certificats émis
$base = Get-CertificationAuthority -Name TPNAT | Get-IssuedRequest | Select-Object SerialNumber
# Retrouve le numéro de séries du derniers certificats émis
$SerialNumber = $($base[$($base.count)-1]).SerialNumber
$tmpfile = “c:\$SerialNumber.tmp”
# Exportation du certificat au format PFX vers c:\valeur-numero-serie.pfx.
Certutil -getkey $SerialNumber $tmpfile
$pfx = “c:\$SerialNumber.pfx”
Certutil -p P@ssword -recoverkey $tmpfile $pfx

Quand un nouveau certificat est généré, l’événement suivant est généré (car on a activé l’audit).
Log Name:      Security
Source:        Microsoft-Windows-Security-Auditing
Date:          02/09/2013 16:49:03
Event ID:      4887
Task Category: Certification Services
Level:         Information
Keywords:      Audit Success
User:          N/A
Computer:      WIN-M4TUIL6MDL0.tpnat.intra
Description:
Certificate Services approved a certificate request and issued a certificate. 
Request ID: 50
Requester: TPNAT\Administrator
Attributes: 
cdc:WIN-M4TUIL6MDL0.tpnat.intra
rmd:WIN-M4TUIL6MDL0.tpnat.intra
ccm:WIN-M4TUIL6MDL0.tpnat.intra
Disposition: 3
SKI:  da 47 3a c8 b9 73 f4 86 83 03 34 9a 15 1a a8 cc 8c 10 be f1
Subject: E=Administrator@tpnat.intra, CN=Administrator, CN=Users, DC=tpnat, DC=intra

On va donc associer le script ci-dessous à cet événement. Sélectionner l’événement dans le journal et cliquer dans le menu action sur associer une tâche.
Entrer c:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -file c:\script.ps1.
A cette étape, on vient de remplir le premier objectif.

Etape 6 : générer un rapport avec la liste des certificats révoqués
La solution ci-dessous s’appuie sur le module PowerShell PSPKI.
Créer le fichier c:\certificats-revoques.ps1 et copier le contenu suivant dans ce fichier.
Import-Module PSPKI
Get-CertificationAuthority -Name TPNAT | Get-RevokedRequest | Select-Object Request.RequestID,CommonName, SerialNumber, Request.RevokedReason | Export-Csv –Path c:\revoque.csv -Encoding UTF8 –UseCulture
On obtient un fichier CSV c:\revoque.csv en résultat. il faut supprimer la première ligne (en tête PowerShell).
A cette étape, on vient  de remplir le second objectif.
 
Etape 7 : générer un rapport avec la liste des certificats qui vont expirés
On s’appuie toujours sur le module PowerShell PSPKI.
Créer le fichier c:\rapport.ps1 et copier le contenu du script ci-dessous :
param(
  [string] $computername = “$ENV:COMPUTERNAME”,
  [string] $reportfile = “$ENV:USERPROFILE\Desktop\PKIRAPPORT.html”
   )
# Variables
$caname = $computername.ToLower()
$domaindns = $ENV:USERDNSDOMAIN.ToLower()
$todaysdate = Get-Date
$findaldate = $todaysdate.AddMonths(36)

# Vérifie que PSPKI est installé.
if(Get-Module -ListAvailable -Name PSPKI | Where-Object { $_.name -eq “PSPKI” })

  # Vérifie que PSPKI est chargé
  if (!(Get-Module -Name PSPKI | Where-Object { $_.name -eq “PSPKI” })) 
  {
    Write-Host “Importation du module PSPKI” -ForegroundColor “Yellow”
    Import-Module -Name PSPKI
  }
  # Génère le rapport
  $htmlpre = “<P>Generated by user: $ENV:USERNAME</P><P>Les certificats vont suivant expirés avant $findaldate</P>”
  $htmlpost = “<P>Certificate expiration information retrived from $caname.$domaindns</P>”
  $htmltitle = “Autorité de certification : $caname.$domaindns”
  $htmlinput = Get-CertificationAuthority “$caname.$domaindns” | Get-IssuedRequest -Filter “NotAfter -ge $(Get-Date)”, “NotAfter -le $findaldate”
  $htmlinput | ConvertTo-Html -Body (Get-Date) “Report date:” -Property RequestID,RequesterName,CommonName,NotBefore,NotAfter,SerialNumber -Pre $htmlpre -Post $htmlpost -Title $htmltitle | Out-File -FilePath $reportfile
  # Chargement du rapport
  Invoke-Item $reportfile
  }
else
{
  Write-Host “PSPKI is not installed. Please install it from http://pspki.codeplex.com/ ” -ForegroundColor “Yellow” 
}
On vient de remplir le troisième objectifs.
Merci PowerShell / PSPKI.

A+
Guillaume MATHIEU
Consultant PROSERVIA
La connaissance s’accroît quand on la partage.
http://msreport.free.fr

A propos Guillaume Mathieu

Directeur Technique chez Flexsi
Ce contenu a été publié dans Annuaire, Certificats, PowerShell, Sécurité, Scripts, Windows Server 2008 R2. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire