Respondiendo a Eventos de manera automatizada, con Ansible Rulebooks.

La automatización basada en eventos permite al equipo de SecOps ejecutar acciones predefinidas automáticamente en respuesta a eventos específicos dentro de un entorno. Este enfoque mejora la eficiencia operativa al reducir la intervención manual y permite que los sistemas se adapten rápidamente a las condiciones cambiantes. Ansible nos ayuda al incorporar funciones basadas en eventos para ofrecer soporte a una automatización dinámica y receptiva.

Arquitectura

Para emplear la Automatización de Ansible Basada en Eventos, es fundamental entender tres conceptos:

  1. Fuente de Eventos

  2. Ansible Rulebooks

  3. Acciones

Las fuentes son el origen de los eventos que desencadenarán el proceso para ser evaluado por las condiciones del ansible rulebook. Si se cumplen estas condiciones, se procederá a ejecutar un playbook, un módulo o, en su defecto, invocar un script. Esto hace de esta herramienta una excelente opción para diversos casos de uso.

Instalación

Vamos a actualizar.

sudo apt update && sudo apt upgrade -y

Ahora es el turno de Java.

sudo apt install openjdk-17-jdk
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$PATH:~/.local/bin

Vamos agregar Python3 con Pip, siempre necesario, y Pipx para tener en todo nuestro entorno ansible.

sudo apt install python3 python3-pip pipx ansible-core
pipx install ansible
pipx install ansible-rulebook
pipx install ansible-runner

Ahora la frutilla del postre, ansibe.eda.

ansible-galaxy collection install ansible.eda

Ya tenemos nuestro servidor, listo.

Prueba de Concepto

Este es un ejemplo de ansible-rulebook para supervisar cambios utilizando el módulo ansible.eda.file_watch. Envía un mensaje a Slack cuando se cumple la condición event.change == "modified" o event.change == "created". En mi caso, quiero supervisar /home/santiago/data, pero ¿no sería una buena idea monitorear, por ejemplo, /etc/passwd, /etc/shadow?

filewatch.yml
---
- name: Monitor /home/santiago for file changes
  hosts: localhost
  sources:
    - name: file_watch
      ansible.eda.file_watch:
        path: /home/santiago/data
        recursive: true
        exclude_patterns:
          - "*.log"
          - "*.tmp"
  rules:
    - name: Notify Slack if a file is modified
      condition: event.change == "modified" and event.type == "FileModifiedEvent"
      action:
        run_playbook:
          name: notify-slack.yml
          extra_vars:
            event_path: "{{ event.src_path }}"
            event_change: "{{ event.change }}"
      throttle:
        once_within: "60 seconds"  # Formato correcto: "60 seconds"
        group_by_attributes:       # Agrupa eventos por estos atributos
          - src_path              # Agrupa por la ruta del archivo

    - name: Notify Slack if a new file is created
      condition: event.change == "created" and event.type == "FileCreatedEvent"
      action:
        run_playbook:
          name: notify-slack.yml
          extra_vars:
            event_path: "{{ event.src_path }}"
            event_change: "{{ event.change }}"
      throttle:
        once_within: "60 seconds"  # Formato correcto: "60 seconds"
        group_by_attributes:       # Agrupa eventos por estos atributos
          - src_path              # Agrupa por la ruta del archivo

Si estas condiciones se cumplen, ejecuta notify-slack.yml.

notify-slack.yml
---
- name: Send Slack Notification
  hosts: localhost
  tasks:
    - name: Debug event variables
      debug:
        msg:
          - "Event Path: {{ event_path }}"
          - "Event Change: {{ event_change }}"

    - name: Send message to Slack
      community.general.slack:
        token: "ACA_TOKEN" # Seria mejor que esto este como variable en un .ini o hagas un export
        channel: "#alarms" # Este es el canal que uso.
        msg: "🚨 Archivo detectado en /home/santiago/data: {{ event_path }} ({{ event_change }})"
        username: "Ansible Bot"
💡
Si no sabes como crear una aplicacion en Slack, para poder interactuar en el feed. Revisa esta documentacion.

Creamos nuestro inventorio, en mi caso solo lo hare local pero podrias tener una granja de servidores a monitorear. Vamos a llamarlo inventory.yml.

all:
  children:
    ungrouped:
      hosts:
        localhost:
          ansible_connection: local

Ejecutamos Ansible Event Drive Automation de la siguiente manera, haciendo referencia al inventario de activos y al playbook.

ansible-rulebook -i inventory.yml -r filewatch.yml

Primero, creamos el archivo.txt y luego realizamos una modificación. Aquí observamos cómo se ejecutan los eventos y se notifican en Slack. La creación provoca una modificación al guardarlo.

Aquí están los mensajes que nos llegan a Slack.

Conclusion

Con EDA no tenemos límites; podemos aplicarlo a múltiples escenarios, como responder ante incidentes, escalar infraestructura, reiniciar servicios o cumplir con regulaciones. Sin duda, es un aliado al considerar la operación de SecOps o DevOps. ¡Dejemos volar la imaginación!

Referencias

https://developers.redhat.com/articles/2024/04/12/event-driven-ansible-rulebook-automation#ansible_rulebook_cli_setup

https://dzone.com/articles/ansible-event-driven-automation-real-time-operations

0
Subscribe to my newsletter

Read articles from Santiago Fernandez directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Santiago Fernandez
Santiago Fernandez

I have a bachelor's degree in Technology from the University of Palermo, a Master in Information Security from the University of Murcia and different certifications such as CISSP | CISM | CDPSE | CCSK | CSX | MCSA | SMAC™️ | DSOE | DEPC | CSFPC | CSFPC | 5x AWS Certified. He is currently CISO at Klar, a Mexican Fintech. He was fortunate to be awarded as CISO of the Year in Argentina in 2021 and was among the Top 100 CISO's in the World in 2022. A lover of new technologies, he has developed a career in DevSecOps and Cloud Security at Eko Party, the largest security conference in Latin America.