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 que se segue é verdadeiro na minha configuração:

  • O servidor é parte de um domínio, mas não de 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 deles em outro grupo (domínio ou local) que pertença a um grupo local, em vez de pertencer ao grupo grupo diretamente.

Cenário de exemplo para o último ponto:

  • O usuário1 pertence ao grupo TeamA no domínioA
  • DomaimA \ TeamA é um membro do DomainB \ SpecialAccess
  • DomainB \ SpecialAccess é um membro do DomainB \ DomainAdmins
  • Finalmente DomainB \ DomainAdmins pertence ao grupo de administradores locais
  • O grupo de administradores locais tem privilégio SeRemoteInteractiveLogonRight

Agora, se eu tiver na entrada DomainA \ User1 e SeRemoteInteractiveLogonRight, preciso chegar a uma resposta Sim ou Não. Então eu abro a Política Local na máquina, anote quais grupos estão listados contra a direita. Estou interessado também, então vá para os gerenciadores de servidores e veja o que os membros do grupo precisam e, em seguida, preciso ver quais membros de quaisquer grupos nesses grupos e assim por diante.

Tenho a impressão de que pode ser mais fácil. Fiquei muito empolgado quando encontrei o utilitário AccessChk . Durou três minutos inteiros que me levaram a descobrir que ele só lista o relacionamento direto, portanto, o usuário dentro de um grupo não será listado.

Agora eu estou supondo que seria possível combinar resultados do AccessChk de alguma forma para que eu possa verificar se um usuário pertence a qualquer um dos grupos que o AccessChk retorna, mas dado que não é um único domínio, mas vários deles Não tenho certeza de como abordar isso. Também a saída 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 é ter certeza de que em um grupo de servidores não há contas de usuário específicas que são usadas como pool de aplicativos do IIS identidades têm privilégios SeInteractiveLogonRight ou SeRemoteInteractiveLogonRight. Eu não tenho nenhum problema com a parte do IIS, mas a última etapa de verificar uma conta em relação a um privilégio é algo que eu estou lutando para encontrar uma maneira simples de verificar. Eu também gostaria de automatizar o cheque porque isso é algo que precisa ser feito regularmente.

    
por Andrew Savinykh 06.07.2014 / 23:26

1 resposta

1

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

O que você precisa fazer é isto:

  • 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 aquele 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 de processo. O resultado lhe dará todos os grupos transitivos aos quais a identidade pertence também. Isso significa até mesmo indiretos.
  • Agora, você pode percorrer esses grupos e chamar LsaEnumerateAccountRights em cada um e agrupe as informações. Isso vai te dar o que você quer.

O acima depende da existência do processo (e token) correspondente à identidade da conta. Em seu cenário, isso não deve ser um problema. Em situações em que isso é um problema, você pode tentar usar a pesquisa do Active Directory para Atributo computado de grupos de tokens . Este artigo lista algumas abordagens sobre como fazer isso.

    
por 16.06.2016 / 14:11