Récemment, l’un de mes clients m’a posé la problématique suivante :
- Contexte :
- J’ai des utilisateurs qui :
- Sont synchronisés depuis ADDS vers AAD.
- La méthode d’authentification est PHS.
- Password writeback est activé.
- Ces utilisateurs utilisent uniquement des applications Cloud et ne se connectent jamais en utilisant une authentification ADDS.
- Password policy d’Azure AD n’est pas activée.
- J’ai des utilisateurs qui :
- Problématique :
- Ces utilisateurs ne changent jamais leur mot de passe car ils n’y sont jamais invités et ceux même si le mot de passe est expiré coté ADDS.
Sommaire
Explication
Ce comportement est somme toute normal lorsque l’on se penche sur le fonctionnement de ce type d’authentification (PHS).
En effet, lorsque de l’authentification via PHS est utilisée, Active Directory n’est jamais contactée (ce qui n’est pas le cas avec PTA ou ADFS). Azure AD réalise de manière autonome la vérification des informations de connexion et octroi ou non les tockens.
Les informations concernant la date d’expiration du mot de passe quant à elles, ne sont pas synchronisées depuis Active Directory vers Azure AD. De plus, par défaut, pour les comptes synchronisés, AAD force (même si une politique de mot de passe est définie sur AAD) la valeur de l’attribut “passwordneverexpire” à “true” afin de laisser la main à Active Directory sur la gestion des mots de passe.
Ce qui a pour conséquence la non-expiration (du point de vue Azure AD) du mot de passe lors de l’authentification Azure AD.
En concevant l’authentification PHS, trois étapes sont nécessaires afin de permettre à Azure AD de gérer le mot de passe des utilisateurs :
- Activer l’option “password writeback”, qui dans ce cas si est déjà activée.
- Activer la password policy d’Azure AD.
- Activer “EnforceCloudPasswordPolicyForPasswordSyncedUsers” sur les domaines concernés.
L’ensemble de cet article porte sur PHS. Il ne s’agit pas du choix technologique le plus pertinent pour répondre à cette problématique.
Dans ce type de situation, je vous recommande d’utiliser PTA.
Remédiation
Je ne traite pas l’activation de “Password writeback” dans cet article, cependant cette option est un prérequis au bon fonctionnement de cette solution.
Avant de lancer toute manipulation, il est important de porter une attention particulière sur le compte de liaison AADS à AAD. Ce compte est généralement matérialisé dans AAD sous la forme “Sync_%AADCServer%_XXXXX@domaine.onmicrosoft.com”. Ce compte ne doit pas être impacté par le changement d’une politique de mot de passe afin de ne pas interrompre la synchronisation AADC.
Prenez garde à ne pas impacter d’autres comptes tels que les breakglass ou vos comptes de services applicatifs.
Cette remédiation est livrée telle qu’elle sans analyse d’impact sur l’environnement cible. Avant toutes modifications de l’environnement de production, il convient de se documenter sur l’ensemble des actions réalisées et d’évaluer les impacts potentiels. Puis d’effectuer le déploiement sur un lot pilote avant de généraliser celui-ci.
Le fait d’activer “Password expiration policy” n’affectera pas immédiatement les utilisateurs synchronisés, mais uniquement les utilisateurs de type “cloud only”.
Pour que celle-ci soit prise en compte par les comptes synchronisés, il convient de passer l’option “PasswordNeverExpires” à “false”. Ce que nous allons voir plus bas.
Un petit export de la configuration des utilisateurs actuelle n’est pas de trop :
#Backup user cfg:
Get-AzureADUser -All $true | Select-Object UserprincipalName,@{
N="PasswordNeverExpires";E={$_.PasswordPolicies -contains "DisablePasswordExpiration"}
} | ConvertTo-Csv -NoTypeInformation | Out-File $env:userprofile\Desktop\ReportPasswordNeverExpires.csv
Encore une fois, pour les comptes “breakglass” et “adsync” à minima, il est important de forcer la désactivation de l’expiration du mot de passe.
Dans ce cas si, j’ai préféré dans un premier temps désactiver l’expiration du mot de passe sur l’ensemble des comptes. Ceux-ci afin de conserver la maitrise sur la migration ultérieure des utilisateurs :
#Set user cfg --> pwd never expire:
Get-AzureADUser -All $true | Set-AzureADUser -PasswordPolicies DisablePasswordExpiration
Activer "Password expiration policy"
Il convient d’aligner la politique d’expiration des mots de passe avec celle d’ADDS (ici 180 jours).
Pour activer et configurer la politique d’expiration des mots de passe, se rendre dans le centre d’administration M365 :
Puis, Settings –> Org settings –> Security & orivacy –> Password expiration policy.
Décocher l’option “Set passwords to never expire (recommended)”.
#List all policy:
Get-MsolDomain | foreach{Get-MsolPasswordPolicy -DomainName $_.Name}
Désormais, les comptes dont l’attribut “PasswordNeverExpires” est à “false” devront modifier leurs mots de passe tous les 180 jours.
Ce qui ne concerne (au vu des configurations précédemment réalisées) pas mes utilisateurs “Cloud Only” déjà présents, ni les comptes synchronisés.
Activer "EnforceCloudPasswordPolicyForPasswordSyncedUsers"
Maintenant, nous allons forcer l’application de la politique de mot de passe AAD sur les comptes synchronisés, à l’aide de la commande ci-dessous.
Cette fonctionnalité n’affectera pas les utilisateurs déjà présents (déjà synchronisés), uniquement les nouveaux utilisateurs.
En temps normal, les utilisateurs présents basculeront automatiquement dans cette nouvelle configuration lors du prochain changement de leur mot de passe.
#Enforce AAD PWD Pol on sync accounts:
Set-MsolDirSyncFeature -Feature EnforceCloudPasswordPolicyForPasswordSyncedUsers
À ce stade-ci, tous les nouveaux utilisateurs synchronisés depuis ADDS utiliseront (point de vue Azure AD) la politique de mot de passe Azure. Donc dans la configuration attendue.
Next step, le rattrapage des comptes déjà synchronisés. Car ceux-ci ont eu l’option “DisablePasswordExpiration” forcée lors d’une précédente étape et de plus ne verront jamais de manière naturelle un changement de mot de passe (problématique de base).
Rien de compliqué, une bascule par lot afin d’éviter les mauvaises surprises tout en apportant une attention particulière aux comptes “de service”, “breakglass”, “dirsync”, … qui eux ne doivent pas basculer.
Bascule réalisée à l’aide de la commande :
#Set user cfg --> enable password policy:
Get-AzureADUser (-All $true ou liste d’utilisateurs) | Set-AzureADUser -PasswordPolicies None
Voilà, vos utilisateurs synchronisés bénéfissient de la politique de mot de passe AAD.
Cependant, il convient de préférer PTA comme méthode d’authentification pour répondre à cette problématique. Ou pourquoi pas, basculer vos utilisateurs en cloud only.
Liens annexes
- https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-password-hash-synchronization#password-expiration-policy
- https://learn.microsoft.com/en-us/microsoft-365/admin/add-users/set-password-to-never-expire?view=o365-worldwide
- https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-password-hash-synchronization