Automatiza la actualización Offline de plugins en Tenable.sc

Automatiza la actualización Offline de plugins en Tenable.sc

Si tienes una infraestructura de Gestión de Vulnerabilidades con Tenable.sc y no puedes conectar los servidores directamente a internet - por ejemplo en una red clasificada - tienes que actualizar los plugins para las vulnerabilidades de manera regular igualmente. Cuando puedes conectar tu servidor Tenable.sc a internet, todo va como la seda, pero en caso contrario, en una red desconectada o ‘air gapped’, si no quieres tener que estar subiendo los plugin cada día o semana a través de la interfaz gráfica de Tenable.sc, aquí te traigo una forma de automatizar todo el proceso - dependiendo de tu configuración y como pasas archivos a la red desconectada, puede ser completamente automático o al menos parcialmente.

El proceso es el siguiente, descargo los plugins de la página de Tenable, los paso a la red desconectada, vía un diodo o con un USB/disco duro externo a un servidor web; desde mi servidor Tenable.sc los bajo y cargo en el sistema con scripts, y si algún scanner no consigue sincronizar por problemas de red (esto lo explico más adelante), también lo actualizo vía script.

Descargando plugins de Tenable

Para descargar los plugins, necesitamos una URL que va asociada a nuestra licencia. Se puede conseguir de dos maneras, registrando un scanner Nessus offline, o con el informe de diagnóstico del servidor tenable.sc, donde también encontramos los parámetros para construir la URL de descargas.

Nessus offline

Si instalas un nuevo scanner, selecciona la opción de registro Offline y copia el código challenge.

Challenge Code

Si ya tienes un scanner instalado y registro offline, abre un terminal en el sistema donde esté el scanner Nessus y ejecuta este comando:

nessuscli fetch --challenge

Esto nos da un código ‘challenge’ que copiamos y pegamos en esta página

Recibimos un enlace de descarga, algo parecido a esto:

URL

Edit 05/03/2022: La URL del sitio no es la correcta para descargar plugins de Tenable.sc, solo Nessus. De aquí solo necesitamos la parte del usuario y la contraseña. LA URL correcta empieza así: https://plugins.nessus.org/get.php

https://plugins.nessus.org/get.php?f=all-2.0.tar.gz&u=3f09asdf0934…

Guardamos la URL que usaremos después para descargar los archivos que necesitamos.

Informe de diagnóstico de Tenable.sc

  1. Login en el servidor de Tenable.sc como administrador

  2. Vamos a System > Diagnostics

  3. Creamos el archivo de diagnóstico y descargamos el archivo.

  4. Abrimos el archivo comprimido y buscamos el archivo sc-configuration.txt.

  5. Tenemos que copiar los valores de los siguientes campos:

PluginSubscriptionLogin

PluginSubscriptionPassword
  1. Con ellos podemos construir la URL para descarga:

**Edit 05/03/2022: The URL in the site is not correct for downloading Tenable.sc plugins, only Nessus.

https://plugins.nessus.org/get.php?f=all-2.0.tar.gz&u=PluginSubscriptionLogin_value&p=PluginSubscriptionPassword_value

Archivos de Plugins

Con la URL que hemos conseguido con uno de los métodos anteriores, podemos descargar los 3 archivos que necesitamos:

 sc-plugins-diff.tar.gz

 SecurityCenterFeed48.tar.gz

 all-2.0.tar.gz

Para descargarlos, reemplazamos el nombre de archivo en el enlace:

https://plugins.nessus.org/get.php?f=sc-plugins-diff.tar.gz&u=3f09assdf90rg…
https://plugins.nessus.org/get.php?f=SecurityCenterFeed48.tar.gz&u=3f09assdf90rg…
https://plugins.nessus.org/get.php?f=all-2.0.tar.gz&u=3f09asdf0934…

Mi sugerencia es crear un pequeño script en Bash o Powershell en un equipo con conexión a internet para que se descarguen a diario. Idealmente en un sistema con acceso al diodo de transferencia de archivos a la red desconectada, o con posibilidad de extraerlos en un soporte externo. Algo así:

#!/usr/bin/sh

curl https://plugins.nessus.org/get.php?f=all-2.0.tar.gz&u=3f09asdf0934… -o /data_diode/plugins/all-2.0.tar.gz
sleep 3
curl https://plugins.nessus.org/get.php?f=SecurityCenterFeed48.tar.gz&u=3f09assdf90rg… -o /data_diode/plugins/SecurityCenterFeed48.tar.gz
sleep 3
curl https://plugins.nessus.org/get.php?f=sc-plugins-diff.tar.gz&u=3f09assdf90rg… -o /data_diode/plugins/sc-plugins-diff.tar.gz

Actualizando los plugins en Tenable.sc

Una vez que los archivos han sido transferidos a la red desconectada, los subimos a un repositorio accesible vía un servidor web desde nuestro tenable.sc.

Ahora vamos a configurar la descarga y procesado de plugins in Tenable.sc. Abrimos un terminal vía SSH o vía la pestaña de terminal en la GUI de Tenable Core en el puerto 8000 de nuestro servidor. Necesitaremos permisos de root para completar esta tarea.

Primero, un script para descargar los plugins desde el sitio donde los pusimos en el paso anterior(puede ser ejecutado con un usuario normal)

#!/usr/bin/sh

curl http://www.repoplace.local/plugins/all-2.0.tar.gz -o /plugins/all-2.0.tar.gz
sleep 3
curl http://www.repoplace.local/plugins/SecurityCenterFeed48.tar.gz -o /plugins/SecurityCenterFeed48.tar.gz
sleep 3
curl http://www.repoplace.local/plugins/sc-plugins-diff.tar.gz -o /plugins/sc-plugins-diff.tar.gz

Un segundo script que carga los plugins en Tenable.sc(para este necesitamos permisos de root)

#!/usr/bin/sh

#Run as root
/bin/su -c "/opt/sc/support/bin/php /opt/sc/src/tools/pluginUpdate.php /tmp/sc-plugins-diff.tar.gz" - tns
/bin/su -c "/opt/sc/support/bin/php /opt/sc/src/tools/pluginUpdate.php /tmp/SecurityCenterFeed48.tar.gz" - tns

Mi sugerencia es combinar los dos en un solo script, de tal manera que bajamos los plugins y a continuación los cargamos en el sistema; ponemos el script en CRON para ejecutarse a diario o cada vez que tengamos planeado poner plugins nuevos en la red desconectada, y esto hará el trabajo por nosotros 😉

Si tus scanners de Nessus están administrados desde el servidor Tenable.sc, los plugins son transferidos automáticamente. Pero - siempre hay un pero - este proceso falla a veces, dependiendo de la velocidad y latencia de la conexión desde tenable.sc a los scanners. Los escaneos funcionan sin problema incluso en conexiones de muy mala calidad, pero el traspaso de plugins suele fallar en redes conectadas vía satélite por ejemplo.

La solución sugerida por Tenable es aumentar el timeout en la configuración tienes la referencia aquí.

En mi caso esto no es suficiente, y la carga de plugins en los scanners mal conectados falla igualmente.

En el mismo artículo explican como hacer una carga inicial de los plugins cuando instalamos un nuevo scanner, pero yo voy a mostrar otro método más sencillo que permite actualizar regularmente aquellos scanners que sabemos que con toda probabilidad van a quedar en estado ‘Plugins out of Sync’ cuando actualicemos los plugins en tenable.sc

Automatizando la actualización de plugins Nessus

Primero siempre configuro autenticación con clave públice desde mi servidor Tenable.sc o servidor bastión con acceso SSH a mis scanners Nessus, así no necesito contraseñas en los scripts. Aquí una referencia para hacer esta configuración.

Creamos en los scanners donde necesitamos actualizar de esta manera un script de una sola línea, cambia la ruta donde se encontrará el archivo para que se ajuste a tu entorno:

/opt/nessus/sbin/nessuscli update /home/admin/all-2.0.tar.gz

Ahora debemos permitir que dicho script sea ejecutado como root por el usuario administrador del scanner sin necesidad de contraseña, para ello añadimos la siguiente línea en el archivo de SUDOERS.

Admin ALL = (root) NOPASSWD /home/admin/update_scanner.sh

Donde update_scanner.sh es el nombre del script que creamos en el paso anterior.

IMPORTANTE: cambia los permisos de ‘update_scanner.sh’ para que solo root pueda editarlo, o puedes introducir un vulnerabilidad de escalada de privilegios si alguien cambia el contenido de el archivo.

chown root: update_scanner.sh

chmod 750 update_scanner.sh

A continuación el script que transfiere los plugins y ejecuta la actualización localmente en todos los scanners.

Necesita dos archivos, uno el de los plugins, que si lo hacemos desde el servidor Tenable.sc y hemos usado el proceso explicado más arriba, ya debemos tener el archivo necesario para actualizar los scanners - all-2.0.tar.gz. El segundo archivo contiene una lista de los scanners donde realizar la actualización con el siguiente formato, cambiando el nombre del usuario que va a hacer la transferencia:

admin@scanner1
admin@scanner2
...

Contenido del script:

#/usr/bin/sh

# This is a script to copy plugins Nessus scanners and then load them
# There are 2 variables accepted via commandline
# $1 = first parameter (/source_path/source_filename)
# $2 = second parameter (file that contains list of hosts)

SOURCEFILE=$1

HOSTFILE=$2

if [ -f $SOURCEFILE ]
then
    printf "File found, preparing to transfer\n"
    while read server
    do
        scp -p $SOURCEFILE ${server}:
        ssh -t ${server} "sudo /home/admin/update_scanner.sh"
    done < $HOSTFILE
else
    printf "File \"$SOURCEFILE\" not found\n"
    exit 0
fi
exit 0

Así ejecutamos el script:

./transfer_plugins ./all-2.0.tar.gz scanners.txt

Fíjate que este script copia los plugins a todos los servidores del archivo scanners.txt secuencialmente; en mi caso me vale porque los scanners problemáticos son pocos, si necesitas hacer esto con más de 2-3 scanners, lo suyo sería cambiar el script para hacer la copia del archivo en paralelo a todos los scanners; dejamos esto como ejercicio para el lector 😉

Una vez ejecutado el script y el archivo transferido a los scanners, verás como el estado del scanner cambia a ‘Working’ en la interfaz de tenable.sc.

Conclusión

Una red desconectada siempre supone más trabajo, pero con un poco de imaginación y maña, podemos hacer nuestra vida más fácil y dejar que todo fluya sin tener que estar haciendo tareas repetitivas manualmente.

Este proceso es también fácilmente aplicable a las actualizaciones trimestrales del software de tenable.sc y Nessus; tal vez en una próxima entrada lo explique.


Ver también