Propagazione automatica degli ACL ereditabili
Le funzioni di SetNamedSecurityInfo e setSecurityInfosupportano la propagazione automatica delle voci di controllo di accesso ereditabili (ACL). Ad esempio, se si usano queste funzioni per aggiungere un ace ereditabile a una directory in un file NTFS, il sistema applica l'ace in base alle elenchi di controllo di accesso (ACL) di qualsiasi sottodirectory o file esistente.
Gli ACL applicati direttamente hanno la precedenza sugli ACL ereditati. Il sistema implementa questa precedenza posizionando direttamente gli ACL applicati direttamente prima degli ACL ereditati in un elenco di controllo di accesso discrezionale (DACL). Quando si chiamano le funzioni di SetNamedSecurityInfo e SetSecurityInfo per impostare le informazioni di sicurezza di un oggetto, il sistema impone il modello di ereditarietà corrente sugli ACL di tutti gli oggetti nella gerarchia sotto l'oggetto di destinazione. Per gli oggetti convertiti nel modello di ereditarietà corrente, i bit SE_DACL_AUTO_INHERITED e SE_SACL_AUTO_INHERITED vengono impostati nel campo di controllo del descrittore di sicurezza dell'oggetto.
Quando si compila un nuovo descrittore di sicurezza che riflette il modello di ereditarietà corrente, è necessario prestare attenzione a non modificare la semantica del descrittore di sicurezza. Di conseguenza, gli ACL consentiti e negati non vengono mai spostati l'uno rispetto all'altro. Se tale movimento è necessario (ad esempio per inserire tutti gli ACL non inriti davanti a un ACL), l'ACL viene contrassegnato come protetto per impedire la modifica semantica.
Il sistema usa le regole seguenti quando si propagano gli ACL ereditati agli oggetti figlio:
- Se un oggetto figlio senza DACL eredita un ace, il risultato è un oggetto figlio con un DACL che contiene solo l'ace ereditato.
- Se un oggetto figlio con un DACL vuoto eredita un oggetto ACE, il risultato è un oggetto figlio con un DACL che contiene solo l'ace ereditato.
- Se si rimuove un ace ereditabile da un oggetto padre, l'ereditarietà automatica rimuove tutte le copie dell'ace ereditate dagli oggetti figlio.
- Se l'ereditarietà automatica comporta la rimozione di tutti gli ACL dal DACL di un oggetto figlio, l'oggetto figlio ha un DACL vuoto anziché un DACL.
Queste regole possono avere il risultato imprevisto della conversione di un oggetto senza DACL in un oggetto con un DACL vuoto. Un oggetto senza DACL consente l'accesso completo, ma un oggetto con un DACL vuoto non consente l'accesso. Come esempio di come queste regole possono creare un DACL vuoto, si supponga di aggiungere un ace ereditabile all'oggetto radice di un albero di oggetti. L'ereditarietà automatica propaga l'ace ereditabile a tutti gli oggetti nell'albero. Gli oggetti figlio che iniziano senza DACL ora hanno un DACL con l'ace ereditato. Se si rimuove l'ace ereditabile dall'oggetto radice, il sistema propaga automaticamente la modifica agli oggetti figlio. Gli oggetti figlio che iniziano senza DACL (consentendo l'accesso completo) hanno ora un DACL vuoto (che non consente l'accesso).
Per assicurarsi che un oggetto figlio senza DACL non sia interessato dagli ACL ereditabili, impostare il flag SE_DACL_PROTECTED nel descrittore di sicurezza dell'oggetto.
Per informazioni su come creare correttamente un daCL, vedere Creating a DACL.