使用Wazuh和TheHive的开源SIEM解决方案

Wazuh采用多层架构,包括这些主要组件:代理、索引器、仪表板和中央服务器。

代理被安装在每个要监测的系统上,它们收集事件数据、日志和其他系统信息。代理可以安装在虚拟(包括云)和物理机上。

wazuh中央服务器负责管理代理,远程配置和更新它们。代理商收集的数据被发送到服务器,服务器负责处理和分析信息,根据预先配置的规则和它的威胁情报引擎寻找入侵点。

然后,数据从服务器被发送到索引器,索引器负责存储和索引日志和警报。索引器也是一个可扩展的文本搜索和分析引擎。

wazuh系统中的每个数据都可以从仪表盘上查看,这也是管理wazuh组件、创建规则和分析数据的好方法。

Wazuh SIEM还包括一个API,可以与其他安全工具和服务集成,从而实现更全面的安全解决方案。它可以作为一个单节点集群实施,也可以作为一个分布式解决方案。但在本实验过程中,我将把Wazuh作为一个单节点集群使用。

开源解决方案的优势。

  1. 它们为定制提供了更大的灵活性,因为用户可以访问源代码,可以为开发做出贡献,并修改软件以适应他们的具体使用情况。
  2. 它们大多是免费使用和分发的;这就使它们成为用户的成本效益选择。
  3. 它们通常有一个用户(开发者)社区的支持,他们为软件做出贡献,提供支持,并分享知识。

开源供应商是如何赚钱的。

  1. 高级功能。大多数开放源码供应商提供免费版软件所不具备的高级特性和功能;因此他们对这些特性的使用收费。
  2. 付费支持和服务。许多开源供应商提供付费支持和服务,如咨询、培训和定制,以帮助公司实施和维护软件。
  3. 双重许可。一些开放源码供应商提供双重或多重许可模式,允许软件在开放源码许可和商业许可下可用。这使他们能够向需要商业许可的企业出售该软件。

任务1:建立基础设施

  1. 我使用安装助手安装了Wazuh服务器。关于如何做的详细步骤见这里。运行以下命令。
curl -sO https://packages.wazuh.com/4.3/wazuh-install.sh && sudo bash ./wazuh-install.sh -a

  1. 现在服务器已经安装成功,我使用https://<服务器的ip>访问它,并使用安装后提供的初始admnin凭证登录。

设备1(Windows端点)。

我按照以下步骤在我的windows端点上安装了wazuh代理。

我刷新了页面,我的windows代理被注册,并在仪表板上被检测到是一个代理,如下图所示。

设备2(Linux端点)。

我按照这些步骤为我的ubuntu机器重复了上述步骤。

我刷新了页面,我的linux代理被注册了,并在仪表板上被检测到是一个代理,如下图所示。

设备3(Linux端点)。

我按照设备2的相同步骤登上了设备3,这是一台ubuntu机器。

我现在可以查看所有3个被监控的终端的日志,如下图所示。

为什么我可以查看日志? 我可以查看这些日志,因为安装在端点上的wazuh代理从机器上收集日志,并将其发送到wazuh中央服务器(管理器),后者分析日志并根据配置的规则集运行,包括威胁情报。然后,日志被发送到索引器,存储在索引中以便于查询。然后我可以从索引器中查询日志,并使用wazuh仪表板进行分析,如上文图1.8所示。

可见日志的解释

日志1:这是一个从windows服务器端点记录的windows登录成功事件。如果前面的事件是暴力攻击的指标,如多次失败的登录尝试,这个事件可以作为防御规避、特权升级和成功的暴力攻击的指标。

在windows机器上,登录成功被登记为安全事件日志。如前所述,Wazuh代理会将这些日志发送到Wazuh核心结构之上。如图2.8所示,你可以确定机器的IP地址和其他相关细节,以帮助分析日志数据。

由分析员在查看了前面的日志后确定这是否是成功入侵的指标。

日志2:这是我的一个Linux端点的登录失败。如果在很短的时间内反复出现失败,这也可以作为企图入侵的一个指标。linux机器将该事件注册为日志,并将其保存在/var/log/auth.log中,由wazuh代理收集并运送到wazuh中央结构进行分析和展示。

它也可能是一个假阳性(一个合法的用户可能忘记了登录细节)。

任务2:阻止恶意的IP地址

设置Wazuh代理。

  1. 为了开始阻止恶意的IP地址,我在设备3上使用以下命令安装了Nginx。
sudo apt install nginx

  1. 我测试了一下,我可以从我的IP地址为10.1.1.42的 "恶意机器 "用curl到达服务器。

  1. 为了让wazuh代理监控Nginx日志,我在/var/ossec/etc/ossec.conf文件中添加了以下配置,并使用sudo systemctl重启wazuh-agent,重新启动了wazuh代理。

    syslog
  /var/log/nginx/access.log

设置Wazuh服务器。

  1. 我下载了Alienvault的IP信誉数据库,并使用以下命令将其输出到文件/var/ossec/etc/lists/alienvault_reputation.ipset中。
sudo wget https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/alienvault_reputation.ipset -O /var/ossec/etc/lists/alienvault_reputation.ipset
  1. 然后我用下面的命令将攻击机器的IP输入到Alienvault的IP信誉数据库中。
sudo echo "10.1.1.42" >> /var/ossec/etc/lists/alienvault_reputation.ipset

图3.2: 在信誉数据库中添加恶意IP。

  1. 我从wazuh下载了一个脚本,用以下命令将.ipset格式转换为.cdb。
sudo wget https://wazuh.com/resources/iplist-to-cdblist.py -O /tmp/iplist-to-cdblist.py
  1. 然后我用之前下载的脚本将之前创建的 alienvault_reputation.ipset 文件转换为 .cdb 格式。下面的命令完成了转换。
sudo /var/ossec/framework/python/bin/python3 /tmp/iplist-to-cdblist.py /var/ossec/etc/lists/alienvault_reputation.ipset /var/ossec/etc/lists/blacklist-alienvault
  1. 由于我不再需要 alienvault_reputation.ipset 文件和 iplist-to-cdblist.py 脚本,我用以下命令丢弃了它们。
sudo rm -rf /var/ossec/etc/lists/alienvault_reputation.ipset
sudo rm -rf /tmp/iplist-to-cdblist.py
  1. 我用下面的命令给了wazuh足够的权限给新的和转换的/var/ossec/etc/lists/blacklist-alienvault文件。
sudo chown wazuh:wazuh /var/ossec/etc/lists/blacklist-alienvault
  1. 成功完成上述程序后,我继续配置Wazuh的主动响应模块,阻止 "恶意IP"
  2. 我在/var/ossec/etc/rules/local_rules.xml文件中创建了一个自定义规则,以触发主动响应脚本,规则严重程度为12级。自定义规则集如下。

    
          web|attack|attacks
    etc/lists/blacklist-alienvault
    IP address found in AlienVault reputation database.
  

  1. 我编辑了wazuh服务器上的/var/ossec/etc/ossec.conf文件,并在规则集部分创建了一个etc/lists/blacklist-alienvault列表。

  1. 我编辑了/var/ossec/etc/ossec.conf文件的主动响应部分,确保来自攻击者机器的流量被丢弃300秒,如下图3.5所示。

  1. 在攻击者的机器上进行的快速测试表明,第一次curl测试是成功的,但随后5分钟内的curl操作是不成功的。

  1. 我也能在我的wazuh仪表板上检测到该事件,如以下图片所示。

任务3:模拟蛮力攻击检测

我通过在短时间内通过ssh和rdp会话输入错误的凭证,模拟了对所有3个端点的暴力攻击。在这次模拟中,我使用了一个带有用户名的无效凭证攻击者。

下面的图片显示了在我的SIEM仪表板上对攻击的检测。

  1. 我在安全事件仪表板上发现认证失败的数量增加了。

作为一个分析员,这应该引起注意,不仅是因为其严重程度,而且是因为其在短时间内的频率。这可能是来自Hydra等自动化工具的暴力攻击的一个指标。

  1. 我钻研了一下,通过探索安全警报来确定认证失败激增的根本原因。我发现在很短的时间内,我的基础设施内的主机出现了多次一致的登录失败。

  1. 我进一步分析了其中一个显示攻击的日志,我可以检测到登录会话来自一个远程IP 10.1.1.100,有一个不存在的用户攻击者。这些尝试的一致性是一个明显的暴力尝试指标,可以通过使用网络保护设备或该节点上的wazuh代理阻止攻击者的IP来暂时补救,这可以通过遵循本指南实现。

一个更持久的修复方法是审查IAM政策,以进一步加强基础设施。

配置电子邮件或Slack通道警报也可以用来检测此类警报,方法是为规则的严重程度设置警报,或调整规则的严重程度,使其与预设电子邮件警报的最低阈值相匹配。

任务4:SOC整合(将theHive与Wazuh整合)。

  1. 为了开始实施,我决定使用容器版的theHive。我运行了以下docker命令来运行最新版本的theHive。
sudo docker run -d --rm -p 9000:9000 strangebee/thehive:latest
  1. 我登录到蜂巢,创建了一个组织,如下图5.0所示。

  1. 我在组织中添加了一个新的管理用户,具有完全的管理权限,如下图所示。

我还创建了更多的用户,如老板和分析师,并将他们加入到组织中,以便有一个更好的模拟。

  1. 我为先前创建的用户账户生成了一个API密钥,并复制了它。

  1. 我继续配置Wazuh管理器,首先用下面的命令安装Hive python模块。
sudo /var/ossec/framework/python/bin/pip3 install thehive4py==1.8.1
  1. 我在/var/ossec/integrations/custom-w2thive.py文件中粘贴了以下python脚本,以便创建一个自定义的集成脚本。
#!/var/ossec/framework/python/bin/python3
import json
import sys
import os
import re
import logging
import uuid
from thehive4py.api import TheHiveApi
from thehive4py.models import Alert, AlertArtifact

# start user config
# Global vars

#threshold for wazuh rules level
lvl_threshold=0
#threshold for suricata rules level
suricata_lvl_threshold=3
debug_enabled = False
#info about created alert
info_enabled = True
#end user config
# Set paths
pwd = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
log_file = '{0}/logs/integrations.log'.format(pwd)
logger = logging.getLogger(__name__)
#set logging level
logger.setLevel(logging.WARNING)
if info_enabled:
      logger.setLevel(logging.INFO)
if debug_enabled:
      logger.setLevel(logging.DEBUG)
# create the logging file handler
fh = logging.FileHandler(log_file)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

def main(args):
    logger.debug('#start main')
    logger.debug('#get alert file location')
    alert_file_location = args[1]
    logger.debug('#get TheHive url')
    thive = args[3]
    logger.debug('#get TheHive api key')
    thive_api_key = args[2]
    thive_api = TheHiveApi(thive, thive_api_key )
    logger.debug('#open alert file')
    w_alert = json.load(open(alert_file_location))
    logger.debug('#alert data')
    logger.debug(str(w_alert))
    logger.debug('#gen json to dot-key-text')
    alt = pr(w_alert,'',[])
    logger.debug('#formatting description')
    format_alt = md_format(alt)
    logger.debug('#search artifacts')
    artifacts_dict = artifact_detect(format_alt)
    alert = generate_alert(format_alt, artifacts_dict, w_alert)
    logger.debug('#threshold filtering')
    if w_alert['rule']['groups']==['ids','suricata']:
            #checking the existence of the data.alert.severity field
                    if 'data' in w_alert.keys():
                                if 'alert' in w_alert['data']:
                                                #checking the level of the source event
                                                                if int(w_alert['data']['alert']['severity'])<=suricata_lvl_threshold:
                                                                                    send_alert(alert, thive_api)
    elif int(w_alert['rule']['level'])>=lvl_threshold:
            #if the event is different from suricata AND suricata-event-type: alert check lvl_threshold
                    send_alert(alert, thive_api)

def pr(data,prefix, alt):
    for key,value in data.items():
            if hasattr(value,'keys'):
                        pr(value,prefix+'.'+str(key),alt=alt)
        else:
                    alt.append((prefix+'.'+str(key)+'|||'+str(value)))
    return alt

def md_format(alt,format_alt=''):
    md_title_dict = {}
    #sorted with first key
        for now in alt:
                now = now[1:]
        #fix first key last symbol
                dot = now.split('|||')[0].find('.')
        if dot==-1:
                    md_title_dict[now.split('|||')[0]] =[now]
        else:
                    if now[0:dot] in md_title_dict.keys():
                                    (md_title_dict[now[0:dot]]).append(now)
            else:
                            md_title_dict[now[0:dot]]=[now]
    for now in md_title_dict.keys():
            format_alt+='### '+now.capitalize()+'
'+'| key | val |
| ------ | ------ |
'
        for let in md_title_dict[now]:
                    key,val = let.split('|||')[0],let.split('|||')[1]
            format_alt+='| **' + key + '** | ' + val + ' |
'
    return format_alt

def artifact_detect(format_alt):
    artifacts_dict = {}
    artifacts_dict['ip'] = re.findall(r'd+.d+.d+.d+',format_alt)
    artifacts_dict['url'] =  re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+',format_alt)
    artifacts_dict['domain'] = []
    for now in artifacts_dict['url']: artifacts_dict['domain'].append(now.split('//')[1].split('/')[0])
    return artifacts_dict

def generate_alert(format_alt, artifacts_dict,w_alert):
    #generate alert sourceRef
        sourceRef = str(uuid.uuid4())[0:6]
    artifacts = []
    if 'agent' in w_alert.keys():
            if 'ip' not in w_alert['agent'].keys():
                        w_alert['agent']['ip']='no agent ip'
    else:
            w_alert['agent'] = {'id':'no agent id', 'name':'no agent name'}
    for key,value in artifacts_dict.items():
            for val in value:
                        artifacts.append(AlertArtifact(dataType=key, data=val))
    alert = Alert(title=w_alert['rule']['description'],
                                tlp=2,
                                tags=['wazuh', 
                                                    'rule='+w_alert['rule']['id'], 
                                                    'agent_name='+w_alert['agent']['name'],
                                                    'agent_id='+w_alert['agent']['id'],
                                                    'agent_ip='+w_alert['agent']['ip'],],
                                description=format_alt ,
                                type='wazuh_alert',
                                source='wazuh',
                                sourceRef=sourceRef,
                                artifacts=artifacts,)
    return alert

def send_alert(alert, thive_api):
    response = thive_api.create_alert(alert)
    if response.status_code == 201:
            logger.info('Create TheHive alert: '+ str(response.json()['id']))
    else:
            logger.error('Error create TheHive alert: {}/{}'.format(response.status_code, response.text))

if __name__ == "__main__":
    try:
           logger.debug('debug mode') # if debug enabled       
                  # Main function
       main(sys.argv)
    except Exception:
       logger.exception('EGOR')ssec/integrations/custom-w2thive
  1. 我创建了一个bash脚本来执行先前在这个文件/var/ossec/integrations/custom-w2thive中创建的python脚本。
#!/bin/sh
# Copyright (C) 2015-2020, Wazuh Inc.
# Created by Wazuh, Inc. .
# This program is free software; you can redistribute it and/or modify it under the terms of GP>
  
  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/${SCRIPT_NAME}.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} $@
  1. 为了使wazuh成功运行集成脚本,我在wazuh管理器的confi文件/var/ossec/etc/ossec.conf中加入了以下几行。我还输入了IP地址、端口和之前生成的API密钥。

      custom-w2thive
    http://10.1.1.34:9000    
        bs+UW9HBLkDbw4tHeiAwQw413El3qO4W
    json
  
  1. 我用sudo systemctl重新启动了wazuh-manager服务。
  2. 为了测试theHive是否在接收日志,我以其中一个用户的身份登录,我可以看到所有创建的案例,并对它们进行深入研究,以及分配给组织内的用户。

展开阅读全文

页面更新:2024-04-21

标签:攻击者   警报   脚本   索引   命令   解决方案   规则   服务器   文件   用户   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top