Verifique se um determinado usuário tem um determinado privilégio

16

Dado um par de usuário e um privilégio , preciso determinar se um usuário tem o privilégio no servidor. O seguinte é verdadeiro na minha configuração:

  • O servidor faz parte de um domínio, mas não um controlador de domínio
  • Existem vários domínios com relação de confiança na infraestrutura
  • Às vezes, os usuários (local, domínio ou de um domínio diferente) podem pertencer a um grupo local por um mérito de pertencer a outro grupo (domínio ou local) que pertence a um grupo local, em vez de pertencer diretamente ao grupo.

Cenário de exemplo para o último ponto:

  • Usuário1 pertence ao grupo EquipeA no DomínioA
  • DomaimA \ TeamA é membro de DomainB \ SpecialAccess
  • DomainB \ SpecialAccess é um membro de DomainB \ DomainAdmins
  • Finalmente, DomainB \ DomainAdmins pertencem ao grupo local de Administradores
  • O grupo Administradores Locais possui o privilégio SeRemoteInteractiveLogonRight

Agora, se eu tenho a entrada DomainA \ User1 e SeRemoteInteractiveLogonRight, preciso chegar à resposta Sim ou Não. Então, abro a Diretiva local na máquina, observe quais grupos estão listados à direita. Também estou interessado, depois vou aos gerentes de servidor e veja o que os membros do grupo precisam e depois que os membros de qualquer grupo desses grupos. e assim por diante.

Tenho um pressentimento de que pode ser mais fácil. Fiquei realmente empolgado quando encontrei o utilitário AccessChk . Durou três minutos inteiros que levaram a descobrir que ele lista apenas o relacionamento direto, para que o usuário dentro de um grupo não seja listado.

Agora, estou supondo que seria possível combinar os resultados do AccessChk de alguma forma, para que eu possa verificar se um usuário pertence a algum dos grupos que o AccessChk retorna, mas, como não é um domínio único, mas sim vários deles, não sei como abordar isso. Além disso, a saída do AccessChk não parece distinguir entre um grupo e um usuário.

EDIT : No espírito de não cair na armadilha do problema XY, o que eu realmente preciso fazer é garantir que, em um grupo de servidores, nenhuma conta de usuário específica usada como identidades de pool de aplicativos IIS tenha os privilégios SeInteractiveLogonRight ou SeRemoteInteractiveLogonRight. Não tenho nenhum problema com a parte do IIS, mas a última etapa da verificação de uma conta contra um privilégio é algo que estou lutando para encontrar uma maneira direta de verificar. Eu também gostaria de automatizar a verificação, porque isso é algo que precisará ser feito regularmente.

Andrew Savinykh
fonte
6
Isso parece um trabalho para ... Conjunto de políticas resultante (RSoP)! technet.microsoft.com/en-us/library/cc758010%28v=WS.10%29.aspx
Davidw
11
@zespri - Minha resposta foi lixo e eu a apaguei. Os direitos de usuário SeInteractiveLogonRight e SeRemoteInteractiveLogonRight são tratados de maneira diferente dos privilégios "normais" e parece que os relatórios sobre eles serão problemáticos. Se eu encontrar uma solução para você, postarei outra resposta, mas, por enquanto, não tenho nada.
Evan Anderson
11
@ Davidid - O RSoP é problemático, pois os padrões da Diretiva de Segurança Local não serão refletidos na saída. Portanto, todas as entradas "Não configuradas" serão exibidas como "Não configuradas" e você não verá realmente quais entidades têm o direito concedido pela Diretiva de segurança local. Por fim, mesmo que você obtenha uma lista de entidades da Diretiva de Grupo, estará expandindo as associações a grupos (potencialmente também entre domínios) para replicar a funcionalidade do SO. Isso acabou sendo uma pergunta muito mais desafiadora do que eu esperava.
Evan Anderson
11
@EvanAnderson Exactly! Quando me pediram para estimar quanto tempo isso me levaria, parecia ser uma tarefa simples. E depois de alguns dias pesquisando e tentando coisas diferentes ... nada. Atualmente, meu plano é colocar a classe GetTokenInformation com token TokenPrivileges em informações do token. É claro que preciso descobrir primeiro como se apossar do próprio token. Esta rota parece a mais promissora no momento.
Andrew Savinykh
@zespri - NtOpenProcessToken () é provavelmente a melhor maneira de obter o token. (Dê uma olhada em leeholmes.com/blog/2006/07/21/… )
Evan Anderson

Respostas:

1

Os tokens de acesso não têm informações sobre direitos, apenas sobre privilégios.

O que você precisa fazer é o seguinte:

  • Encontre o processo de trabalho do IIS que corresponde ao seu pool de aplicativos. Como você conhece a identidade do pool de aplicativos, isso deve ser fácil, enumerando todos os processos com o nome do processo de trabalho e filtrando o que possui a identidade. Se houver mais de um, você pode usar qualquer um.
  • Use GetTokenInformation com a classe de informações TokenGroup, não o TokenPrivilege no token do processo. O resultado fornecerá todos os grupos transitivos aos quais a identidade pertence. Isso significa até indiretos.
  • Agora você pode percorrer esses grupos e chamar LsaEnumerateAccountRights em cada um e agrupar as informações. Isso lhe dará o que você deseja.

O acima exposto se baseia na existência do processo (e token) correspondente à identidade da conta. No seu cenário, isso não deve ser um problema. Nos cenários em que isso ocorre, você pode tentar usar a pesquisa do Active Directory para o atributo computado de Grupos de Tokens . Este artigo lista algumas abordagens de como fazer isso.

Andrew Savinykh
fonte