Condividi tramite


elenco Controllo di accesso

Un elenco di controlli di accesso (ACL) è un elenco di ACL creato dal sistema operativo per controllare il comportamento di sicurezza associato a un determinato oggetto (protetto) di un determinato ordinamento. In Windows sono disponibili due tipi di ACL:

  • ACL discrezionale: questo è 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.

  • L'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" fa riferimento alla differenziazione tra il controllo obbligatorio e discrezionale. In un ambiente che usa 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 normalmente associati a ambienti di sicurezza molto stretti, 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 ACL seguirebbe alcuni passaggi chiave:

  1. Allocare l'archiviazione per l'ACL.

  2. Inizializzare l'ACL.

  3. Aggiungere zero (o più) ACL all'ACL.

Gli esempi di codice seguenti illustrano come costruire un elenco di controllo di accesso:

    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 ha voci ACE. Un elenco di controllo di accesso vuoto nega l'accesso a chiunque stia tentando di accedere all'oggetto perché non sono presenti voci che concedono tale accesso. Il frammento di codice seguente aggiunge un ACE all'elenco di controllo di accesso:

    status = RtlAddAccessAllowedAce(dacl, ACL_REVISION,  FILE_ALL_ACCESS, SeExports->SeWorldSid);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

Questa voce concede ora l'accesso a qualsiasi entità a cui è stato eseguito l'accesso all'oggetto. Questo è lo scopo dell'accesso al SID (SeWorldSid), rappresentato in genere come accesso a "Tutti" in altre utilità di sistema Windows.

Si noti che quando si costruiscono elenchi di controllo di accesso, è importante ordinare le voci ACE negate all'inizio dell'ACL e quindi accedere alle voci ACE consentite alla fine dell'ACL. Ciò avviene perché quando il monitoraggio dei riferimenti alla sicurezza esegue la valutazione dell'ACL, concederà l'accesso se trova un ace che concede l'accesso, prima di trovare gli ACL negati. Questo comportamento è ben documentato nella 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.