IIS y Kerberos, ¿un matrimonio posible?

El uso de Kerberos como modo de autenticación en aplicaciones web cada vez está más extendido. Entre otras cosas porque permite la opción de delegar las credenciales y que es más seguro que NTLM.

Primero deberíamos entender cómo funciona Kerberos con las aplicaciones del IIS. La forma de registrar los Service Principal Names (SPNs) es la misma que se utiliza con el resto de aplicaciones: setspn –a HTTP/nombreservicio usuario

Cuando el usuario recibe el ticket del Domain Controller (DC), éste está firmado usando la clave del usuario con el que se ha registrado el SPN (si no encuentra ningún SPN asociado a ese servicio que sea HTTP, usara el SPN HOST en su lugar). Cuando el IIS recibe el ticket, intenta leerlo usando la clave de la identidad del Application Pool en el que se aloje la aplicación (tened en cuenta lo que se menciona en este artículo Autenticación de Kerberos en IIS 7.0). Hasta ahí es el flujo normal de la validación de Kerberos (muy resumida).

En el caso de que sea una Web Farm hay que registrar el SPN al hostname que dirija directamente al nombre del servicio y no al de los nodos. También es obligatorio que se use un usuario de dominio como identidad de los Application Pool dónde se ejecuta nuestro servicio.

Cuando hablamos de Kerberos y una Web Farm cambia un poco el escenario cambia ya que el el SPN debe estar registrado al nombre del servicio y no de cada hostname particular. También nos obliga a usar exactamente el mismo usuario como identidad del application pool porque como hemos dicho antes tiene que ser el usuario con el que se registra el SPN.

Errores Comunes y Troubleshooting

La mejor forma de hacer troubleshooting con Kerberos es coger trazas de red (si el tráfico está cifrado podemos habilitar el log de Kerberos: https://support.microsoft.com/kb/262177) desde el cliente y desde el servidor IIS. Antes de coger las trazas es muy importante el reiniciar el servicio del IIS y la sesión del cliente para asegurarnos de que no queda ningún ticket de Kerberos residual.

Hay muchas formas distintas de analizar las trazas, por lo que os propongo un modo sencillo de hacerlo. Dado que Kerberos es un modo de autenticación, vamos a revisar el estado HTTP 401.

En el diálogo del usuario con el IIS es normal tener un 401, porque el cliente intenta acceder sin credenciales porque no sabe que la aplicación las requiere. Por eso, el IIS le devuelve ese 401 diciéndole qué modos de autenticación acepta. En ese momento el cliente le enviará el ticket de Kerberos que habrá pedido al DC.

El error lo tenemos cuando después de esa petición, en vez de un estado 200 (o similar) tenemos un 401. Si miramos en las trazas, podremos ver qué mensaje está devolviendo el servidor al cliente.

  • “KRB_AP_ERR_MODIFIED”: Básicamente significa que el ticket se ha cifrado con una clave diferente con la que se está intentando leer.

Solucionarlo es sencillo, hay que poner el mismo usuario que el SPN tiene registrado en la identidad de los Application Pool. Aunque también podemos revisar cómo está configurado el SPN.

  • KDC_ERR_C_PRINCIPAL_UNKNOWN que significa que no existe el SPN que está buscando. Así que sólo tendríamos que añadir el SPN que corresponda.

Estos comandos nos van a ayudar a revisar la configuración de los SPNs:

setspn –q http/nombreservicio: Nos va a mostrar qué usuario tiene registrado este SPN (válido para Windows 7 en adelante)

setspn –l usuario: Es la operación análoga del anterior. Nos muestra los SPNs registrados a un determinado usuario

setspn –x: Este comando busca SPNs que estén duplicados. Si existen SPNs duplicados siempre tendremos un error ya que no sabe cuál debe utilizar. Debéis saber que este comando tiene un alto consumo de recursos y emplea bastante tiempo en completarlo.

 

Os recomiendo este enlace que tiene información muy interesante sobre el tema: https://support.microsoft.com/kb/929650 y este otro enlace contiene un documento Word en el que vienen los errores más comunes y cómo solventarlos: https://www.microsoft.com/en-us/download/details.aspx?id=21820

Espero que os sirva de ayuda

- José Ortega Gutiérrez