Problema

En entornos con controladores de dominio (DC) que exponen servicios como LDAPS, GC‑SSL o WinRM sobre HTTPS, la seguridad de la capa TLS es crítica. Con el tiempo, los Cipher Suites antiguos (por ejemplo, DHE con claves pequeñas o CBC) se vuelven inseguros y deben deshabilitarse. Sin embargo, desactivar un suite sin saber si alguna aplicación todavía depende de él puede provocar fallos de autenticación o replicación. El reto es obtener una visión real del tráfico TLS entrante, identificar qué suites se están negociando y hacerlo sin interrumpir la disponibilidad del DC.

Causa

Los DC utilizan el proveedor Schannel de Windows para todas las negociaciones TLS. Por defecto, Schannel registra solo errores críticos; la información detallada del handshake exitoso (Event ID 36880) está desactivada. Cuando la auditoría no está habilitada, no hay rastro en los logs que indique qué suite se usó en cada conexión. Además, la falta de una herramienta centralizada obliga a inspeccionar manualmente cada controlador, lo que no escala en entornos con varios DC.

Solución

La estrategia combina tres pasos:

  1. Activar el registro detallado de Schannel para que cada handshake exitoso quede anotado en el log de Sistema.
  2. Recopilar los eventos de forma centralizada mediante PowerShell y enviarlos a un repositorio (por ejemplo, un share de archivos o un SIEM).
  3. Procesar los registros para extraer los Cipher Suites, agrupar por IP origen y generar un informe que muestre la frecuencia de cada suite.

1. Habilitar el registro de handshakes

En Windows Server 2019 basta con crear/modificar la clave de registro:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Diagnostics" /v "EventLogging" /t REG_DWORD /d 1 /f

EventLogging = 1 habilita la generación del Event 36880 para cada conexión TLS exitosa. El impacto en rendimiento es prácticamente nulo; el registro añade una única línea por handshake, lo que en un DC típico representa menos de 0.1 % de la carga de I/O.

2. Recopilación centralizada

Un script programado (Task Scheduler) ejecuta cada 10 minutos y exporta los eventos del último intervalo:

# PowerShell script (Save as Collect-TlsEvents.ps1)
$LogName = 'System'
$Id = 36880
$Since = (Get-Date).AddMinutes(-10)
$Events = Get-WinEvent -FilterHashtable @{LogName=$LogName; Id=$Id; StartTime=$Since}
$Output = $Events | ForEach-Object {
    $msg = $_.Message -replace "`r`n"," "
    [pscustomobject]@{
        TimeCreated = $_.TimeCreated
        Computer    = $env:COMPUTERNAME
        SourceIP    = ($msg -match 'Source IP:\s+([0-9\.]+)') ? $matches[1] : 'unknown'
        CipherSuite = ($msg -match 'Cipher Suite:\s+([\w-]+)') ? $matches[1] : 'unknown'
    }
}
$Output | Export-Csv -Path "\\centralshare\TLSLogs\$($env:COMPUTERNAME)_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation

El script extrae Source IP y Cipher Suite del mensaje del evento, los convierte en CSV y los escribe en un share accesible por todos los DC. La frecuencia de ejecución puede ajustarse según la carga y el nivel de detalle deseado.

3. Análisis y reporte

Una vez que los CSV están en el share, un segundo script los agrupa:

# PowerShell aggregation (Run on a workstation)
$Folder = "\\centralshare\TLSLogs"
$Data = Get-ChildItem $Folder -Filter *.csv | Import-Csv
$Report = $Data | Group-Object -Property CipherSuite | Sort-Object Count -Descending |
    Select-Object @{Name='CipherSuite';Expression={$_.Name}}, Count
$Report | Export-Csv -Path "$Folder\CipherSuiteSummary_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

El resumen muestra cuántas veces se negoció cada suite y permite identificar rápidamente los que aparecen con tráfico significativo. Si un suite “TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA” aparece solo una o dos veces, es probable que sea un cliente legado que se pueda actualizar o reemplazar.

Cuándo aplicar esta solución

  • Entornos con varios DC que exponen TLS (LDAPS, GC‑SSL, WinRM).
  • Necesidad de cumplimiento (PCI‑DSS, CIS Benchmarks) que exige la eliminación de suites débiles.
  • Fases de hardening donde se quiere validar el impacto antes de cambiar la política de cifrado.

No es necesario si:

  • El DC está aislado y no recibe tráfico externo; en ese caso, una revisión manual de clientes conocidos suele ser suficiente.
  • Ya se dispone de un SIEM que captura tráfico TLS a nivel de red y correlaciona suites; la auditoría de eventos locales sería redundante.

Código

reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Diagnostics" /v "EventLogging" /t REG_DWORD /d 1 /f
# Collect-TlsEvents.ps1 (ver sección 2)
# Aggregation script (ver sección 3)

Verificación

  1. Comprobar que el registro está activo: abre el Visor de eventos → Sistema → filtro por ID 36880. Deberías ver entradas recientes con “TLS server handshake completed successfully”.
  2. Ejecutar el script de recolección manualmente y validar que el CSV contiene columnas TimeCreated, Computer, SourceIP y CipherSuite.
  3. Revisar el reporte: abre el archivo CipherSuiteSummary_*.csv y verifica que los suites esperados (por ejemplo, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) aparecen con mayor frecuencia que los débiles.
  4. Desactivar una suite de prueba (por ejemplo, una CBC antigua) usando Disable-TlsCipherSuite -Name "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA" y repetir la captura durante 24 h. Si el número de eventos para esa suite cae a cero, la desactivación es segura.

Notas adicionales

  • Impacto de rendimiento: el registro de Schannel solo escribe una línea por handshake; en un DC con cientos de conexiones por segundo el archivo de eventos crece a varios MB por día, lo que sigue siendo manejable.
  • Replicación entre DCs: la comunicación interna de AD usa Kerberos y RPC, no TLS, por lo que desactivar suites débiles no afecta la replicación, siempre que no haya servicios personalizados que usen LDAPS entre controladores.
  • Clientes legados: equipos con Windows 7/Server 2008 R2 pueden depender de suites DHE < 1024 bits. Si aparecen en el reporte, evalúa actualizar o crear una excepción temporal.
  • Retención de logs: configura la política de retención del log de Sistema para al menos 30 días mientras realizas la auditoría; de lo contrario, los eventos antiguos se perderán.
  • Seguridad del share: protege el share donde se depositan los CSV con ACL restrictivas; los archivos contienen direcciones IP internas que podrían ser sensibles.

Con este enfoque puedes obtener datos reales de uso de Cipher Suites, validar la ausencia de dependencias y aplicar Disable‑TlsCipherSuite con la confianza de que no romperás servicios críticos.