Verifique que un usuario dado tenga un privilegio dado

16

Dado un par de usuarios y un privilegio , necesito determinar si un usuario tiene el privilegio en el servidor. Lo siguiente es cierto en mi configuración:

  • El servidor es parte de un dominio pero no un controlador de dominio.
  • Existen varios dominios con relación de confianza en la infraestructura.
  • A veces, los usuarios (locales, de dominio o de un dominio diferente) pueden pertenecer a un grupo local por el mérito de que estén en otro grupo (dominio o local) que pertenece a un grupo local, en lugar de pertenecer al grupo directamente.

Escenario de ejemplo para el último punto:

  • Usuario1 pertenece al grupo TeamA en el DominioA
  • DomaimA \ TeamA es miembro de DomainB \ SpecialAccess
  • DomainB \ SpecialAccess es miembro de DomainB \ DomainAdmins
  • Finalmente DomainB \ DomainAdmins pertenecen al grupo local de Administradores
  • El grupo de Administradores locales tiene privilegios SeRemoteInteractiveLogonRight

Ahora, si tengo en la entrada DomainA \ User1 y SeRemoteInteractiveLogonRight, necesito llegar a Sí o No. Entonces, abro la Política local en la máquina, noto qué grupos se enumeran a la derecha también me interesa, luego voy a los administradores del servidor y veo qué hay en los miembros del grupo y luego necesito ver qué miembros de cualquier grupo en estos grupos y así.

Tengo el presentimiento de que puede ser más fácil. Estaba realmente emocionado cuando encontré la utilidad AccessChk. Duró tres minutos completos que me llevaron a descubrir que solo enumera la relación directa, por lo que el usuario dentro de un grupo no aparecerá en la lista.

Ahora supongo que sería posible combinar los resultados de AccessChk de alguna manera para poder verificar si un usuario pertenece a alguno de los grupos que AccessChk devuelve, pero dado que no es un dominio único sino varios de ellos estoy No estoy seguro de cómo abordar esto. Además, la salida de AccessChk no parece distinguir entre un grupo y un usuario.

EDITAR : con el espíritu de no caer en la trampa del problema XY, lo que realmente necesito hacer es asegurarme de que en un grupo de servidores no haya cuentas de usuario específicas que se usen como identidades de grupo de aplicaciones IIS que tengan privilegios SeInteractiveLogonRight o SeRemoteInteractiveLogonRight. No tengo ningún problema con la parte de IIS, pero el último paso para verificar una cuenta con un privilegio es algo que me cuesta encontrar una forma sencilla de verificar. También me gustaría automatizar la verificación porque esto es algo que deberá hacerse regularmente.

Andrew Savinykh
fuente
66
Esto suena como un trabajo para ... ¡Conjunto resultante de políticas (RSoP)! technet.microsoft.com/en-us/library/cc758010%28v=WS.10%29.aspx
Davidw
1
@zespri - Mi respuesta fue basura y la eliminé. Los derechos de usuario SeInteractiveLogonRight y SeRemoteInteractiveLogonRight se manejan de manera diferente a los privilegios "normales" y parece que informar sobre ellos va a ser problemático. Si encuentro una solución para ti, publicaré otra respuesta pero, por ahora, no tengo nada.
Evan Anderson
1
@Davidw: RSoP es problemático porque los valores predeterminados de la Política de seguridad local no se reflejarán en la salida. Por lo tanto, las entradas "No configuradas" aparecerán simplemente como "No configuradas" y no verá realmente qué entidades principales tienen derecho por la Política de seguridad local. Finalmente, incluso si obtiene una lista de principios de la Política de grupo, se quedará atrapado ampliando la pertenencia a grupos (también potencialmente entre dominios) para replicar la funcionalidad del sistema operativo. Esto ha resultado ser una pregunta mucho más desafiante de lo que esperaba.
Evan Anderson
1
@EvanAnderson ¡Exactamente! Cuando me pidieron que estimara cuánto tiempo me llevaría, parecía ser una tarea sencilla. Y después de un par de días buscando en Google y probando cosas diferentes ... nada. Actualmente, mi plan es pinvokear GetTokenInformation con la clase de información de token TokenPrivileges. Por supuesto, primero tengo que descubrir cómo obtener el token. Esta ruta parece la más prometedora en este momento.
Andrew Savinykh
@zespri - NtOpenProcessToken () es probablemente la mejor manera de llegar al token. (Echa un vistazo a leeholmes.com/blog/2006/07/21/… )
Evan Anderson

Respuestas:

1

Los tokens de acceso no tienen información sobre derechos, solo sobre privilegios.

Lo que debes hacer es esto:

  • Encuentre el proceso de trabajo de IIS que corresponde a su grupo de aplicaciones. Como conoce la identidad del grupo de aplicaciones, debería ser fácil enumerando todos los procesos con el nombre del proceso de trabajo y filtrando el que tiene la identidad. Si hay más de uno, puede usar cualquiera.
  • Use GetTokenInformation con la clase de información TokenGroup, no TokenPrivilege en el token de proceso. El resultado le dará también a todos los grupos transitivos a los que pertenece la identidad. Esto significa incluso los indirectos.
  • Ahora puede recorrer estos grupos y llamar a LsaEnumerateAccountRights en cada uno y recopilar la información. Esto te dará lo que quieres.

Lo anterior se basa en la existencia del proceso (y token) correspondiente a la identidad de la cuenta. En su escenario, esto no debería ser un problema. En situaciones en las que esto es un problema, puede intentar usar la búsqueda de Active Directory para el atributo calculado de Grupos de tokens . Este artículo enumera algunos enfoques sobre cómo lograr esto.

Andrew Savinykh
fuente