Wazuh: Enviar alertas via Discord

80 views
6 mins read

Introdução

Wazuh oferece integração como Slack, Jira ou e-mail, mas minha opnião, essa definitivamente não é a maneira mais confortável de ser notificado sobre um evento de segurança em sua casa. Com o Discord você pode receber o alerta no seu smartphone ou desktop, em tempo real o que ajudará em suas tarefas.

Nesse outro post, abordo a criação do alerta por Telegram


O Ambiente

Eu estou assumindo que você já esteja com o Wazuh instalado e funcionando. Em meu ambiente atual, estou com uma instalação em uma instância EC2 com Ubuntu, mas você pode seguir com qualquer distribuição Linux que preferir.

Se você estiver usando o Wazuh distribuído em clusters, irá precisar replicar toda esta configuração nas managers onde você queira que a integração funcione.

 


Criando um servidor no Discord

1- Abra o discord e no canto esquerdo selecione “Adicionar Um Servidor”

2- Preencha as informações para criar seu servidor e dê um nome

3- Crie um canal de texto (ou selecione o já criado por default “geral”)

4- Clique em “Editar Canal” (ícone da engrenagem)

5- Selecione “Integrações”

6- Crie um novo Webhook ou selecione o existente

7- Clique em “Copiar URL do Webhook”


Criando a integração

Requisitos

Assim como a integração do Telegram, é necessário o módulo request instalado no Linux

pip3 install requests

Scripts

Precisaremos de dois scripts. Um em bash e outro em python, a razão para isso é porque o script em bash vai funcionar como um launcher para o script em python, que é o core da integração.

Os dois scripts abaixo são de criação do time da Wazuh para o Slack. Apenas o “custom-discord.py” tem uma alteraçao para o Discord.

custom-discord

Copie o código do script “slack” para “custom-discord”

cp slack custom-discord

O conteúdo do script, é um bash e pode ser visto abaixo para que possa entender o que ele faz.

#!/bin/sh
# Copyright (C) 2015, Wazuh Inc.
# Created by Wazuh, Inc. <info@wazuh.com>.
# This program is free software; you can redistribute it and/or modify it under the terms of GPLv2
WPYTHON_BIN="framework/python/bin/python3"
SCRIPT_PATH_NAME="$0"
DIR_NAME="$(cd $(dirname ${SCRIPT_PATH_NAME}); pwd -P)"
SCRIPT_NAME="$(basename ${SCRIPT_PATH_NAME})"
case ${DIR_NAME} in
    */active-response/bin | */wodles*)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/../..; pwd)"
        fi
        PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    ;;
    */bin)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
        fi
        PYTHON_SCRIPT="${WAZUH_PATH}/framework/scripts/$(echo ${SCRIPT_NAME} | sed 's/\-/_/g').py"
    ;;
     */integrations)
        if [ -z "${WAZUH_PATH}" ]; then
            WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
        fi

        PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    ;;
esac
${WAZUH_PATH}/${WPYTHON_BIN} ${PYTHON_SCRIPT} "$@"

custom-discord.py

Com um editor de texto, crie o script

nano /var/ossec/integrations/custom-discord.py

E cole o conteúdo abaixo:

#!/usr/bin/env python
# Copyright (C) 2015, Wazuh Inc.
# March 13, 2018.
#
# This program is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public
# License (version 2) as published by the FSF - Free Software
# Foundation.
import json
import sys
import time
import os

try:
    import requests
    from requests.auth import HTTPBasicAuth
except Exception as e:
    print("No module 'requests' found. Install: pip install requests")
    sys.exit(1)

# ossec.conf configuration:
#  <integration>
#      <name>slack</name>
#      <hook_url>https://hooks.slack.com/services/XXXXXXXXXXXXXX</hook_url>
#      <alert_format>json</alert_format>
#  </integration>

# Global vars
debug_enabled = False
pwd = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
json_alert = {}
now = time.strftime("%a %b %d %H:%M:%S %Z %Y")
# Set paths
log_file = '{0}/logs/integrations.log'.format(pwd)

def main(args):
    debug("# Starting")
    # Read args
    alert_file_location = args[1]
    webhook = args[3]
    debug("# Webhook")
    debug(webhook)
    debug("# File location")
    debug(alert_file_location)
    # Load alert. Parse JSON object.
    with open(alert_file_location) as alert_file:
        json_alert = json.load(alert_file)
    debug("# Processing alert")
    debug(json_alert)
    debug("# Generating message")
    msg = generate_msg(json_alert)
    debug(msg)
    debug("# Sending message")
    send_msg(msg, webhook)

def debug(msg):
    if debug_enabled:
        msg = "{0}: {1}\n".format(now, msg)
        print(msg)
        f = open(log_file, "a")
        f.write(msg)
        f.close()

def generate_msg(alert):
    #save the rule level
    level = alert['rule']['level']
    #compare rules level to set colors of the alert
    if (level <= 4):
        #green
        color = "3731970"
    elif (level >= 5 and level <= 12):
        #yellow
        color = "15919874"
    else:
        #red
        color = "15870466"

    if 'agentless' in alert:
        agent_ = 'agentless'
    else:
        agent_ = alert['agent']['name']
    #data that the webhook will receive and use to display the alert in discord chat
    payload = json.dumps({
      "embeds": [
        {
          "title": "Wazuh Alert - Rule {}".format(alert['rule']['id']),
          "color": "{}".format(color),
          "description": "{}".format(alert['rule']['description']),
          "fields": [
            {
              "name": "Agent",
              "value": "{}".format(agent_),
              "inline": True
            },
            {
              "name": "Location",
              "value": "{}".format(alert['location']),
              "inline": True
            },
            {
            "name": "Rule Level",
            "value": "{}".format(alert['rule']['level']),
            "inline": True
            }
          ]
        }
      ]
    })
    return payload

def send_msg(msg, url):
    headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
    res = requests.post(url, data=msg, headers=headers)
    debug(res)

if __name__ == "__main__":
    try:
        # Read arguments
        bad_arguments = False
        if len(sys.argv) >= 4:
            msg = '{0} {1} {2} {3} {4}'.format(
                now,
                sys.argv[1],
                sys.argv[2],
                sys.argv[3],
                sys.argv[4] if len(sys.argv) > 4 else '',
            )
            debug_enabled = (len(sys.argv) > 4 and sys.argv[4] == 'debug')
        else:
            msg = '{0} Wrong arguments'.format(now)
            bad_arguments = True
        # Logging the call
        f = open(log_file, 'a')
        f.write(msg + '\n')
        f.close()
        if bad_arguments:
            debug("# Exiting: Bad arguments.")
            sys.exit(1)

        # Main function
        main(sys.argv)

    except Exception as e:
        debug(str(e))
        raise

Permissões dos arquivos

Dê as devidas permissões para os scripts

chmod 750 /var/ossec/integratios/custom-discord*
chown root:wazuh /var/ossec/integratios/custom-discord*

Adicionando informação no arquivo de configuração do Wazuh

Com um editor de texto, adicione o conteudo abaixo no arquivo de configuração.

  <integration>
    <name>custom-discord</name>
    <hook_url>https://discord.com/api/webhooks/hook</hook_url>
    <level>7</level>
    <alert_format>json</alert_format>
  </integration>
  1. Em <hook_url> coloque o código do webhook que conseguiu ao criar seu servidor do discord.
  2. Em <level> defina o nível do alerta que pretende receber os alertas.

Mais opções

Você pode adicionar mais tags para customizar quais alertas prefere receber, por exemplo adicionando a configuração

<group>suricata,sysmon</group> Somente as regras desses grupos vão disparar a integração.
<rule_id>10050,10051</rule_id> Somente as regras com esses IDs irão irão disparar a integração.

Reinicie o Wazuh Manager

Reinicie o Wazuh pelo terminal

systemctl restart wazuh-manager

Ou pela dashboard via navegador

Wazuh > Management > Configuration > Restart Manager

Exemplo de alerta

 


 

Sou um profissional apaixonado pela área de Segurança da Informação. Sou certificado em ISO 27001, ISO 27005, LGPD e GDPR, o que me torna um Data Protection Officer (DPO) certificado. Também sou certificado CC e SSCP pelo (ISC)², bem como um AWS Practitioner. Além do meu trabalho, sou um orgulhoso pai de três filhos, um nerd, um cinéfilo, um leitor voraz e um eterno aprendiz.

Deixe um comentário

Your email address will not be published.

Previous Story

Wazuh: Enviar alertas via Telegram

Next Story

Pentesting em ambiente Azure

Latest from Ferramentas

Git Exposed

Introdução A questão da segurança na era digital tornou-se rapidamente um tema quente. Todos nós já

AWS Cloudtrail + Wazuh

Introdução Depois de um tempo ausente (aprendendo sobre uma poderosa ferramenta de BI e suas consultas