Monitoreo de Estado de Actualizaciones para Windows con Nagios

Si hay una regla básica en Seguridad Informática es: parcheá!

Mantener los servidores y desktops actualizados es vital para estar seguros.

¿ Y cómo tener un control en tiempo real del estado de actualizaciones de nuestros equipos y servidores para garantizar que los parches estén al día ?

Incorporar el chequeo en nuestro Nagios !

En infraestructuras Windows, los sistemas pueden estar configurados para buscar updates en Internet directo, o a través de Windows Server Update Services (WSUS), el gestor de actualizaciones de Microsoft.

Si los equipos tienen configurado WSUS, podría ser más eficiente chequear directamente en ese servicio, para saber el estado de actualizaciones en la infraestructura.

A continuación vamos a armar un chequeo para chequear directamente WSUS (check_wsus) y otro para chequear updates direcatamente en los equipos (check_windows_updates).

Ambos son chequeos locales, que vamos a ejecutar mediante NSClient++ (el equivalente a NRPE de Linux, pero que a mi entender, está más maduro para plataformas Windows). Utiliza el mismo protocolo que nrpe, por lo tanto, lo vamos llamar desde Nagios de la misma manera mediante check_nrpe.

1) check_windows_updates:

Hice un fork del script original en el Exchange de Nagios a mi Github, para poder corregir algunas cosas y poder darle seguimiento según lo que necesitaba.

El script lo que hace es chequear el estado de actualizaciones en el equipo y escribirlo en $updateCacheFile, con la respectiva fecha del chequeo. Hay una variable de tiempo en horas que es $updateCacheExpireHours.
Cuando Nagios lo ejecuta, si el tiempo desde que se chequeó updates es mayor a esa variable, vuelve a chequear, sino, informa lo que hay en el $updateCacheFile. (La primera vez siempre chequea). Por lo tanto, el intervalo de chequeo desde Nagios, no debería ser menor a ese valor, si queremos hacerlo realmente eficiente.

Los posibles resultados son:

No updates available - OK (0)
Only Hidden Updates - OK (0)
Updates already installed, reboot required - WARNING (1)
Optional updates available - WARNING (1)
Critical updates available - CRITICAL (2)
Script errors - UNKNOWN (3)

Para configurarlo en Windows, se debe descargar y ubicar en la carpeta scripts de NSCLient++.

En nsclient.ini deben crear la sección (si es que aún no la tienen) external scripts con las settings basicas:

[/settings/external scripts]

allow arguments = true
allow nasty characters = true
script path = scripts
timeout = 60

Y la referencia al script propiamente dicha en una subsección:

[/settings/external scripts/scripts]

check_windows_updates = cmd /c echo scripts\check_windows_updates.ps1 $ARG1$ $ARG2$; exit $LastExitCode | powershell.exe -ExecutionPolicy Bypass -command -

En Nagios, utilizaremos el comando check_nrpe verificando que tenga definido un timeout alto ya que el proceso puede tardar más que los normales 60 segundos (por ej. 240):

define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 240
        }

Y definimos el servicio:

define service{
        use                             generic-service
        hostgroup_name                  windows-servers
        service_description             UPDATES
        check_command                   check_nrpe!check_windows_updates
        }

Con esto obtenemos el chequeo directamente en el servidor o equipo que hayamos definido:

2) check_wsus:

Para realizar este chequeo, basado en este script, hice un fork en mi Github nuevamente, para poder modificarlo según lo que necesite.

El script se conecta localmente o remotamente contra una instancia WSUS, por lo que hay setear las variables correspondientes de host y puerto (por default localhost y 8530).

Chequea PC Desactualizadas, PC Con Errores, PC Sin Contacto, PC Sin Asignar y Updates Sin Asignar.

Para configurarlo ubicamos el script en la carpeta scripts de NSClient++, y configuramos las secciones correspondientes:

[/settings/external scripts]

allow arguments = true
allow nasty characters = true
script path = scripts
timeout = 60

[/settings/external scripts/scripts]

check_wsus_server = cmd /c echo scripts\wsus_stacking.ps1; exit($lastexitcode) | powershell.exe -ExecutionPolicy Bypass -command -

En Nagios, utiliamos el mismo comando check_nrpe que en el chequeo anterior y definimos el servicio:

define service{
        use                             generic-service,srv-pnp
        hostgroup_name                  windows-servers
        service_description             WSUS UPDATES
        check_command                   check_nrpe!check_wsus_server
        }

Saludos, buen monitoreo !

@Gabriel Soltz

Read more