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>
- Em <hook_url> coloque o código do webhook que conseguiu ao criar seu servidor do discord.
- 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