Detalles técnicos sobre el funcionamiento del agente Linux

Instalación y desinstalación del agente

El agente Linux se presenta como un paquete cuyo formato depende del sistema operativo en el que se instala (.deb, .rpm…). El agente Cyberwatch sigue las buenas prácticas de creación de un paquete de instalación Linux.

La instalación del agente Linux en los activos se realiza mediante la ejecución de un comando de instalación a recuperar desde la interfaz de Cyberwatch, a través del formulario de creación de un agente Linux. Este comando de instalación incluye los parámetros seleccionados en Cyberwatch para su instalación, como por ejemplo: los grupos, la URL de la instancia Cyberwatch…

La instalación del agente en un sistema Linux pasa por las siguientes etapas:

  • configuración del repositorio del activo objetivo para que conozca el paquete
  • instalación del paquete mediante el gestor del activo, recuperado desde el repositorio alojado en el servidor Cyberwatch
  • registro del agente en el servidor Cyberwatch mediante el método register del agente

De forma individual, la instalación del agente Linux puede realizarse copiando y pegando el comando de instalación propuesto por Cyberwatch directamente en el activo a supervisar. Para cualquier industrialización del despliegue, es posible automatizar la instalación del agente en los activos Linux utilizando una solución que permita ejecutar comandos sobre un conjunto de activos (p. ej. Ansible).

La desinstalación del agente se realiza como cualquier otro paquete Linux clásico, mediante los comandos previstos a tal efecto según el gestor de paquetes del activo en cuestión.

Opcional: también es posible descargar directamente el agente según el tipo de activo escaneado:

  • formato .deb (Debian, Ubuntu…)
  • formato .rpm (Red Hat, CentOS, Fedora…)

Funcionamiento del agente

En sistemas Linux, el agente funciona mediante un servicio systemd y un timer, ambos instalados con el paquete del agente. Estas dos unidades se parametrizan con el usuario que ejecuta el agente: la instalación activa la instancia cyberwatch-agent@root.timer.

A continuación se muestran los archivos relativos al funcionamiento del agente Cyberwatch creados en el sistema durante la instalación:

  • /usr/lib/systemd/system/cyberwatch-agent@.timer timer systemd lanzado cada 5 minutos
  • /usr/lib/systemd/system/cyberwatch-agent@.service servicio systemd activado por el timer y que ejecuta el programa cyberwatch-agent
  • /usr/bin/cyberwatch-agent enlace simbólico a /usr/share/cyberwatch-agent/cyberwatch-agent.py, el programa Python del agente Cyberwatch, cuyo código se instala en /usr/share/cyberwatch-agent/
  • /etc/cyberwatch-agent/agent.conf archivo de configuración del agente
  • el directorio /var/log/cyberwatch-agent/ que contiene el registro agent.log, archivado cada semana en agent.log.<fecha> (solo se conserva una copia archivada)

Como en Windows, la ejecución del agente simplemente conlleva una comunicación con la API de la instancia Cyberwatch que responderá con las posibles tareas a realizar en el activo en cuestión.

El agente Linux ofrece posibilidades de personalización como la modificación del timer o del servicio systemd. Esto permite, por ejemplo, modificar ciertos permisos relativos a la ejecución del agente o la frecuencia de ejecución del timer.

Actualizaciones del agente

Al igual que para el agente Windows, los cambios en el agente Linux se enumeran en el historial de versiones del agente Cyberwatch.

En sistemas Linux, la actualización del agente se gestiona mediante el gestor de paquetes

del activo, como un paquete Linux clásico. En efecto, cuando Cyberwatch publica una nueva versión del agente, esta se pone a disposición en el repositorio de la instancia on premise y por tanto está disponible para los activos en los que el repositorio se configuró durante la instalación.

Atención: si la actualización del agente se realiza tras un cambio del servidor de gestión, se deberá eliminar el archivo de configuración del agente previamente instalado. Un agente ya registrado no se vuelve a registrar en un nuevo servidor.

  • Debian, Ubuntu: apt purge cyberwatch-agent && rm -f /etc/cyberwatch-agent/agent.conf
  • Arch Linux: pacman -R cyberwatch-agent && rm -f /etc/cyberwatch-agent/agent.conf
  • Red Hat, SUSE y derivados: la desinstalación del paquete cambia el nombre del archivo de configuración a agent.conf.rpmsave, no es necesaria ninguna eliminación manual

Permitir la ejecución bajo otro usuario

Para ejecutar el agente bajo otro usuario, es necesaria una modificación de los permisos de los archivos de configuración y de los logs. Además, el timer systemd debe instanciarse con el usuario correcto:

export RESTRICTED_USER=cyberwatch-agent

chown $RESTRICTED_USER /etc/cyberwatch-agent/ -R
chown $RESTRICTED_USER /var/log/cyberwatch-agent/ -R

systemctl disable --now cyberwatch-agent@root.timer
systemctl enable --now cyberwatch-agent@$RESTRICTED_USER.timer

Restringir los privilegios del agente

Por defecto, el agente se ejecuta mediante systemd con el usuario root. Los privilegios del entorno de ejecución se restringen al mínimo necesario para permitir el funcionamiento óptimo de Cyberwatch.

Es posible configurar finamente los privilegios otorgados al agente Cyberwatch y ejecutarlo con un usuario no privilegiado. Esta sección detalla cómo proceder. Estos pasos son válidos para agentes en versiones 4.8 o posteriores. Estos comandos deben ejecutarse con un usuario privilegiado.

  1. Crear el usuario no privilegiado:

    export RESTRICTED_USER=cyberwatch-agent
    useradd $RESTRICTED_USER
    
  2. Desactivar el timer systemd responsable de ejecutar el agente cada 5 minutos:

    systemctl disable --now cyberwatch-agent@root.timer
    
  3. Conceder al usuario no privilegiado acceso de lectura y escritura a los archivos de configuración y de log:

    chown $RESTRICTED_USER /etc/cyberwatch-agent -R
    chown $RESTRICTED_USER /var/log/cyberwatch-agent -R
    
  4. Activar el timer systemd del agente con el nuevo usuario:

    systemctl enable --now cyberwatch-agent@$RESTRICTED_USER.timer
    

Cyberwatch es capaz de ejecutar sus escaneos de vulnerabilidad cuando el agente usa un usuario no privilegiado. Sin embargo, para ciertas operaciones, como el despliegue de parches, la ejecución de algunos escaneos o la verificación de scripts de cumplimiento, es necesario que se ejecuten comandos en modo privilegiado.

Opcional - Permitir que el agente ejecute ciertos comandos con privilegios

Para permitir que un usuario no privilegiado ejecute ciertos comandos con privilegios, Cyberwatch recomienda usar el mecanismo sudoers.

  1. Editar el archivo /etc/sudoers.d/cyberwatch-agent:

    sudo visudo -f /etc/sudoers.d/cyberwatch-agent
    
  2. Escribir en el archivo las configuraciones deseadas:

    # Cyberwatch-agent privileges
    
    ## 'id' is used by the 'cyberwatch-agent check' command to determine whether
    ## or not the agent has sudoers rights on the asset.
    
    cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/id
    
    # ---
    
    ## Package managers are used if you ask Cyberwatch to deploy patches or to
    ## remove packages, depending on the type of system monitored. 'pacman' is only
    ## used to uninstall the agent. 'apt-get' requires the SETENV tag.
    
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/apt-get
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/dnf
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/yum
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/zypper
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/snap
    # cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/pacman
    
    # ---
    
    ## 'shutdown' will be used if you wish to perform reboots on your assets directly
    ## from Cyberwatch.
    
    cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/sbin/shutdown
    
    # ---
    
    ## 'ss' is used for ports scans, allowing to run the command with sudoers rights
    ## allows Cyberwatch to get the processes that own the ports;
    
    cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/ss
    
    # ---
    
    ## 'dmidecode' is used to retrieve the BIOS metadata, the command requires sudoers
    ## rights to be run.
    
    cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/sbin/dmidecode
    
    # ---
    
    ## 'docker' is needed with sudoers rights to perform a vulnerability scan on all 
    ## found Docker images.
    
    cyberwatch-agent ALL=(ALL) NOPASSWD:SETENV: /usr/bin/docker
    
  3. Sobrescribir el archivo de configuración del servicio systemd:

    systemctl edit --full cyberwatch-agent@$RESTRICTED_USER.service
    

    Este comando abre en el editor de texto del sistema un archivo de configuración que tendrá prioridad sobre el archivo de servicio instalado.

    Por defecto, el servicio systemd está configurado para impedir elevaciones de privilegios. Es necesario desactivar estas protecciones para permitir el uso de sudo.

  4. Comentar las líneas siguientes:

    # LockPersonality=true
    # NoNewPrivileges=true
    # ProtectClock=true
    # ProtectHostname=true
    # ProtectKernelLogs=true
    # ProtectKernelTunables=true
    # RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
    # RestrictSUIDSGID=true
    

    Cuando se activa, cada una de estas reglas implica que la opción NoNewPrivileges también esté activada. Por tanto, es necesario desactivar estas opciones.

  5. Guardar el archivo

  6. Recargar las configuraciones systemd:

    systemctl daemon-reload