Utilizzare AAD Connect per disabilitare gli account con password scadute on-premises
La probabilità di restare bloccati e di non poter portare a termine il proprio lavoro per aver dimenticato una password è proporzionale al numero di password diverse che è necessario ricordare. Più password si devono ricordare, maggiore sarà la probabilità di dimenticarne una. Le domande e le chiamate relative alla reimpostazione della password e ad altri problemi correlati impegnano la maggior parte delle risorse di supporto tecnico.
Vi è mai successo che voi o un vostro collega vi trovaste nella seguente situazione?
Password expiration policy
Se un utente si occupa della sincronizzazione delle password, saprà che la password dell’account cloud è impostata su Never Expire.
Potrete infatti continuare a loggarvi sui servizi cloud utilizzando una password sincronizzata che, nel vostro ambiente locale, è scaduta. La vostra password cloud si aggiorna automaticamente la volta successiva a quella in cui avete cambiato la password on-premises.
La sincronizzazione dell’hash delle password è una funzionalità usata per sincronizzare le password utente da un’istanza di Active Directory locale a un’istanza di Azure AD basata sul cloud.
Quando state utilizzando solo la sincronizzazione dell’hash delle password, il dettaglio “expired password” non è sincronizzato a AAD e gli utenti possono continuare a loggarsi.
Qui sotto trovate l’indicazione di una soluzione che può aiutarvi in scenari di questo tipo.
Richiede 4 passaggi principali:
1. Sincronizzate l’attributo msDS-User-Account-Control-Computed ad un attributo statico AD (lo chiamiamo attributo UserAccountControlValue) attraverso un task schedulato.
L’attributo che selezioniamo di default è msDS-CloudExtensionAttribute1 ma potete usarne uno qualsiasi non utilizzato.
2. Aggiornate il connettore AD per sincronizzare l’attributo che avete selezionato (se non si trova già negli attributi di default).
3. Create una regola di sincronizzazione AAD Connect per controllare la presenza del valore 8388608 nell’attributo di AD specificato per l’attributo UserAccountControlValue.
Se c’è, impostate accountEnabled sul valore FALSE e poi impostate l’attributo “info” su DisabledByExpiredPasswordSyncRule.
4. Create una regola di sincronizzazione per verificare il valore dell’attributo UserAccountControlValue come per il valore “info”.
Se lo UserAccountControlValue è impostato su un valore diverso da 8388608 (password scaduta) e l’attributo info è impostato su DisabledByExpiredPasswordSyncRule, allora impostate la voce accountEnabled su TRUE e la voce info su NULL. In questo modo, stiamo abilitando gli account precedentemente disabilitati dalla regola di sincronizzazione (e non abilitando gli altri account che potrebbero essere stati disabilitati di proposito).
Prima di iniziare, disabilitate AAD Connect Sync Scheduler.
Synchronize msDS-User-Account-Control-Computed
In passato, l’attributo userAccountControl aveva un numero di flag che potevano essere utilizzati per determinare lo stato di un account.
Potete saperne di più sui property flag a questi link:
– User-Account-Control attribute;
– ADS_USER_FLAG_ENUM enumeration.
Negli attuali rilasci di Windows, invece, questo attributo viene calcolato in tempo reale quando le proprietà dell’utente vengono recuperate/consultate.
Questo meccanismo è fantastico poichè ti permette di essere aggiornato minuto per minuto sulle proprietà dell’account ma non è il massimo per le applicazioni state-based come FIM/MIM/AAD Connect considerato che queste importano gli attributi all’interno di una tabella database e successivamente operano confronti ed operazioni basandosi su questi valori statici.
Questo è il motivo principale per il quale non siamo in grado di sincronizzare lo stato scaduto di un account.
In questo processo, è stato creato uno script che consulta periodicamente tutti questi valori per utente, archivia il valore in memoria e poi lo confronta con quelli salvati in precedenza. Se corrispondono, non succede nulla. Se sono diversi, il nuovo valore viene salvato tornando all’attributo statico specificato.
Un po’ complicato? Sì, ma funziona! Ed una volta completato questo processo, AAD Connector può processare il valore.
<# .SYNOPSIS Save the userAccountControl flag value to an extension attribute. .PARAMETER UserAccountControlValue Choose which attribute to store the computed userAccountControl value. By default, the script will use msDS-CloudExtensionAttribute1. .PARAMETER Logfile Specify the path to the log file. By default, the script will create and append to a log file in $env:TEMP. #>
Param (
$UserAccountControlValue = ‘msDS-CloudExtensionAttribute1′,
$Logfile = “$env:TEMP\SyncPasswordExpiryLog.csv”
)
If (!(Test-Path $Logfile))
{
$LogData = “””” + “Identity” + “””” + “,” + “””” + “Attribute” + “””” + “,” + “””” + “OldValue” + “””” + “,” + “””” + “NewValue” + “”””
Add-Content -Path $Logfile -Value $LogData
}function LogWrite($Identity, $Attribute, $OldValue, $NewValue)
{
$LogData = “””” + $Identity + “””” + “,” + “””” + $Attribute + “””” + “,” + “””” + $OldValue + “””” + “,” + “””” + $NewValue + “”””
Add-Content -Path $Logfile -Value $LogData
}Write-Host “UserAccountControlValue attribute is $($UserAccountControlValue)”
$cmd = “[array]`$Users = Get-ADUser -Filter * -prop objectGuid, msDS-User-Account-Control-Computed,$($UserAccountControlValue)”Invoke-Expression $cmd# Loop through all users
foreach ($obj in $users)
{
# Set Attribute values
$Existing = $obj.$($UserAccountControlValue)
$New = $obj.’msDS-User-Account-Control-Computed’
$User = $obj.DistinguishedName
If (!($Existing -eq $New))
{
LogWrite -Identity $User -Attribute $UserAccountControlValue -OldValue $Existing -NewValue $New
$UpdateUserCmd = “Set-ADUser `”$($User)`” -Replace @{ `”$($UserAccountControlValue)`” = `”$($New)`” }”
Invoke-Expression $UpdateUserCmd
Eseguite lo script per copiare il valore da msDS-User-Account-Control-Computed all’attributo che utilizzerete per $UserAccountControlValue.
Aggiornate l’AD Connector per raccogliere i dati dall’attributo $UserAccountControlValue
Se utilizzate l’attributo di default per lo script, msDS-CloudExtensionAttribute1, dovrete configurare AD connector per importare i dati da AD. Se utilizzate una delle normali estensioni di attributo (1-15), non avrete bisogno di eseguire questo passaggio poichè sono abilitate di default.
1. Lanciate il servizio di Sincronizzazione;
2. Sul tab dei Connettori, selezionate il connettore AD per la vostra foresta, cliccate col tasto destro e selezionate Proprietà;
3. Sotto il connettore Designer, selezionate Select Attributes;
4. Sotto la voce Select Attributes, cliccate su Show All;
5. Trovate l’attributo che state utilizzando per archiviare il valore statico UserAccountControl (msDS-CloudExtensionAttribute1 se utilizzate le impostazioni di script di default) e selezionatelo;
6. Cliccate OK;
7. Eseguite un Full Import di AD Connector (se il vostro ambiente è grande, il processo ci impiegherà un po’ per completarsi).
Create la regola AAD Connect Sync Rule per disabilitare gli account scaduti
L’obiettivo di questa regola è quello di effettuare due set di operazioni su oggetti in cui il msDS-cloudExtenstionAttribute1 (o qualsiasi altro attributo utilizziate per mantenere i dati UserAccountControl) sia impostato su 8388608. La regola imposterà l’accountEnabled sul valore FALSE (che impedirà il login a AAD) e l’attributo Info su DisabledByExpiredPasswordSyncRule. Utilizzeremo il valore in quell’attributo nella prossima regola per determinare quali account possono essere ri-abilitati con una regola.
1. Lanciate l’Editor Synchronization.
2. Sotto la voce Direction, selezionate Inbound, e cliccate poi su Add new rule.
3. Compilate le informazioni generali di sincronizzazione e cliccate Next:
– Name: In from AD – Disable Accounts in Cloud with Expired Passwords
– Description: Disable Accounts in Cloud with Expired Passwords
– Connected System: [scegliete la vostra foresta AD]
– Connected System Object Type: user
– Metaverse Object Type: person
– Link Type: Join
– Precedence: [ sceglietene una precedente inutilizzata, tipo 80 ]
– Tag: [ blank ]
– Enable Password Sync: [ clear ]
– Disabled: [clear]
4. Nella pagina di filtro esplorativo, cliccate su Add Clause e riempite i dettagli:
– Sotto la voce Attributo, selezionate msDS-cloudExtensionAttribute1 (o qualsiasi attributo AD in cui state archiviando il valore statico UserAccountControl)
– Sotto la voce Operator selezionate EQUAL
– Nel box Value, scrivete 8388608
5. Cliccate Next.
6. Nella pagina di unione regole, cliccate Next.
7. Nella pagina di trasformazione, cliccate Add Transformation ed aggiungete le seguenti due trasformazioni:
– Flow Type: Constant; Target Attribute: accountEnabled; source: FALSE
– Flow Type: Constant; Target Attribute: info; source DisabledByExpiredPasswordSyncRule
8. Cliccate Save.
FACOLTATIVO: se non avete disabilitato gli account on-premises le cui password sono scadute e volete restringere il campo ai soli account attivi, potete aggiungere un filtro aggiuntivo per
userAccountControl EQUALS 512.
Create la regola AAD Connect Sync Rule per ri-abilitare un account dopo che la password è stata resettata
Dopo che un utente ha aggiornato la sua password on-premises e che il valore di sincronizzazione statico UserAccountControl è stato eseguito, probabilmente vorrete ri-abilitare l’utente precedentemente disabilitato. Per farlo, dovete creare un’ulteriore regola.
Quest’ultima verrà applicata agli oggetti che hanno l’attributo “info” impostato su UserAccountControl (in questo modo sappiamo che stiamo abilitando solo gli oggetti per cui l’altra regola di sincronizzazione è disabilitata a causa della password scaduta) e che hanno l’attributo UserAccountControl impostato su un valore diverso da 8388608 (di default msDS-CloudExtensionAttribute1).
Se avete oggetti che rispondono a questi criteri, allora imposteremo su TRUE l’accountEnabled e puliremo l’attributo info.
1. Lanciate l’Editor Synchronization Rules.
2. Sotto la voce Direction, selezionate Inbound, e cliccate poi su Add new rule.
3. Compilate le informazioni generali di sincronizzazione e cliccate Next:
– Name: In from AD – Re-Enable Accounts after Password Reset
– Description: Re-Enable Accounts after Password Reset
– Connected System: [scegliete la vostra foresta AD]
– Connected System Object Type: user
– Metaverse Object Type: person
– Link Type: Join
– Precedence: [ sceglietene una precedente inutilizzata, tipo 79 ]
– Tag: [ blank ]
– Enable Password Sync: [ clear ]
– Disabled: [clear]
4. Nella pagina di filtro esplorativo, cliccate su Add Clause e riempite i dettagli:
– Sotto la voce Attributo, selezionate msDS-cloudExtensionAttribute1 (o qualsiasi attributo AD in cui state archiviando il valore statico UserAccountControl)
– Sotto la voce Operator selezionate NOTEQUAL
– Nel box Value, scrivete 8388608
5. Cliccate Add Clause per aggiungere un’altra clausola al filtro ed inserite i dettagli:
– Sotto la voce Attributo, selezionate info
– Sotto la voce Operator selezionate EQUAL
– Nel box Value, scrivete DisabledByExpiredPasswordSyncRule
6. Cliccate Next
7. Nella pagina di trasformazione, cliccate Add Transformation ed aggiungete le seguenti due trasformazioni:
– Flow Type: Constant; Target Attribute: accountEnabled; source: TRUE
– Flow Type: Constant; Target Attribute: info; source NULL
8. Click Save.
FACOLTATIVO: se non disabilitate gli account on-premises le cui password sono scadute e volete restringere il campo ai soli account attivi, potete aggiungere un filtro aggiuntivo per userAccountControl EQUALS 512.
Processare gli utenti
Una volta che avete impostato le regole, potete processare gli utenti.
Vi raccomandiamo di monitorare per primi gli utenti con password scaduta e poi processarli tutti.
1. Eseguite lo script UserAccountControl
2. Verificate che l’utente la cui password dovrebbe essere scaduta abbia il valore 8388608 nell’attributo msDS-CloudExtensionAttribute1
3. Eseguite un Delta Import sul Connettore AD
4. Fate click col tasto destro Sul Connettore AD, selezionate Search Connector Space e poi RDN dal menù a tendina, scrivete CN= e cliccate su Search
5. Selezionate l’utente dalla finestra e cliccate su Preview
6. Assicuratevi del fatto che sia selezionato il bottone Full Synchronization e cliccate poi su Generate Preview
7. Espandete il Connector Updates
8. Espandete il nodo N={GUID} e cliccate su Export Attribute Flow
9. Verificate che l’ accountEnabled abbia un Final Value corrispondente a FALSE
Ripetete i passaggi precedenti per un utente la cui password NON è scaduta per verificare che il flag accountEnabled sia impostato su TRUE.
Se sembra funzionare tutto correttamente, selezionate allora altri utenti, eseguite la sincronizzazione manuale (step 6 qui sopra) ed esportate i valori su Office 365.
Se il test funziona, dovreste riuscire a ri-abilitare l’AAD synchronization schedule.