Crear un servicio de Python para consultar atributos de AD
Estoy integrando nuestro AD con servicios web que ejecutan Python en Linux usando Python-LDAP sobre SASL (DIGEST-MD5) para consultar los atributos de usuario de AD 2012 (división, departamento, extensión de teléfono, correo electrónico, etc.). Después de resolver los problemas específicos de mi servicio en un AD 2003, comencé a encontrarme con un error de SPN en nuestro nuevo AD 2012, que el resumen de uri no coincidía con ningún SPN en el servidor. He cruzado la lista SPN para ambos servidores y contienen análogos idénticos entre sí.
El error: el digest-uri no coincide con ningún LDAP SPN registrado para este servidor
¿La solución?
Esto se solucionó ejecutando:
setspn -A ldap/<Domain_Name> <Computer_Name>
Tenga en cuenta que crear una cuenta de servicio no solucionó mi error de SPN incluso cuando se ejecutó el siguiente comando:
setspn -A ldap/<Domain_Name> <Domain_Name>/<Service_Account_Name>
simple_bind_s () no necesita SPN, sasl_interactive_bind_s () necesita SPN
Solo agregar el SPN a la lista de SPN de la máquina local funcionó para mi servicio Python-LDAP usando sasl_interactive_bind_s (). También debo tener en cuenta que el paso SPN se puede omitir si uso simple_bind_s () pero este método envía credenciales en texto sin formato que es inaceptable.
Sin embargo, noté que el registro solo permanece en la lista SPN durante aproximadamente un minuto antes de desaparecer. No hay errores cuando ejecuto el comando setspn, los registros de eventos están completamente vacíos, no hay duplicados en ninguna parte, se verifica con la búsqueda de -F en todo el bosque en la base dn y nada. Agregué e intenté volver a agregar y eliminar y moví el SPN de un objeto a otro para verificar que no se esconde en ningún lado, pero en el segundo que agrego el objeto en cualquier lugar y luego intento volver a agregarlo, me notifica un duplicado. Así que estoy muy seguro de que no hay un duplicado oculto en alguna parte.
El truco
Por ahora tengo una tarea programada que vuelve a ejecutar el comando para mantener el registro en la lista para que mi servicio funcione correctamente llamado "Hack SPN"
cmd.exe /C "setspn -A ldap/<Domain_Name> <Computer_Name>"
hasta que pueda averiguar por qué se está limpiando el SPN de la lista.
No soy el administrador principal de este AD en particular, ¿podría el administrador tener un servicio en ejecución que sincronice el SPN de otro servicio en el AD y no estar al tanto? Mi título es Desarrollador web, no como una excusa, sino para explicar mi ignorancia en asuntos de Active Directory. Me han dicho que convierta el AD en el DB maestro de usuario y he estado leyendo mucho, pero no puedo encontrar ningún lugar donde la gente tenga un problema con el SPN que se 'sobrescribe' o 'limpia' periódicamente y ninguno de los Los administradores están muy familiarizados con SPN fuera de las entradas de SQLServer.
¿Por qué necesito el hack?
Hasta ahora, mi pirateo no parece haber causado ningún problema a ningún usuario o servicio y no ha generado ningún error, por lo que el administrador dice que simplemente lo dejará correr y seguiré buscando. Pero luego me encuentro en la precaria situación de escribir un servicio cuya implementación se basa, esencialmente, un truco / escalofrío cron ... Entonces, cualquier ayuda sería apreciada.
Actualizar
Después de una conversación con el administrador del sistema, acordó que construir un servicio sobre un hack no es una solución, por lo tanto, me dio permiso para activar un servicio local con cifrado de punto final que puedo usar para mis propósitos, el resultado es el mismo . Estaré atento a lo que está causando que el SPN desaparezca. Los enlaces locales no son un problema al usar Python-LDAP y el servicio local ya está en funcionamiento después de solo una hora más o menos. Es lamentable que esencialmente esté envolviendo la funcionalidad integrada en LDAP, pero hacemos lo que tenemos que hacer.
fuente
Respuestas:
Este es un fenómeno verdaderamente interesante (y molesto) e insisto en que descubramos lo que está sucediendo aquí.
Afortunadamente, Windows Server tiene algunas políticas de auditoría detalladas desde 2008, y podemos utilizar la auditoría para rastrear quién hizo esto. Para hacerlo, necesitaremos:
Averigüe dónde se produce la modificación de SPN:
Abra un símbolo del sistema elevado en un controlador de dominio y emita este comando:
El resultado contendrá el nombre del controlador de dominio que escribió originalmente la versión actual del valor de los atributos servicePrincipalName:
Habilite la auditoría de cambio de objeto de AD DS:
Si una política de auditoría global aún no está definida, puede realizar este cambio en la política de seguridad local en el controlador de dominio identificado en el paso anterior
Abra la Consola de administración de directivas de grupo (
gpmc.msc
), localícelaDefault Domain Controllers Policy
y edítela.Computer Configuration -> Windows Settings -> Security Settings
Local Policies -> Security Options
Advanced Audit Policy -> Audit Policies -> DS Access
Establezca una auditoría ACE en el objeto:
Abra Usuarios y equipos de Active Directory (
dsa.msc
) y verifique la configuración de "Funciones avanzadas" en el menú "Ver".Navegue hasta el objeto de la cuenta de la computadora, haga clic con el botón derecho y seleccione Propiedades. Elija la pestaña Seguridad y presione el botón "Avanzado".
En el indicador, seleccione la pestaña Auditoría y asegúrese de que "Escribir todas las propiedades" esté siendo auditado para Todos . Si no, o si tiene dudas, agregue una nueva entrada:
( Si eres flojo, solo puedes seleccionar "Escribir todas las propiedades" )
Reproducir el error
Según su pregunta, parece que el SPN se elimina cada minuto más o menos, por lo que este es probablemente el paso más fácil. Tome una lección de música de 1 minuto mientras tanto.
Inspeccione el registro de seguridad en el DC ofensor
Ahora que ha pasado un minuto, inspeccionemos el registro de seguridad en el Controlador de dominio identificado como el creador en el paso 1. Esto puede ser un problema en dominios grandes, pero el filtrado puede ayudar con esto:
Windows Logs -> Security
<All Event IDs>
", ingrese 5136 (este es el id del evento para la modificación del objeto de directorio)Ahora debería poder encontrar una entrada de evento para cada cambio en el
servicePrincipalName
atributo en la cuenta de la computadora.Identifique el "Sujeto" responsable del cambio y vea de dónde vino. ¡Mata ese proceso / máquina / cuenta con fuego!
Si el tema se identifica como
SYSTEM
,ANONYMOUS LOGON
o una descripción genérica similar, estamos tratando con el procesamiento interno en el controlador de dominio en sí, y tendremos que romper algunos registros de diagnóstico NTDS para averiguar qué está sucediendo. Por favor actualice la pregunta si este es el casofuente