使用Elasticsearch与TheHive构建开源安全应急响应平台

标签: 企业安全 ElasticSearch TheHive 安全应急响应平台 | 发表时间:2019-05-30 07:00 | 作者:Avenger
出处:https://www.freebuf.com

概述

通过开源软件可以构建一个安全应急响应平台,该平台可以进行日志整合、告警生成、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,使用 [email protected]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:

给用户分配一个电子邮件,[email protected]

将用户添加到 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

相关 [elasticsearch thehive 开源] 推荐:

使用Elasticsearch与TheHive构建开源安全应急响应平台

- - FreeBuf互联网安全新媒体平台
通过开源软件可以构建一个安全应急响应平台,该平台可以进行日志整合、告警生成、IoC 丰富与事件管理. 在上面的流程图中,作为 HIDS 的 Wazuh 将数据发送回 Wazuh Manager 与 Elasticsearch. ElastAlert 观测到新事件并在 TheHive 中相应生成告警.

开源搜索引擎评估:lucene sphinx elasticsearch

- - 鲁塔弗的博客
lucene系,java开发,包括 solr和 elasticsearch. sphinx,c++开发,简单高性能. 搜索引擎程序这个名称不妥当,严格说来应该叫做 索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用: 替代mysql数据库 内置的索引.

开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索

- - C1G军火库
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志、事件的传输、处理、管理和搜索的平台. 你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

Elasticsearch as Database - taowen - SegmentFault

- -
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: [email protected]. 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.

ElasticSearch 2 的节点调优(ElasticSearch性能)

- - 行业应用 - ITeye博客
一个ElasticSearch集群需要多少个节点很难用一种明确的方式回答,但是,我们可以将问题细化成一下几个,以便帮助我们更好的了解,如何去设计ElasticSearch节点的数目:. 打算建立多少索引,支持多少应用. elasticsearch版本: elasticsearch-2.x. 需要回答的问题远不止以上这些,但是第五个问题往往是容易被我们忽视的,因为单个ElasticSearch集群有能力支持多索引,也就能支持多个不同应用的使用.

Elasticsearch:使用 Elasticsearch 进行语义搜索

- - 掘金 后端
在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用. 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果. 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局限性. 主要缺点之一在于它对词汇匹配的依赖. 关键字搜索将查询中的每个单词视为独立的实体,通常会导致结果可能与用户的意图不完全一致.

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

Elasticsearch基础教程

- - 开源软件 - ITeye博客
转自:http://blog.csdn.net/cnweike/article/details/33736429.     Elasticsearch有几个核心概念. 从一开始理解这些概念会对整个学习过程有莫大的帮助.     接近实时(NRT).         Elasticsearch是一个接近实时的搜索平台.

ElasticSearch索引优化

- - 行业应用 - ITeye博客
ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡. 所以从上我可以通过索引的settings进行第一优化:. 这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的. 所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行tranlog平衡.