Guide de passage des certifications Microsoft
Comment préparer et obtenir une certification Microsoft, et quelle est la vraie valeur de celle-ci ?
Après de nombreuses tentatives échouées de prendre le sujet en main et de monter un lab, j’ai enfin trouvé une source simple et concise : How to implement Auth Policy and Silos : r/activedirectory
Déjà le terme de Authentication Policy et Authentication Policy Silos est un peu abstrait. On pourrait parler d’un pare-feu d’authentification (la partie policy) qui s’applique à un regroupement de machine (la partie silo). On définit donc des règles dans le pare-feu (qui peut se connecter, quelle est la durée de vie maximum d’un ticket Kerberos, est-ce que l’usage du NTLM est autorisé) que l’on appliquera ensuite à un ensemble d’ordinateurs.
Note : le silo est optionnel, et il est tout à faire possible de faire sans. Comme cet article vise à faire un tutoriel au plus simple, on va ignorer la configuration sans silo.
Si vous êtes familier du concept de tiering-model, vous comprendrez qu’on a simplement à ajouter nos utilisateurs du TIER 1 dans la policy et nos serveurs TIER 1 dans le silo pour empêcher n’importe quel compte en dehors du TIER 1 de s’y connecter.
Les avantages par rapport au tiering par GPO :
Les inconvénients par rapport au tiering par GPO :
Je n’ai pas encore eu le temps de tester la partie “Inconvénients”, donc je ne fais que relater des points qui m’ont été remontés par des collègues ou dans d’autres articles.
On va essayer de répliquer une configuration de tiering en utilisant exclusivement les AuthNPolicy & AuthNPolicySilo. Présentation des personnages principaux :
L’objectif va donc être de restreindre l’accès au serveur SRV01 uniquement aux utilisateurs du TIER 1. Si un compte TIER 0 (membre du groupe Domain Admins) tente de s’y connecter, la connexion sera refusée même si le compte TIER 0 a les droits nécessaires.
Le Kerberos Armoring est obligatoire pour l’utilisation des AuthNPolicy & AuthNPolicySilo (d’où la limite de compatibilité sur les systèmes d’exploitation). Pour activer les paramètres :
Plus d’informations sur le sujet ici : Authentification composée et revendications Active Directory Domain Services dans Services ADFS | Microsoft Learn (Étape 1 & 2 uniquement).
Création d’un groupe “Allowed to authenticate to T1” pour réunir tous les comptes qui auront l’autorisation de se connecter sur des serveurs du TIER 1 :
$splat = @{
Name = 'Allowed to authenticate to T1'
Path = 'OU=Groups,OU=T1,DC=corp,DC=contoso,DC=com'
Description = 'Members of this group are allowed to access to T1 computers through the authentication firewall'
GroupCategory = 'Security'
GroupScope = 'DomainLocal'
}
New-ADGroup @splat
Ajout de mon compte administrateur T1 dans le nouveau groupe :
Add-ADGroupMember 'Allowed to authenticate to T1' -Members 't1_lbouard'
Création des règles du pare-feu avec le moins de paramètres possibles :
$groupSid = (Get-ADGroup 'Allowed to authenticate to T1').SID.Value
$sddl = "O:SYG:SYD:(XA;OICI;CR;;;WD;(Member_of_any{SID($groupSID)}))"
$splat = @{
Name = 'T1 Authentication Policy'
Enforce = $true
ComputerAllowedToAuthenticateTo = $sddl
}
New-ADAuthenticationPolicy @splat
Les paramètres invoqués ont la fonction suivante :
-Name pour nommer l’objet “Authentication Policy”-Enforce pour indiquer que celle-ci doit être activée-ComputerAllowedToAuthenticateTo pour indiquer que seuls les membres du groupe Allowed to authenticate to T1 sont autorisés à se connecter (via le SDDL)Le SDDL peut être créé à partir de la commande Show-ADAuthenticationPolicyExpression. Plus d’informations sur la commande ici : Show-ADAuthenticationPolicyExpression (ActiveDirectory) | Microsoft Learn
Exemple de commande pour la création du SDDL en question :
$sddl = Show-ADAuthentificationPolicyExpression -AllowedToAuthenticateTo
Création du silo qui va être soumis au pare-feu d’authentification que l’on a créé précédemment :
$authNpolicy = Get-ADAuthenticationPolicy 'T1 Authentication Policy'
$splat = @{
Name = 'T1 Silo'
Enforce = $true
ComputerAuthenticationPolicy = $authNpolicy
ServiceAuthenticationPolicy = $authNpolicy
UserAuthenticationPolicy = $authNpolicy
}
New-ADAuthenticationPolicySilo @splat
Ici encore une fois on vise la configuration la plus simple possible : on applique les mêmes règles pour les authentifications d’ordinateurs, d’utilisateurs ou de comptes de service.
Ajouter le serveur SRV01 en tant que membre du silo :
$computerDn = (Get-ADComputer SRV01).DistinguishedName
Set-ADAuthenticationPolicySilo 'T1 Silo' -Add @{ 'msDS-AuthNPolicySiloMembers' = $computerDn }
Affecter le silo au serveur SRV01, ce qui permet d’exposer le serveur au pare-feu d’authentification :
Set-ADAccountAuthenticationPolicySilo 'SRV01$' -AuthenticationPolicySilo 'T1 Silo'
Pourquoi est-ce qu’il y a deux étapes ? J’en ai aucune foutue idée, mais les deux étapes sont nécessaires pour que le blocage soit effectif. Si le serveur n’est pas membre du silo (attribut
msDS-AuthNPolicySiloMembersBL), même si celui-ci est exposé au pare-feu d’authentification (attributmsDS-AssignedAuthNPolicySilo), le blocage des comptes non-autorisés n’est pas effectif.
À partir de maintenant, seul un membre du groupe Allowed to authenticate to T1 pourra s’authentifier sur l’ordinateur “SRV01”. Si un utilisateur ne faisant pas partie de ce groupe essaye de se connecter, il tombera sur l’erreur suivante :
The computer you are signing into is protected by an authentication firewall. The specified account is not allowed to authenticate to the computer.
D’après mes tests, le compte administrateur par défaut (avec le SID 500) n’est pas affecté par les AuthNPolicy. Il pourra donc servir de compte brise glace sur tous les ordinateurs du domaine (qu’importe le silo d’authentification).
Voici la commande pour retirer le serveur SRV01 du silo :
$computerDn = (Get-ADComputer SRV01).DistinguishedName
Set-ADAuthenticationPolicySilo 'T1 Silo' -Remove @{ 'msDS-AuthNPolicySiloMembers' = $computerDn }
Et la ligne supplémentaire pour ne plus exposer le serveur SRV01 du pare-feu d’authentification :
Set-ADComputer SRV01 -Clear 'msDS-AssignedAuthNPolicySilo'
Si l’ajout dans un silo se fait en deux étapes, deux étapes sont également nécessaires pour le retrait.
On va prendre l’exemple d’un ordinateur qui serait dans le silo TIER 1 & le silo TIER 2.
J’ai testé pour vous, et si mon hypothèse initiale était que le contrôleur de domaine allait bloquer les connexions pour les utilisateurs du TIER 1 & 2 : ce n’est pas le cas ! En fait l’attribut msDS-AssignedAuthNPolicySilo (celui qui permet d’exposer l’ordinateur au pare-feu d’authentification) ne peut contenir qu’une seule valeur.
Donc pour répondre à la question : un ordinateur peut être dans deux silos en même temps, mais seul celui indiqué dans l’attribut msDS-AssignedAuthNPolicySilo sera actif. On peut consulter celui qui prime avec la commande suivante :
Get-ADComputer SRV01 -Properties AuthenticationPolicySilo
Dans ses recommandations relatives à l’administration sécurisée des systèmes d’information reposant sur Microsoft Active Directory, l’ANSSI conseille le déploiement conjoint des AuthNPolicy et des GPO de restriction de connexion classiques (qui utilise les User Rights Assignment), sans détailler la raison d’un tel design. Et visiblement je ne suis pas le seul à ne pas savoir pourquoi :
Après avoir creusé un peu, je pense que la raison principale de déployer AuthNPolicy + GPO est pour réduire l’administration quotidienne. L’ajout systématique dans un silo pour les ordinateurs personnels me paraît peu crédible sur la durée, et la GPO sert de filet de sécurité pour appliquer une restriction de connexion dès qu’un objet ordinateur est déplacé dans une unité d’organisation du TIER (dans le cas d’un oubli).
Et comme le fonctionnement des deux méthodes est différent, elles restent complémentaires :
Pour plus d’informations sur les GPO de limitation de connexion, vous pouvez consulter mon article sur le sujet.
C’est cadeau, je n’ai pas pu le tester de manière extensive mais voici un bout de code qui permet d’ajouter automatiquement tous les serveurs TIER 1 dans le silo du TIER 1 :
$sb = 'OU=Servers,OU=T1,DC=corp,DC=contoso,DC=com'
$computers = Get-ADComputer -Filter * -SearchBase $sb -Properties 'msDS-AssignedAuthNPolicySilo'
$silo = Get-ADAuthenticationPolicySilo 'T1 Silo' -Properties 'msDS-AuthNPolicySiloMembers'
$computers | Where-Object { $_.'msDS-AssignedAuthNPolicySilo' -ne $silo.DistinguishedName } |
ForEach-Object {
Write-Host "Processing $($_.Name)"
Set-ADAuthenticationPolicySilo $silo -Add @{ 'msDS-AuthNPolicySiloMembers' = $_.DistinguishedName }
Set-ADAccountAuthenticationPolicySilo $_.SamAccountName -AuthenticationPolicySilo $silo
}
Et comme je suis très gentil, voici de quoi mettre en place les délégations de contrôle qui permettront d’exécuter le script avec un compte dédié (svc_authnpolicysilo) en utilisant le principe du moindre privilège.
Ajout du droit d’écriture de l’attribut msDS-AssignedAuthNPolicySilo sur les objets ordinateurs sous “OU=Servers,OU=T1,DC=corp,DC=contoso,DC=com” :
dsacls "OU=Servers,OU=T1,DC=corp,DC=contoso,DC=com" /G "CORP\svc_authnpolicysilo:WP;msDS-AssignedAuthNPolicySilo;computer" /I:S
Ajout du droit d’écriture de l’attribut msDS-AuthNPolicySiloMembers sur les objets silos sous “CN=AuthN Silos,CN=AuthN Policy Configuration,CN=Services,CN=Configuration,DC=corp,DC=contoso,DC=com” :
dsacls "CN=AuthN Silos,CN=AuthN Policy Configuration,CN=Services,CN=Configuration,DC=corp,DC=contoso,DC=com" /G "CORP\svc_authnpolicysilo:WP;msDS-AuthNPolicySiloMembers;msDS-AuthNPolicySilo" /I:S
Pour des raisons de simplicité je donne les droits directement sur le compte de service, mais la bonne pratique est de donner les droits sur des groupes dédiés, pour rendre les permissions explicites.
Comment préparer et obtenir une certification Microsoft, et quelle est la vraie valeur de celle-ci ?