概述
通过开源软件可以构建一个安全应急响应平台,该平台可以进行日志整合、告警生成、IoC 丰富与事件管理。
在上面的流程图中,作为 HIDS 的 Wazuh 将数据发送回 Wazuh Manager 与 Elasticsearch。ElastAlert 观测到新事件并在 TheHive 中相应生成告警。然后通过 Cortex 与 MISP 查询额外信息丰富该事件,之后自动关闭该事件或提交给分析师。
请注意,系统中的任何端点服务或者可以生成日志传送给 Elasticsearch 的 Agent 都可以被替代。该套系统的好处在于绝大多数的组件都可以替换。
Wazuh
Wazuh 是一个开源安全监控解决方案,用于收集、分析主机安全数据。Wazuh 是 OSSEC 项目的分支。Wazuh 组件与 Elasticsearch 和 Kibana 的整合度很高,可以用来执行许多与安全相关的任务,如日志分析、Rootkit 检测、监听端口检测、文件完整性检测等。
Elasticsearch
Elasticsearch 将充当整个系统的日志存储库。Elasticsearch 非常强大,具备很多功能。常与 Logstash(日志收集)和 Kibana(可视化)结合使用。Elasticsearch 为所有类型的数据存储都提供了一个强大的平台。
ElastAlert
ElastAlert 是由 Yelp 发起的项目,为 Elasticsearch 提供告警机制。ElastAlert 通过 REST API 查询 Elasticsearch 并有多个输出来匹配告警。
TheHive
TheHive 是一个可扩展的、开源、免费安全应急响应平台,旨在让任何安全从业人员能够轻松地处理安全事件,并快速地采取行动。本质上讲 TheHive 是一个告警管理平台,用于管理全部事件告警。
Cortex
Cortex 与 TheHive 是一个团队开发的产品。Cortex 使用分析器获取日志中有关指标信息的其他数据。允许在第三方服务中查询 IP、URL 与文件哈希等指标,并将第三方返回的结果作为附加信息丰富告警事件。
MISP
MISP 是 CIRCL 维护的开源威胁情报共享平台,其 Feed 可以是某个组织提供的付费订阅,也可以是社区维护的开源订阅,这也是数据丰富的主要来源。
Elasticsearch 安装
首先部署 Elasticsearch 集群,系统使用 Ubuntu 16.04(文章使用虚拟机安装,DHCP 为该虚拟机预留了地址,确保其始终使用相同的 IP 地址)。
作者提供了 Vagrantfile 帮助配置构建 Elasticsearch 虚拟机。
ELK 安装
注意:TheHive 正在进行一些后端重构,这会导致设置复杂化。TheHive 背后的开发团队认为 Elasticsearch 已经不再满足它们的需求了,4.0 版本后将在后端使用 GraphDB。当前稳定版本 3.2.1 版本以及我们在此使用的 beta 版本 3.3.0 都是用 Elasticsearch 5.6 作为后端。因此,在虚拟机中需要部署 Elasticsearch、Logstash 和 Kibana 6.6.1 作为日志存储仓库,另一个 Elasticsearch 5.6.15 部署在 TheHive 虚拟机中作为后端。
虽然我总结了安装步骤,但是如果需要进一步了解细节可以查看安装指南。
# 首先安装 Java,选择使用 OpenJDK 安装
sudo apt-get install openjdk-8-jre
# 添加密钥与仓库
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
sudo apt-get update
# 为了防止更新破坏 SearchGuard,选择安装固定版本的 Elasticsearch
apt-cache policy elasticsearch
sudo apt-get install elasticsearch=6.6.1 logstash=1:6.6.1-1 kibana=6.6.1
# 阻止软件更新
sudo apt-mark hold elasticsearch logstash kibana
# 将 Elasticsearch、Logstash 和 Kibana 设置为自启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl enable logstash.service
sudo systemctl enable kibana.service
# 未来确定好兼容性,可以进行升级
sudo apt-mark unhold elasticsearch
优化
默认情况下,Elasticsearch 依赖的 Java 堆的大小为 1 GB。可以通过修改 /etc/elasticsearch/jvm.options
中的 Xms1g 与 Xmx1g 参数,将其增加到总内存的 50-80%。我的虚拟机只有 4GB 内存,所以我保留了默认值。
编辑配置文件 /etc/elasticsearch/elasticsearch.yml
:
取消 cluster.name 和 node.name 的注释,并设置为不同的名字
设置 bootstrap.memory_lock 为 True
设置 network.host 为 0.0.0.0
设置 discovery.type 为 single-node
编辑服务 sudo systemctl edit elasticsearch.service
:
[Service]
LimitMEMLOCK=infinity
然后继续执行:
# 重新加载
sudo systemctl daemon-reload
# 重新启动
sudo systemctl start elasticsearch.service
# 检查确保 Elasticsearch 可用
curl http://localhost:9200/_cat/health
应该可以看到类似的响应:
1551641374 19:29:34 demo-cluster green 1 1 0 0 0 0 0 0 - 100.0%
Kibana
编辑 Kibana 的配置文件:sudo nano /etc/kibana/kibana.yml
设置 Kibana 来响应外部接口:server.host: 0.0.0.0
启动服务:sudo systemctl start kibana.service
打开浏览器:http://<IP-OF-VM>:5601
应该可以看到 Kibana 控制台
Logstash
按照如下命令执行:
sudo apt install logstash
sudo systemctl enable logstash.service
sudo systemctl daemon-reload
注意:此时 Logstash 没有运行。
Wazuh 安装
这部分将讲述如何安装 Wazuh Manager,并将 Wazuh 与 Elasticsearch 进行集成。
使用 Wazuh 的 Agent 及其规则集来识别端点的行为并生成告警。这些告警从 Wazuh 的 Agent 转发到 Wazuh Manager 写入 /var/ossec/logs/alerts/alerts.json
。Filebeat 的服务不断监视该文件的更改,然后转发给 Elasticsearch。
Wazuh Manager
# 为 Wazuh 仓库安装 GPG 密钥
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | apt-key add -
# 添加仓库
echo "deb https://packages.wazuh.com/3.x/apt/ stable main" | tee -a /etc/apt/sources.list.d/wazuh.list
# 升级
sudo apt update
# 安装
sudo apt install wazuh-manager
详情请参见官方文档
Wazuh API
Wazuh API 是连接 Kibana 所必需的。Wazuh API 的默认账户密码是 foo/bar,如果想要变更可以查阅文档。
# 安装 NodeJS
sudo curl -sL https://deb.nodesource.com/setup_8.x | bash -
sudo apt install nodejs
# 安装 Wazuh API
sudo apt install wazuh-api
# 取消自动更新
sudo apt-mark hold wazuh-manager
sudo apt-mark hold wazuh-api
Filebeat
curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-6.x.list
sudo apt update
sudo apt install filebeat=6.6.1
首先安装 Filebeat:
# 取消自动更新
sudo apt-mark hold filebeat
# 下载 Filebeat 配置文件
sudo curl -so /etc/filebeat/filebeat.yml https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/filebeat/filebeat.yml
# 编辑配置文件
sudo nano /etc/filebeat/filebeat.yml
在末尾的 YOUR_ELASTIC_SERVER_IP
部分替换为 Elasticsearch 6.6.1 服务器的真实 IP。
启动 Filebeat 服务:
sudo systemctl daemon-reload
sudo systemctl enable filebeat.service
sudo systemctl start filebeat.service
加载 Wazuh 模版
为 Elasticsearch 加载 Wazuh 模板。在 Elasticsearch 主机上运行此命令:curl https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/elasticsearch/wazuh-elastic6-template-alerts.json | curl -X PUT "http://localhost:9200/_template/wazuh" -H 'Content-Type: application/json' -d @-
加载 Logstash 配置
下载用于 Wazuh 远程安装的 Logstash 配置文件,在 Elasticsearch 主机上运行此命令:curl -so /etc/logstash/conf.d/01-wazuh.conf https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/logstash/01-wazuh-remote.conf
确保使用新配置文件运行 Logstash 服务:sudo systemctl restart logstash.service
安装 Kibana
首先尝试运行 Wazuh 文档中提供的命令:sudo -u kibana NODE_OPTIONS="--max-old-space-size=3072" /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip
如果发现错误:
Plugin installation was unsuccessful due to error "Command failed: /usr/share/kibana/node/bin/node /usr/share/kibana/src/cli --env.name=production --optimize.useBundleCache=false --server.autoListen=false --plugins.initialize=false
Browserslist: caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
之所以运行命令 npm update caniuse-lite browserslist
产生错误,是因为本机尚未安装 Node。
卸载了插件并在没有 NODE 选项的情况下运行命令:sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip
。此时安装将会成功,然后重新启动。
安装 Wazuh Agent
根据你自己的系统情况按照说明进行安装,本文在 Linux 上进行安装。
安装后,需要在 ossec.conf 中编辑 Wazuh Manager 的 IP 地址。Debian 的 Agent 安装在 /var/ossec,编辑 sudo nano /var/ossec/etc/ossec.conf
改变 MANAGER_IP 即可。
Agent 注册
我们使用简单的,不安全的方法注册 Agent:
在 Manager 上,运行以下命令启动注册服务:/var/ossec/bin/ossec-authd
在 Agent 上,使用 Manager 的 IP 地址运行 agent-auth 程序
对于 Linux 来说:
/var/ossec/bin/agent-auth -m <MANAGER_IP_ADDRESS>
对于 Windows 来说:
C:\Program Files (x86)\ossec-agent\agent-auth.exe -m <MANAGER_IP_ADDRESS>
应该可以看到如下输出:
INFO: No authentication password provided.
INFO: Connected to xxx.xxx.xxx.xxx:1515
INFO: Using agent name as: xxxxxxx
INFO: Send request to manager. Waiting for reply.
INFO: Received response with agent key
INFO: Valid key created. Finished.
INFO: Connection closed.
Wazuh 仪表盘
此时连接到 Kibana,就会在左侧工具栏中发现 Wazuh 的图标,点击此按钮跳转到配置 API 的页面:
Username: foo
Password: bar
Server: http://<WAZUH_Server_IP>
API Port: 55000
保存 API 配置,然后点击跳转到 Overview 页面。点击页面顶端的 Agent 即可查看 ID 为 001 的 Agent,即之前注册好的主机。它显示为 Active 状态即视为正常,否则可能需要在 Agent 上确保更改 MANAGER_IP 成功并重启 Agent 的服务。
测试
在 Kibana 中,深入到 Management > Elasticsearch > Index Management 应该可以看到名为 wazuh-monitoring-3.x
的索引。然后转到 Management > Kibana > Index Patterns,如果还没有定义默认索引模式,点击 wazuh-monitoring,然后点击右上角的星号将其设为默认值。
点击 Discover 查看已创建的事件,可能暂时还没有。返回 Elasticsearch Index Management 页面,等待名为 wazuh-alerts 的索引出现。我们试图通过生成告警让其出现。
作为测试,转到另一个主机并尝试使用虚假的用户通过 SSH 登录主机:ssh fakeuser@<wazuh_agent_IP>
。这将会触发主机的 auth.log 出现无效的登录尝试,这将被 Wazuh Agent 获取,在新创建的 wazuh-alerts 索引中生成新条目。现在,我们就得到了一个存储告警的仓库。
MISP 部署
部署 MISP 可以允许 Cortex 或者任何能够发起简单 REST 请求的程序查询威胁指标,如 IP 地址、URL 与文件哈希。MISP 可以自主添加订阅与查询的源,返回的信息取决于订阅源提供的数据,而且订阅源之间的差异很大。有些只是提供了数据列表,有些提供了大量额外的信息。
将 MISP 通过 Docker 进行部署相比通过源码安装容易得多,哈佛安全小组提供了一个示例。请注意:如果将其部署到生产环境中,应该使用 build.sh,这样就可以在构建之前更改默认的 MySQL 密码与 MISP_FQDN。
初始化 MISP 数据库:docker run -it --rm -v /docker/misp-db:/var/lib/mysql harvarditsecurity/misp /init-db
。这可以启动容器,运行脚本使用必要的数据库文件填充 misp-db 目录,最后删除容器。如果查看 misp-db 目录,可以发现已经新增了文件。
生成 SSL 证书
如果不生成 SSL 证书,Cortex 就不能请求 MISP,按照如下命令生成证书:sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /docker/certs/misp.key -out /docker/certs/misp.crt
,如果没有特殊要求,可以接受所有默认选项。
运行容器
docker run -it -d \
-p 443:443 \
-p 80:80 \
-p 3306:3306 \
-v /docker/certs:/etc/ssl/private \
-v /docker/misp-db:/var/lib/mysql \
harvarditsecurity/misp
打开浏览器访问 https://localhost
,使用 admin@admin.test
和 admin
作为用户名与密码。系统会要求更改密码,新的密码至少包含 12 个字符,其中包含大写字母和特殊字符。
配置 MISP
在 Administration > Server Settings 与 Maintenance > MISP Settings 中设置 MISP.live
为 TRUE、MISP.disable_emailing
为 TRUE。
在 Sync Actions > List Feeds 的列表中选择订阅源进行订阅。我选了 malwaredomainlist,选中复选框然后点击顶部的 Enable Feed 就可以了。在列表中可以看到该订阅源,点击向下箭头就可以拉取所有事件,可以在 Administration > Jobs 处查看正在执行的任务。
点击放大镜图标,可以显示 IP 的列表,复制其中任意一个,之后会用到。
Postman
我们使用 Postman 来测试 API,在 File > Settings 中将 SSL certificate verification
设为 OFF。
在 MISP 中,在 Administration > List Users 中拷贝用户的身份密钥。在 Postman 中设置 Header 中的三个字段:
Accept application/json
Contect-Type application/json
Authorization <API_Key>
将用户的身份密钥粘贴到 Authorization 字段中。
在顶部将 REST 命令从 GET 改为 POST,API 设置为: https://localhost/attributes/restSearch
。
换到 Body 选项卡,点击 Raw 按钮并粘贴以下 JSON,将值替换为之前复制的 IP 地址:
{
"returnFormat": "json",
"value": "8.8.8.8"
}
应该会接收到以下响应:
{
"response": {
"Attribute": [
{
"id": "15",
"event_id": "1",
"object_id": "0",
"object_relation": null,
"category": "Network activity",
"type": "ip-dst",
"to_ids": false,
"uuid": "5c8550db-5314-4538-a0d8-0146ac110002",
"timestamp": "1552240859",
"distribution": "0",
"sharing_group_id": "0",
"comment": "",
"deleted": false,
"disable_correlation": false,
"value": "23.253.130.80",
"Event": {
"org_id": "1",
"distribution": "0",
"id": "1",
"info": "malwaredomainlist feed",
"orgc_id": "1",
"uuid": "5c8550db-2d90-425f-9bc5-0146ac110002"
}
}
]
}
}
此时,MISP 现在已经可以响应查询请求,为 Cortex 的加入做好了准备。返回订阅列表可以添加更多订阅源,在 Administration > Scheduled Tasks 中可以将 fetch_feeds 设置为 24 并点击 Update All 就可以配置好定时拉取任务。
TheHive & Cortex
这篇文章部署的 TheHive 3.3.0 RC5 与 Cortex stable v2.1.2,而 TheHive 4.1 版本(预计在 2019 年第二季度发布)后将取消 Elasticsearch 作为后端,转而使用 GraphDB。
注:后续使用 3.3.0 稳定版安装也可以正常使用。
安装 TheHive & Elasticsearch 5.6
# 添加仓库与密钥
echo 'deb https://dl.bintray.com/thehive-project/debian-beta any main' | sudo tee -a /etc/apt/sources.list.d/thehive-project.list
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
curl https://raw.githubusercontent.com/TheHive-Project/TheHive/master/PGP-PUBLIC-KEY | sudo apt-key add -
# 更新并安装需要的 Java
sudo apt-get update
sudo apt-get install openjdk-8-jre
# 安装 Elasticsearch 5.6.15,这是仓库中最新的版本
sudo apt-get install elasticsearch
# 修改配置文件
sudo nano /etc/elasticsearch/elasticsearch.yml
cluster.name: hive
bootstrap.memory_lock: true
discovery.type: single-node
# 设置服务自启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# 检查响应
curl http://localhost:9200
# 如果安装成功继续安装 TheHive
sudo apt-get install thehive=3.3.0-0.1RC5
# 阻止版本更新
apt-mark hold elasticsearch thehive
# 编辑配置文件
sudo nano /etc/thehive/application.conf
# 取消注释,并更改密码
#play.http.secret.key
# 设置服务自启动
sudo systemctl daemon-reload
sudo systemctl enable thehive
sudo systemctl start thehive
打开浏览器,查看网站:http://<TheHiveIP>:9000
,应该可以看到数据库更新消息:
点击 Update Database,如果没有看到上面的消息而是看到了登录框,意味着与 Elasticsearch 的连接中断了,请检测日志 \var\log\thehive
。
更新完成后,仍然有机会为管理员账户更改用户名与密码。还可以检查 Elasticsearch 名为 the_hive_14
的索引:curl http://127.0.0.1:9200/_cat/indices?v
。
如果忘记了管理员的账户与密码,请删除此索引重新开始。
安装 Cortex
注:安装 Cortex 3.0.0-RC1 会遇到一些问题,安装 Cortex 2.1.3 则不会遇到。
在 TheHive 主机上安装 Cortex:
sudo apt-get install cortex=2.1.3-1
sudo apt-mark hold cortex
安装 Cortex 有一些依赖需要先安装:
sudo apt-get install -y --no-install-recommends python-pip python2.7-dev python3-pip python3-dev ssdeep libfuzzy-dev libfuzzy2 libimage-exiftool-perl libmagic1 build-essential git libssl-dev
sudo pip install -U pip setuptools && sudo pip3 install -U pip setuptools
安装 Cortex Analyzer
从 GitHub 拉取源代码,为每个 Analyzer 单独安装 requirements.txt 的依赖:
cd /etc/cortex
git clone https://github.com/TheHive-Project/Cortex-Analyzers
本文的下载位置在:/etc/cortex
:
# 更改文件夹权限
chown -R root:cortex Cortex-Analyzers
# 为所有 Analyzer 安装依赖(两行作为一条命令执行)
for I in $(find Cortex-Analyzers -name 'requirements.txt'); do sudo -H pip2 install -r $I; done && \
for I in $(find Cortex-Analyzers -name 'requirements.txt'); do sudo -H pip3 install -r $I || true; done
安装依赖不可避免地会出现一些错误,解决此类办法的好方法是挑选要安装哪些 Analyzer 防止依赖冲突。修改 Cortex 的配置文件 application.conf 指向 Cortex-Analyzers 目录:sudo nano /etc/cortex/application.conf
。取消注释 #play.http.secret.key
,并更改密码。找到 ## ANALYZERS
的位置,将其改为 /etc/cortex/Cortex-Analyzers/analyzers
。
启动 Cortex:
sudo systemctl enable cortex
sudo systemctl start cortex
打开浏览器检查安装是否成功:http://<TheHiveIP>:9001
。更新数据库并创建管理员用户登录,就像安装 TheHive 时做的那样。
Cortex 中规定必须在组织账户下登录才能启用、管理 Analyzer,否则只能创建组织与用户。
点击 +Add Organization
创建一个新组织,切换到 Users 标签页点击 +Add User
创建一个新用户,并且将新用户分配给创建的组织并分配 OrgAdmin
角色。保存后,点击 New Password
为刚创建的用户设置密码,按回车键保存。然后注销账户,用新用户登录。点击顶部的 Organization 标签页,点击 Analyzers 子选项卡,而不是顶部蓝色的 Analyzers 选项卡。如果 Cortex 配置正确,应该可以看到 Analyzers,按照我的配置安装了 113 个可用的 Analyzer。
可以启用以下几个 Analyzer,接受默认配置:
Abuse_Finder_2_0
CyberCrime-Tracker_1_0
Cyberprotect_ThreatScore_1_0
DShield_lookup_1_0
MISP_2_0
URLhaus_2_0
Urlscan_io_Search_0_1_0
除了 MISP 之外,这些都不需要 API 密钥或者进行进一步的配置。 点击 Users 子选项卡并创建一个新用户和 TheHive 集成。该用户应该分配 read & analyze
角色,这次可以不用为其设置密码,点击 Create API Key
并且拷贝该密钥。
点击页面顶端的 +New Analysis
:
不用管 TLP 与 PAP
更改数据类型为 IP
添加 8.8.8.8
选中你启用的 Analyzer 旁边的框
点击开始
修改 TheHive 的 application.conf 来指向 Cortex:sudo nano /etc/thehive/application.conf
。滚动到底部,找到 #Cortex
部分,取消注释 play.modules.enabled += connectors.cortex.CortexConnector
。
添加 API 密钥与 URL:
play.modules.enabled += connectors.cortex.CortexConnector
cortex {
"CORTEX-SERVER-ID" {
url = "http://127.0.0.1:9001"
key = "wrXichGSPy4xvjpWVdeQoNmoKn9Yxnsn"
# # HTTP client configuration (SSL and proxy)
# ws {}
}
}
重启服务器,两个服务再次启动的时候就可以使用了。在 TheHive 点击 +New Case
测试 Cortex:
给事件一个名称与描述,然后打开这个事件,点击 Observables 选项卡,点击 +Add Observable
设置 Type = IP、Value = 1.1.1.1、Tag 为 test。只需要提供 tag 或者 description,不必二者都填。
在 Observable 列表中点击该 IP 地址,这将打开一个新选项卡,包含相关数据,也可以在底部看到 Analyzer:
点击 Run All
,如果返回 Cortex 将会看到 Analyzer 在 Job History 标签页中运行。回到 TheHive,现在 Analyzer 应该有了最后分析的时间与日期。返回 Observables 选项卡并刷新页面,应该可以在 Observables 下看到一个标签列表:
导入报告模版
在 https://dl.bintray.com/thehive-project/binary/report-templates.zip 下载报告模版包。使用管理员帐号登录 TheHive,点击 Admin > Report templates 选择 Import templates
,在其中选择下载的包。
现在,在 Observables 中点击最后分析时间时将会获得包含分析结果的报告:
启用 MISP
在 MISP 的页面上点击 Administration > Add User:
给用户分配一个电子邮件,cortex@admin.test
将用户添加到 ORGNAME 组织
分配角色 user
取消底部所有复选框
拷贝用户 API 密钥
在 Cortex 的页面上点击 Organization > Analyzers,在搜索框中输入 misp,然后启用 MISP_2_0
:
为 MISP 服务器提供描述
URL = https://
key = AuthKey from MISP user you created
cert_check: False
现在回到 MISP 页面,点击 Sync Actions > List Feeds。找到其中一个订阅源,然后点击右侧放大镜,从列表中选择一个 IP 并复制。
在 Cortex 中点击 +New Analysis
,添加 IP 的数据类型,然后粘贴复制的 IP 地址。选择 MISP_2_0
的 Analyzer 运行。在 Job History 页面点击 View 将会看到复制的 IP 列表名与其他信息。可以在 TheHive 中添加此 IP 为 Observables 进行测试。现在已经将 TheHive、MISP 与 Coretx 集成在了一起。
ElastAlert
最后一步是安装 ElastAlert 从 Elasticsearch 中的事件中生成警报。ElastAlert 当前版本要求 Python 2.7,本文安装在了 Elasticsearch 主机上:
sudo apt install python-pip
pip install elastalert
安装位置在:/home/username/.local/bin/elastalert
,注:ElastAlert 也有 Docker 镜像提供。
配置 ElastAlert
创建一个目录来存储配置和规则:mkdir -p ~/elastalert/rules
。可以拉取公开配置文件或者制作自己的配置文件,复制如下必要的设置,保存为 ~/elastalert/config.yaml
:
rules_folder: /home/username/elastalert/rules
run_every:
minutes: 1
buffer_time:
minutes: 15
es_host: x.x.x.x
es_port: 9200
use_ssl: False
writeback_index: elastalert_status
alert_time_limit:
days: 2
运行 elastalert-create-index
在 Elasticsearch 中创建必要的索引。可以得到以下结果:
Elastic Version:6
Mapping used for string:{'type': 'keyword'}
New index elastalert_status created
Done!
创建规则
在 TheHive 页面中点击 Admin > Users,创建一个名为 elastalert 的用户,但不为其分配角色,并选中 elastalert
。点击 Create API Key
并拷贝 API 密钥。TheHive 的管理指南指出:“为了更好地审计,一旦创建了用户,就无法删除该用户,只能锁定该账户”。
每条规则定义要执行的查询,触发匹配的参数与每个匹配触发的告警列表。本文中创建一个规则来识别失败的 SSH 登录,编辑规则文件 nano ~/elastalert/rules/failed_ssh_login.yaml
:
es_host: x.x.x.x
es_port: 9200
name: SSH Failed Login
type: frequency
index: wazuh-alerts-3.x-*
num_events: 2
timeframe:
hours: 1
filter:
- term:
rule.id: "5710"
alert: hivealerter
hive_connection:
hive_host: http://x.x.x.x
hive_port: 9000
hive_apikey: <Paste API key for elastalert user here>
hive_alert_config:
type: 'external'
source: 'elastalert'
description: '{rule[name]}'
severity: 2
tags: ['{rule[name]}', '{match[agent][ip]}', '{match[predecoder][program_name]}']
tlp: 3
status: 'New'
follow: True
hive_observable_data_mapping:
- ip: "{match[src_ip]}"
注意最后将 Observables 映射为 Types 的部分。尽管可以在标签字段使用嵌套的字段名({match[data][srcip]}
),但对于 hive_observable_data_mapping 好像并不起作用。只能使用单个字段名('{match[srcip]}'
)。
我们需要修改 Logstash 主机上的 01-wazuh.conf 配置文件来解决这个问题。在 Logstash 主机上修改 01-wazuh.conf 文件 [data][srcip]
过滤器的部分,将 add_field => [ "@src_ip", "%{[data][srcip]}" ]
改为 add_field => [ "src_ip", "%{[data][srcip]}" ]
。geoip 过滤器的部分,将 source => "@src_ip"
改为 source => "src_ip"
。
现在日志中应该已经有了 src_ip
字段,可以通过 Kibana 进行验证。在 Kibana 页面中选择 Management > Kibana > Index Patterns,选择 wazuh-alerts 索引模式,点击 Refresh 启用新字段:
# 测试规则
elastalert-test-rule ~/elastalert/rules/failed_ssh_login.yaml
# 运行 ElastAlert
elastalert --verbose --config ~/elastalert/config.yaml
针对运行着 Wazuh Agent 的主机生成一些告警:连续运行三次以下命令:ssh invaliduser@serverip
。
此时应该可以看到 Kibana 中显示了告警,ElastAlert 可以在下次运行时接收这些告警:
INFO:elastalert:Ran SSH Failed Login from 2019-03-31 18:21 UTC to 2019-04-02 15:01 UTC: 3 query hits (0 already seen), 1 matches, 1 alerts sent
在 TheHive 的 Alerts 下生成新告警:
点击右侧 Page 图标预览告警,可以为其分配一个模版,然后导入它:
这时已经完成了全部任务,Wazuh 生成的告警已经能在 TheHive 中显示为事件了。
*参考来源:Arnaud Loos,FB 小编 Avenger 编译,转载请注明来自FreeBuf.COM