Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Un elenco di controllo di accesso (ACL) è un elenco di voci di controllo di accesso (ACE) create dal sistema operativo per controllare il comportamento di sicurezza associato a un determinato tipo di oggetto (protetto). In Windows sono disponibili due tipi di ACL:
Un ACL discrezionale è un elenco di zero o più voci di controllo accessi (ACE) 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ù ACE che descrivono i criteri di auditing 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ù) ACEs 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 ACD.
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 monitor di riferimento di sicurezza concederà l'accesso se trova un ACE consentito 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.