elenco Controllo di accesso
Un elenco di controllo di accesso (ACL) è un elenco di voci di controllo di accesso (ACL) create dal sistema operativo per controllare il comportamento di sicurezza associato a un determinato oggetto (protetto) di qualche ordinamento. In Windows sono disponibili due tipi di ACL:
Un ACL discrezionale è un elenco di zero o più ACL che descrivono i diritti di accesso per un oggetto protetto. È discrezionale perché l'accesso concesso è a discrezione del proprietario o di qualsiasi utente con diritti appropriati.
Un ACL di sistema è un elenco di zero o più ACL che descrivono i criteri di controllo e allarme per un oggetto protetto.
Il termine "discrezionale" si riferisce alla differenziazione tra il controllo obbligatorio e discrezionale. In un ambiente che utilizza controlli obbligatori, il proprietario di un oggetto potrebbe non essere in grado di concedere l'accesso all'oggetto. In un ambiente discrezionale, ad esempio Windows, il proprietario di un oggetto è autorizzato a concedere tale accesso. I controlli obbligatori sono in genere associati a ambienti di sicurezza ristretti, ad esempio quelli che usano la sicurezza compartimentata, in cui il sistema deve impedire la divulgazione di informazioni riservate tra gli utenti nello stesso sistema.
Un driver che costruisce un elenco di controllo di accesso segue alcuni passaggi chiave:
Allocare spazio di archiviazione per l'ACL.
Inizializzare l'ACL.
Aggiungere zero (o più) ACL all'ACL.
Gli esempi di codice seguenti illustrano come costruire un ACL:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Il frammento di codice precedente crea un elenco di controllo di accesso vuoto. L'esempio di codice alloca una quantità significativa di memoria, poiché non si conoscono le dimensioni necessarie per l'ACL.
A questo punto, l'ACL è vuoto perché non dispone di voci ACE. Un elenco di controllo di accesso vuoto nega l'accesso a chiunque tenti di accedere all'oggetto perché non sono presenti voci che concedono tale accesso. Il frammento di codice seguente aggiunge un ace a questo elenco di controllo di accesso:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
L'ace aggiunto concede l'accesso a qualsiasi entità che accede all'oggetto, che è lo scopo del SID di accesso globale (SeWorldSid). Questo SID è in genere rappresentato come accesso "Tutti" in altre utilità di sistema Windows.
Quando si creano elenchi di controllo di accesso, è importante inserire voci ACE negate all'inizio dell'ACL e accedere alle voci ACE consentite alla fine dell'ACL. Questo ordine è importante. In caso contrario, il monitoraggio dei riferimenti alla sicurezza concederà l'accesso se trova un ace consentito per l'accesso prima di un ace negato quando valuta l'ACL. Questo comportamento è ben documentato in Microsoft Windows SDK, ma si riferisce al meccanismo specifico usato dal monitoraggio dei riferimenti alla sicurezza per determinare se l'accesso deve essere concesso o negato.