Ajuste de SQL y solución de problemas de latencia con AD FS

En una actualización para AD FS 2016, se introdujeron las siguientes mejoras para reducir la latencia entre bases de datos. Una próxima actualización para AD FS 2019 incluirá estas mejoras.

Actualización de la memoria caché en subproceso en segundo plano

En las implementaciones anteriores de disponibilidad permanente (AoA), existía latencia para cualquier operación de "lectura", ya que el nodo maestro podría encontrarse en un centro de datos independiente. La llamada entre dos centros de datos diferentes dio lugar a una latencia.

En la actualización más reciente de AD FS, se pretende hacer una reducción de la latencia mediante la adición de un subproceso en segundo plano para actualizar la memoria caché de configuración de AD FS y una configuración para establecer el período de tiempo de actualización. El tiempo dedicado a una búsqueda de base de datos se reduce significativamente en el subproceso de solicitud, ya que las actualizaciones de caché de la base de datos se mueven al subproceso en segundo plano.

Cuando el backgroundCacheRefreshEnabled se establezca en true, AD FS permitirá que el subproceso en segundo plano ejecute actualizaciones de caché. La frecuencia de capturar datos de la memoria caché se puede personalizar en un valor de hora estableciendo cacheRefreshIntervalSecs. El valor predeterminado es de 300 segundos cuando backgroundCacheRefreshEnabled se establece en true. Después de la duración del valor establecido, AD FS comienza a actualizar su caché y mientras la actualización está en curso, los datos de caché antiguos seguirán utilizándose.

Cuando AD FS recibe una solicitud de una aplicación, AD FS recupera la aplicación de SQL y la agrega a la memoria caché. En el valor cacheRefreshIntervalSecs, la aplicación de la memoria caché se actualiza mediante el subproceso en segundo plano. Si existe una entrada en la memoria caché, las solicitudes entrantes usarán la memoria caché mientras la actualización en segundo plano está en curso. Si no se tiene acceso a una entrada durante 5 * cacheRefreshIntervalSecs, se quita de la memoria caché. La entrada más antigua también se puede quitar de la memoria caché una vez alcanzado el valor configurable maxRelyingPartyEntries.

Nota

Los datos de la memoria caché se actualizarán fuera del valor cacheRefreshIntervalSecs si AD FS recibe una notificación de SQL indicando que se ha producido un cambio en la base de datos. Esta notificación hará que se actualice la caché.

Recomendaciones para establecer la actualización de caché

El valor predeterminado para la actualización de caché es de cinco minutos. Se recomienda establecerlo en 1 hora para reducir una actualización de datos innecesaria por AD FS, ya que los datos de caché se actualizarán si se producen cambios en SQL.

AD FS registra una devolución de llamada para los cambios de SQL y, tras un cambio, AD FS recibe una notificación. Mediante este método, AD FS recibe cada nuevo cambio de SQL tan pronto como se produzca.

En caso de un error de red que haga que AD FS no reciba la notificación de SQL, AD FS se actualizará en el intervalo especificado por el valor de actualización de caché. Si se sospecha de algún problema de conectividad entre AD FS y SQL, se recomienda establecer el valor de actualización de caché en menos de 1 hora.

Instrucciones de configuración

El archivo de configuración admite varias entradas de caché. Las siguientes opciones pueden configurarse en función de las necesidades de su organización.

En el siguiente ejemplo se habilita la actualización de caché en segundo plano y se establece el período de actualización de caché en 1800 segundos o 30 minutos. Esto debe realizarse en cada nodo de AD FS y el servicio AD FS debe reiniciarse después. Los cambios no afectan a otros nodos y prueban el primer nodo antes de realizar el cambio en todos los nodos.

  1. Vaya al archivo de configuración de AD FS (ubicación predeterminada C:\Windows\ADFS\Microsoft.IdentityServer.ServiceHost.exe.config) y, en la sección "Microsoft.IdentityServer.Service", agregue la siguiente entrada:
  • backgroundCacheRefreshEnabled: Especifica si la característica de caché en segundo plano está habilitada. Valores "true/false".
  • cacheRefreshIntervalSecs: Valor en segundos en el que AD FS actualizará la memoria caché. AD FS actualizará la memoria caché si hay algún cambio en SQL. AD FS recibirá una notificación de SQL y actualizará la memoria caché.

Nota

Todas las entradas del archivo de configuración distinguen mayúsculas de minúsculas. <cache cacheRefreshIntervalSecs="1800" > backgroundCacheRefreshEnabled="true" />

Valores configurables adicionales admitidos:

  • maxRelyingPartyEntries: Este es el número máximo de entradas de usuario de confianza que AD FS mantendrá en memoria. Esta memoria caché de permisos de aplicación de OAuth también usa este valor. Si hay más permisos de aplicación que RPs y si todos serán almacenados en memoria, este valor debe ser el número de permisos de aplicación. El valor predeterminado es 1000.
  • maxIdentityProviderEntries: Este es el número máximo de entradas del proveedor de notificaciones que AD FS mantendrá en memoria. El valor predeterminado es 200.
  • maxClientEntries: Este es el número máximo de entradas de cliente de OAuth que AD FS mantendrá en memoria. El valor predeterminado es 500.
  • maxClaimDescriptorEntries: Este es el número máximo de entradas del descriptor de notificación que AD FS mantendrá en memoria. El valor predeterminado es 500.
  • maxNullEntries: Se usa como caché negativa. Cuando AD FS busca una entrada en la base de datos y no se encuentra, AD FS agrega en caché negativa. Este es el tamaño máximo de esa memoria caché. Hay una caché negativa para cada tipo de objetos, no es una memoria caché única para todos los objetos. El valor predeterminado es 50 0000.

Compatibilidad con varias bases de datos de artefactos en centros de datos

Para configuraciones anteriores de varios centros de datos, AD FS solo admite una base de datos de artefactos única, lo que provoca una latencia entre centros de datos durante las llamadas de recuperación.

Para reducir la latencia entre centros de datos, un administrador de AD FS ahora puede implementar varias instancias de base de datos de artefactos y, a continuación, modificar el archivo de configuración de un nodo de AD FS para que apunte a diferentes instancias de base de datos de artefactos. La cadena de conexión de la base de datos de artefactos se puede proporcionar en el archivo de configuración que permite una base de datos de artefactos por nodo. Si la cadena de conexión no está presente en el archivo de configuración, el nodo volverá al diseño anterior para usar la base de datos de artefactos, que está presente en la base de datos de configuración. Los entornos híbridos también son compatibles con esta configuración.

Requisitos

Antes de configurar la compatibilidad con varias bases de datos de artefactos, ejecute una actualización en todos los nodos y actualice los archivos binarios, ya que las llamadas a varios nodos se producen a través de esta característica.

  1. Generar script de implementación para crear la base de datos de artefactos: Para implementar varias instancias de base de datos de artefactos, un administrador deberá generar el script de implementación de SQL para la base de datos de artefactos. Como parte de esta actualización, el cmdlet Export-AdfsDeploymentSQLScript existente se ha actualizado para tomar opcionalmente un parámetro que especifica la base de datos de AD FS para la que se va a generar un script de implementación de SQL.

Por ejemplo, para generar el script de implementación solo para la base de datos de artefactos, especifique el parámetro -DatabaseType y pase el valor "Artefacto". El parámetro opcional -DatabaseType especifica el tipo de base de datos de AD FS y se puede establecer en: Todos (valor predeterminado), Artefacto o Configuración. Si no se especifica ningún parámetro -DatabaseType, el script configurará los scripts Artefacto y Configuración.

PS C:\> Export-AdfsDeploymentSQLScript -DestinationFolder <script folder where scripts will be created> -ServiceAccountName <domain\serviceaccount> -DatabaseType "Artifact"

El script generado debe ejecutarse en la máquina SQL para crear las bases de datos necesarias y conceder a la cuenta de servicio de AD FS permisos SQL SA a esas bases de datos.

  1. Cree la base de datos de artefactos mediante el script de implementación. Copie los scripts de implementación createDB.sql y SetPermissions.sql recién generados en el equipo SQL Server y ejecútelos para crear la base de datos de artefactos local.

  2. Modifique el archivo de configuración para agregar la conexión de la base de datos de artefactos. Vaya al archivo de configuración del nodo de AD FS y, en la sección "Microsoft.IdentityServer.Service", agregue un punto de entrada a la base de datos de artefactos recién configurada.

Nota

artifactStore y connectionString distinguen mayúsculas de minúsculas. Asegúrese de que están configurados correctamente. <artifactStore connectionString="Data Source=.\SQLInstance;Integrated Security=True;Initial Catalog=AdfsArtifactStore" />

Use un valor de origen de datos que coincida con la conexión SQL.

  1. Reinicie el servicio de AD FS para que se apliquen los cambios.

Nota

No se recomienda usar la replicación de SQL ni la sincronización entre las bases de datos de artefactos. La recomendación es configurar una base de datos de artefactos por centro de datos.

Conmutación por error entre centros de datos y recuperación de bases de datos

Se recomienda crear bases de datos de artefactos de conmutación por error en el mismo centro de datos que la base de datos de artefactos maestros. Si se produce una conmutación por error, no habrá ningún aumento en la latencia. No se recomiendan bases de datos de artefactos de conmutación por error entre centros de datos. A continuación se detalla cómo llama a OAuth, SAML, ESL y función de detección de reproducción de tokens con varias bases de datos de artefactos.

  • OAuth y SAML

    En el caso de las solicitudes de artefacto de OAuth y SAML, el nodo creará el artefacto en la base de datos de artefactos presente en el archivo de configuración. Si el archivo de configuración no contiene una conexión de base de datos de artefactos, usará la base de datos de artefacto común. Cuando la siguiente solicitud para capturar el artefacto se dirige a otro nodo, el otro nodo realizará una API rest al primer nodo capture el artefacto de la base de datos del artefacto. Esto es necesario, ya que los distintos nodos pueden tener bases de datos de artefactos diferentes y los nodos no lo saben. Si el primer nodo está inactivo, se producirá un error en la resolución del artefacto. Debido a este diseño, no es necesario replicar la base de datos de artefactos en distintos centros de datos. Si todo un centro de datos está inactivo, lo más probable es que el nodo que creó el artefacto también lo esté, lo que significa que el artefacto ya no puede resolverse.

  • Bloqueo de extranet

    La base de datos de artefactos a la que se hace referencia en el archivo de configuración se usará para los datos de bloqueo de extranet. Sin embargo, para la característica ESL, AD FS elige un patrón, que escribe los datos en la base de datos de artefactos. Todos los nodos realizan una llamada API REST al nodo maestro para obtener y establecer la información más reciente sobre cada usuario. Si hay varias bases de datos de artefactos en uso, el administrador debe seleccionar un nodo maestro para cada base de datos de artefactos o centro de datos.

    Para seleccionar un nodo como maestro ESL, vaya al archivo de configuración del nodo de AD FS y, en la sección "Microsoft.IdentityServer.Service", agregue lo siguiente:

    En el patrón, agregue la siguiente entrada. Las tres claves distinguen mayúsculas de minúsculas.

    <useractivityfarmrole masterFQDN=[FQDN del principal seleccionado] isMaster="true"/>

    En los demás nodos, agregue la siguiente entrada:

    <useractivityfarmrole masterFQDN=[FQDN del principal seleccionado] isMaster="true"/>

    Nota

    Dado que varias bases de datos de artefactos no sincronizan datos, los valores de ESL no se sincronizarán entre bases de datos de artefactos. Un usuario puede alcanzar potencialmente un centro de datos diferente para una solicitud, por lo que la extranetLockoutThreshold depende del número de bases de datos de artefactos, ExtranetLockoutThreshold * Número de bases de datos de artefactos.

    • Detección de reproducción de token

      Los datos de detección de reproducción de tokens siempre se llaman desde la base de datos de artefactos central. AD FS guarda el token de la confianza del proveedor de notificaciones, lo que garantiza que no se pueda reproducir el mismo token. Si un atacante intenta reproducir el mismo token, AD FS comprueba si el token existe en la base de datos de artefactos. Si el token está presente, se rechazará la solicitud. La base de datos de artefactos central se usa para la seguridad, ya que los datos de la base de datos de artefactos no se replican, un atacante podría enviar la solicitud a otro centro de datos y reproducir un token. La creación de copias de solo lectura adicionales de la base de datos de artefactos no impedirá la latencia entre centros de datos en este escenario, ya que solo se usa la base de datos de artefactos central.