Verifica che un determinato utente abbia un determinato privilegio


16

Data una coppia di un utente e un privilegio, devo determinare se un utente ha il privilegio sul server. Quanto segue è vero nella mia configurazione:

  • Il server fa parte di un dominio ma non un controller di dominio
  • Esistono diversi domini con relazione di trust nell'infrastruttura
  • A volte gli utenti (locali, di dominio o di dominio diverso) possono appartenere a un gruppo locale per merito del fatto che si trovano in un altro gruppo (dominio o locale) che appartiene a un gruppo locale, anziché appartenere direttamente al gruppo.

Scenario di esempio per l'ultimo punto:

  • Utente1 appartiene al gruppo TeamA nel dominio A.
  • DomaimA \ TeamA è membro di DomainB \ SpecialAccess
  • DomainB \ SpecialAccess è un membro di DomainB \ DomainAdmins
  • Infine DomainB \ DomainAdmins appartiene al gruppo di amministratori locali
  • Il gruppo di amministratori locali ha il privilegio SeRemoteInteractiveLogonRight

Ora, se ho sull'input DomainA \ User1 e SeRemoteInteractiveLogonRight, devo arrivare alla risposta Sì o No. Quindi apro la politica locale sulla macchina, noto quali gruppi sono elencati a destra anche io sono interessato, quindi vado ai server manager e vedo cosa nei membri del gruppo e quindi ho bisogno di vedere quali membri di tutti i gruppi in questi gruppi e così via.

Ho la sensazione che possa essere più facile. Ero davvero entusiasta quando ho trovato l' utilità AccessChk È durata tre minuti interi che mi hanno portato a scoprire che elenca solo le relazioni dirette, quindi l'utente all'interno di un gruppo non verrà elencato.

Ora suppongo che sarebbe possibile combinare i risultati di AccessChk in qualche modo in modo da poter verificare se un utente appartiene a uno dei gruppi restituiti da AccessChk, ma dato che non è un singolo dominio ma molti di loro sono non sono sicuro di come affrontare questo. Anche l'output di AccessChk non sembra distinguere tra un gruppo e un utente.

EDIT : nello spirito di non cadere nella trappola del problema XY, ciò che devo davvero fare è accertarmi che su un gruppo di server nessun account utente specifico utilizzato come identità del pool di applicazioni IIS abbia i privilegi SeInteractiveLogonRight o SeRemoteInteractiveLogonRight. Non ho alcun problema con la parte IIS, ma l'ultimo passaggio per verificare un account rispetto a un privilegio è qualcosa che faccio fatica a trovare un modo semplice per verificare. Vorrei anche automatizzare il controllo perché è qualcosa che dovrà essere fatto regolarmente.


6
Sembra un lavoro per ... Gruppo di criteri risultante (RSoP)! technet.microsoft.com/en-us/library/cc758010%28v=WS.10%29.aspx
Davidw

1
@zespri - La mia risposta è stata immondizia e l'ho cancellata. I diritti utente SeInteractiveLogonRight e SeRemoteInteractiveLogonRight sono gestiti in modo diverso rispetto ai privilegi "normali" e sembra che la loro segnalazione sarà problematica. Se trovo una soluzione per te, posterò un'altra risposta, ma per ora non ho nulla.
Evan Anderson,

1
@Davidw - RSoP è problematico in quanto le impostazioni predefinite dei criteri di sicurezza locali non si rifletteranno nell'output. Pertanto, tutte le voci "Non configurato" verranno visualizzate come "Non configurato" e in realtà non vedrai quali entità sono autorizzate dalla Politica di sicurezza locale. Infine, anche se ottieni un elenco di direttori da Criteri di gruppo, sarai bloccato espandendo le appartenenze ai gruppi (potenzialmente anche tra domini) per replicare la funzionalità del sistema operativo. Questo ha effettivamente rivelato una domanda molto più stimolante di quanto mi aspettassi.
Evan Anderson,

1
@EvanAnderson Exactly! Quando mi è stato chiesto di stimare quanto tempo ci sarebbe voluto, sembrava essere un compito semplice. E dopo un paio di giorni di ricerche su google e di provare cose diverse ... niente. Attualmente il mio piano è quello di creare una classe di informazioni sui token GetTokenInformation con TokenPrivileges. Ovviamente, devo prima capire come ottenere il token stesso. Questo percorso sembra il più promettente al momento.
Andrew Savinykh,

@zespri - NtOpenProcessToken () è probabilmente il modo migliore per ottenere il token. ( Dai un'occhiata a leeholmes.com/blog/2006/07/21/… )
Evan Anderson,

Risposte:


1

I token di accesso non dispongono di informazioni sui diritti, ma solo sui privilegi.

Quello che devi fare è questo:

  • Trova il processo di lavoro IIS che corrisponde al pool di app. Poiché conosci l'identità del pool di app che dovrebbe essere semplice enumerando tutti i processi con il nome del processo di lavoro e filtrando quello che ha l'identità. Se ce ne sono più di uno, puoi usarne uno qualsiasi.
  • Utilizzare GetTokenInformation con la classe di informazioni TokenGroup, non TokenPrivilege sul token del processo. Il risultato ti darà tutti i gruppi transitivi a cui appartiene anche l'identità. Questo significa anche quelli indiretti.
  • Ora puoi scorrere questi gruppi e chiamare LsaEnumerateAccountRights su ciascuno di essi e raccogliere le informazioni. Questo ti darà quello che vuoi.

Quanto sopra si basa sull'esistenza del processo (e del token) corrispondente all'identità dell'account. Nel tuo scenario questo non dovrebbe essere un problema. In scenari in cui questo è un problema, è possibile provare a utilizzare la ricerca di Active Directory per l' attributo calcolato di gruppi token . Questo articolo elenca alcuni approcci su come risolverlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.