Identity & Access Audit — AD / Entra ID [xlsx]
Pacchetto onboarding IT Gonzato · Fase P1 · Sys Admin · v1 03/07/2026 · bozza da compilare in azienda
Scopo
Fotografia degli utenti e degli accessi su Active Directory on-prem ed Entra ID (M365): elenco utenti, gruppi e membership, ruoli amministrativi, stato MFA, account dormienti (>90 giorni). Serve a documentare "chi ha accesso a cosa" prima dello split societario e a coprire il requisito NIS 2 di gestione delle identità. Tutti i comandi sotto sono READ-ONLY (Get-*): nessuna modifica di directory in fase di audit. L'obiettivo è documentare, non giudicare l'operato di chi ha configurato il sistema.
Metodo — script PowerShell READ-ONLY
A. Utenti AD (stato, ultimo logon, età password)
Import-Module ActiveDirectory
$soglia = (Get-Date).AddDays(-90)
Get-ADUser -Filter * -Properties LastLogonDate,Enabled,PasswordLastSet,PasswordNeverExpires,whenCreated,Description |
Select-Object SamAccountName,Name,Enabled,LastLogonDate,PasswordLastSet,PasswordNeverExpires,whenCreated,Description,
@{N='Dormiente90gg';E={ $_.LastLogonDate -lt $soglia }} |
Sort-Object LastLogonDate |
Export-Csv .\ad-users.csv -NoTypeInformation -Encoding UTF8
B. Membership dei gruppi (ricorsiva — annidamento incluso)
Get-ADGroup -Filter * -Properties Members | ForEach-Object {
$g = $_.Name
Get-ADGroupMember -Identity $_ -Recursive -ErrorAction SilentlyContinue |
Select-Object @{N='Gruppo';E={$g}}, SamAccountName, Name, objectClass
} | Export-Csv .\ad-group-membership.csv -NoTypeInformation -Encoding UTF8
C. Gruppi privilegiati AD (Domain/Enterprise Admins, ecc.)
'Domain Admins','Enterprise Admins','Schema Admins','Administrators','Account Operators','Server Operators' |
ForEach-Object {
$grp = $_
Get-ADGroupMember -Identity $grp -Recursive -ErrorAction SilentlyContinue |
Select-Object @{N='GruppoPriv';E={$grp}}, SamAccountName, Name, objectClass
} | Export-Csv .\ad-privileged.csv -NoTypeInformation -Encoding UTF8
D. Utenti Entra ID + stato account (Microsoft.Graph)
Connect-MgGraph -Scopes 'User.Read.All','Directory.Read.All','UserAuthenticationMethod.Read.All','AuditLog.Read.All'
Get-MgUser -All -Property Id,DisplayName,UserPrincipalName,AccountEnabled,SignInActivity,CreatedDateTime |
Select-Object DisplayName,UserPrincipalName,AccountEnabled,CreatedDateTime,
@{N='LastSignIn';E={$_.SignInActivity.LastSignInDateTime}} |
Export-Csv .\entra-users.csv -NoTypeInformation -Encoding UTF8
E. Metodi di autenticazione / MFA per utente
$mfa = foreach ($u in (Get-MgUser -All -Property Id,UserPrincipalName)) {
$methods = Get-MgUserAuthenticationMethod -UserId $u.Id -ErrorAction SilentlyContinue
$types = ($methods.AdditionalProperties.'@odata.type' -replace '#microsoft.graph.','')
[pscustomobject]@{
UPN = $u.UserPrincipalName
MetodiMFA = ($types -join '; ')
SoloPassword = (($types | Where-Object { $_ -ne 'passwordAuthenticationMethod' }).Count -eq 0)
}
}
$mfa | Export-Csv .\entra-mfa.csv -NoTypeInformation -Encoding UTF8
F. Ruoli di directory attivi (admin Entra)
Get-MgDirectoryRole -All | ForEach-Object {
$role = $_.DisplayName
Get-MgDirectoryRoleMember -DirectoryRoleId $_.Id -ErrorAction SilentlyContinue | ForEach-Object {
[pscustomobject]@{ Ruolo = $role; MembroId = $_.Id }
}
} | Export-Csv .\entra-admin-roles.csv -NoTypeInformation -Encoding UTF8
Template tabella di output — Utenti
| SamAccount/UPN | Nome | Società | Enabled | Ultimo logon | Password impostata il | MFA | Dormiente >90gg | Note |
|---|
| [da compilare] | | | | | | | | |
Template tabella di output — Account amministrativi
| Account | Ruolo/gruppo priv | Ambito (AD/Entra) | Persona reale? | MFA | Giustificato? | Owner | Note |
|---|
| [da compilare] | | | | | | | |
Template tabella di output — Account dormienti (>90gg)
| Account | Ultimo logon | Enabled | Gruppi | Ipotesi (ex-dip/servizio) | Azione proposta (P2) |
|---|
| [da compilare] | | | | | |
Sintesi da compilare
- Utenti totali AD / Entra:
[da compilare] - Account abilitati senza MFA:
[da compilare] - Account dormienti >90gg:
[da compilare] - Membri gruppi privilegiati:
[da compilare] - Account condivisi individuati:
[da compilare]
Nota: i risultati vanno discussi col team come lettura congiunta ("aiutami a capire perché è così"), non come contestazione. Le azioni correttive si pianificano in P2/P3.