Wazuh采用多层架构,包括这些主要组件:代理、索引器、仪表板和中央服务器。
代理被安装在每个要监测的系统上,它们收集事件数据、日志和其他系统信息。代理可以安装在虚拟(包括云)和物理机上。
wazuh中央服务器负责管理代理,远程配置和更新它们。代理商收集的数据被发送到服务器,服务器负责处理和分析信息,根据预先配置的规则和它的威胁情报引擎寻找入侵点。
然后,数据从服务器被发送到索引器,索引器负责存储和索引日志和警报。索引器也是一个可扩展的文本搜索和分析引擎。
wazuh系统中的每个数据都可以从仪表盘上查看,这也是管理wazuh组件、创建规则和分析数据的好方法。
Wazuh SIEM还包括一个API,可以与其他安全工具和服务集成,从而实现更全面的安全解决方案。它可以作为一个单节点集群实施,也可以作为一个分布式解决方案。但在本实验过程中,我将把Wazuh作为一个单节点集群使用。
开源解决方案的优势。
开源供应商是如何赚钱的。
curl -sO https://packages.wazuh.com/4.3/wazuh-install.sh && sudo bash ./wazuh-install.sh -a
设备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中央结构进行分析和展示。
它也可能是一个假阳性(一个合法的用户可能忘记了登录细节)。
设置Wazuh代理。
sudo apt install nginx
syslog
/var/log/nginx/access.log
设置Wazuh服务器。
sudo wget https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/alienvault_reputation.ipset -O /var/ossec/etc/lists/alienvault_reputation.ipset
sudo echo "10.1.1.42" >> /var/ossec/etc/lists/alienvault_reputation.ipset
图3.2: 在信誉数据库中添加恶意IP。
sudo wget https://wazuh.com/resources/iplist-to-cdblist.py -O /tmp/iplist-to-cdblist.py
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
sudo rm -rf /var/ossec/etc/lists/alienvault_reputation.ipset
sudo rm -rf /tmp/iplist-to-cdblist.py
sudo chown wazuh:wazuh /var/ossec/etc/lists/blacklist-alienvault
web|attack|attacks
etc/lists/blacklist-alienvault
IP address found in AlienVault reputation database.
我通过在短时间内通过ssh和rdp会话输入错误的凭证,模拟了对所有3个端点的暴力攻击。在这次模拟中,我使用了一个带有用户名的无效凭证攻击者。
下面的图片显示了在我的SIEM仪表板上对攻击的检测。
作为一个分析员,这应该引起注意,不仅是因为其严重程度,而且是因为其在短时间内的频率。这可能是来自Hydra等自动化工具的暴力攻击的一个指标。
一个更持久的修复方法是审查IAM政策,以进一步加强基础设施。
配置电子邮件或Slack通道警报也可以用来检测此类警报,方法是为规则的严重程度设置警报,或调整规则的严重程度,使其与预设电子邮件警报的最低阈值相匹配。
sudo docker run -d --rm -p 9000:9000 strangebee/thehive:latest
我还创建了更多的用户,如老板和分析师,并将他们加入到组织中,以便有一个更好的模拟。
sudo /var/ossec/framework/python/bin/pip3 install thehive4py==1.8.1
#!/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
#!/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} $@
…
custom-w2thive
http://10.1.1.34:9000
bs+UW9HBLkDbw4tHeiAwQw413El3qO4W
json
…
页面更新:2024-04-21
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号