用于安全研究的 Elastic 容器项目

使用 Docker 搭建 Elastic Stack

阅读 18 分钟安全运营, 检测科学
The Elastic Container Project for Security Research

前言

Elastic Stack 是一个模块化的数据分析生态系统。虽然这提供了工程灵活性,但对于测试环境搭建开发实例可能会比较繁琐。搭建 Elastic Stack 最简单的方法是使用Elastic Cloud - 它完全是交钥匙式的。但是,在某些情况下,Elastic Cloud 可能不适用于您的测试环境。为了解决这个问题,本博文将为您提供快速轻松地搭建本地、完全容器化、TLS 安全的 Elastic Stack(启用 Fleet 和 Detection Engine)所需的信息。您将能够创建 Fleet 策略,在本地主机或虚拟机上安装 Elastic Agent,并将数据发送到您的 Stack 进行监控或分析。

本博文将涵盖以下内容

  • Elastic Stack
  • Elastic 容器项目
  • 如何使用 Elastic 容器项目
  • 如何浏览 Kibana 并使用其相关功能进行安全研究

Elastic 容器项目不受 Elastic 公司赞助或维护。项目的的设计和实施考虑因素可能不反映 Elastic 关于部署生产就绪型 Stack 的指南。

Elastic Stack

Elastic Stack 由多个不同的组件组成,每个组件都提供不同的功能,这些功能可用于各种用例。

Elasticsearch

Elasticsearch 是一个分布式、RESTful 的搜索和分析引擎。作为 Elastic Stack 的核心,它集中存储您的数据,以便进行闪电般的快速搜索、微调的相关性和强大的分析,并且可以轻松扩展。

Kibana

Kibana 是一个用户界面,可让您可视化 Elasticsearch 数据并管理 Elastic Stack。

Elastic Agent

Elastic Agent 是一个模块化代理,允许您从端点收集数据或充当从第三方来源(如威胁情报源)发送数据的媒介。Elastic 安全端点集成可防止勒索软件和恶意软件,检测高级威胁,并为响应者提供重要的调查上下文。

Elastic 容器项目

如上所述,Elastic Stack 是模块化的,这使其非常灵活,适用于各种用例,但这可能会增加实施的复杂性。

Elastic 容器项目是一个开源项目,它使用 Docker Compose 作为一种方法来搭建一个功能齐全的 Elastic Stack,用于非生产环境。此项目不受 Elastic 公司赞助或维护。

简介

Elastic 容器项目包括三个主要组件

  • Elasticsearch
  • Kibana
  • Elastic Agent

该项目利用了Docker Compose,这是一种构建、集成和管理多个 Docker 容器的工具。

为了简化容器的管理,该项目包含一个 shell 脚本,允许对容器进行暂存、启动、停止和销毁。

此外,该项目还使用了 Elasticsearch 和 Kibana、Kibana 和您的 Web 浏览器、Elastic Agent 和 Elasticsearch 以及 Elastic Agent 和 Kibana 之间的自签名 TLS 证书。

先决条件

该项目在 Linux 和 macOS 操作系统上构建和测试。如果您使用的是 Windows,则无法使用包含的 shell 脚本,但您仍然可以运行本机 Docker Compose 命令并手动执行部署后步骤。

虽然没有经过彻底测试,但建议您为 Docker 分配 4 个核心和 8 GB 的 RAM。

您只需要安装几个软件包

  • Docker
  • Docker Compose
  • jq
  • Git
  • cURL

macOS

如果您在 macOS 上运行,则可以使用Homebrew安装先决条件,Homebrew 是一个用于 macOS 的开源软件包管理系统。如有需要,请查看 Homebrew 网站以获取有关安装的信息。

**brew install jq git**
**brew install --cask docker**

Linux

如果您在 Linux 上运行,则可以使用您的软件包管理系统(DNFYumAPT)安装先决条件。

基于 RPM 的发行版

**dnf install jq git curl**

Ubuntu

**apt-get install jq git curl**

您还需要 Docker 套件(包括 docker-compose-plugin)。请查看 Docker 的安装说明以获取您的操作系统的信息。

克隆项目仓库

Elastic 容器项目存储在 Github 上。只要您安装了 Git,就可以从您选择的 CLI 中获取它。

**git clone https://github.com/peasead/elastic-container.git**
**cd elastic-container**

此仓库包含使用单个 shell 脚本搭建 Elastic Stack 容器所需的一切。

设置凭据

在继续之前,请确保您更新了存储库根目录中 .env 文件中 Elastic 和 Kibana 帐户的凭据,将其从默认的 changeme 更新。

Shell 脚本

如上所述,该项目包含一个 shell 脚本,它将简化容器的管理。

**usage: ./elastic-container.sh [-v] (stage|start|stop|restart|status|help)**
**actions:**
 **stage downloads all necessary images to local storage**
 **start creates network and starts containers**
 **stop stops running containers without removing them**
 **destroy stops and removes the containers, the network and volumes created**
 **restart simply restarts all the stack containers**
 **status check the status of the stack containers**
 **help print this message**
 **flags:**
 **-v enable verbose output**

暂存

此选项从 Elastic Docker Hub 下载所有容器。如果您要在不总是具有 Internet 访问权限的系统上构建项目,则此选项很有用。这不是必需的,您可以跳过此选项并直接转到启动选项,该选项将下载容器。

**$ ./elastic-container.sh stage**
**8.3.0: Pulling from elasticsearch/elasticsearch**
**7aabcb84784a: Already exists**
**e3f44495617d: Downloading [====\\>] 916.5kB/11.26MB**
**52008db3f842: Download complete**
**551b59c59fdc: Downloading [\\>] 527.4kB/366.9MB**
**25ee26aa662e: Download complete**
**7a85d02d9264: Download complete**
**…**

启动

此选项将创建容器网络、下载所有必需的容器、设置 TLS 证书,并启动并将 Elasticsearch、Kibana 和 Fleet 服务器容器连接在一起。此选项是启动并运行 Elastic Stack 的“快速启动”。如果您未将 .env 文件中的凭据从默认值更改,则脚本将退出。

**$ ./elastic-container.sh start**

**Starting Elastic Stack network and containers**
**[+] Running 7/8**
 **⠿ Network elastic-container\_default Created 0.0s**
 **⠿ Volume "elastic-container\_certs" Created 0.0s**
 **⠿ Volume "elastic-container\_esdata01" Created 0.0s**
 **⠿ Volume "elastic-container\_kibanadata" Created 0.0s**
 **⠿ Container elasticsearch-security-setup Waiting 2.0s**
 **⠿ Container elasticsearch Created 0.0s**
**…**

停止

此选项将停止项目中所有正在运行的容器,但不会删除它们。

**$ ./elastic-container.sh stop**

**Stopping running containers.**
**[+] Running 4/4**
 **⠿ Container elastic-agent Stopped 0.0s**
 **⠿ Container kibana Stopped 0.0s**
 **⠿ Container elasticsearch Stopped 0.0s**
 **⠿ Container elasticsearch-security-setup Stopped**
**…**

销毁

此选项将停止项目中所有正在运行的容器,删除容器网络,删除所有数据卷,并删除所有容器。

**$ ./elastic-container.sh destroy**

**#####**
**Stopping and removing the containers, network, and volumes created.**
**#####**
**[+] Running 8/4**
 **⠿ Container elastic-agent Removed 0.0s**
 **⠿ Container kibana Removed 0.0s**
 **⠿ Container elasticsearch Removed 0.0s**
 **⠿ Container elasticsearch-security-setup Removed 0.3s**
 **⠿ Volume elastic-container\_esdata01 Removed 0.0s**
 **⠿ Network elastic-container\_default Removed 0.1s**
**…**

重启

此选项重启项目中的所有容器。

**$ ./elastic-container.sh restart

#####
Restarting all Elastic Stack components.
#####
Name Command State Ports
---------------------------
elasticsearch /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:9200-\\>9200/tcp, 9300/tcp
fleet-server /usr/bin/tini -- /usr/loca ... Up 0.0.0.0:8220-\\>8220/tcp
kibana /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:5601-\\>5601/tcp**

状态

此选项返回项目容器的状态。

**$ ./elastic-container.sh status**
**Name Command State Ports**
**---------------------------**
**elasticsearch /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:9200-\\>9200/tcp, 9300/tcp**
**fleet-server /usr/bin/tini -- /usr/loca ... Up 0.0.0.0:8220-\\>8220/tcp**
**kibana /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:5601-\\>5601/tcp**

清除

此选项清除日志和指标索引中的所有文档。

**$ ./elastic-container.sh clear**

**Successfully cleared logs data stream**
**Successfully cleared metrics data stream**

帮助

此选项提供有关使用 shell 脚本的说明。

**$ ./elastic-container.sh help**

**usage: ./elastic-container.sh [-v] (stage|start|stop|restart|status|help)**
**actions:**
 **stage downloads all necessary images to local storage**
 **start creates a container network and starts containers**
 **stop stops running containers without removing them**
 **destroy stops and removes the containers, the network and volumes created**
 **restart simply restarts all the stack containers**
 **status check the status of the stack containers**
**clear all documents in logs and metrics indexes**
 **help print this message**
**flags:**
 **-v enable verbose output**

入门

现在我们已经介绍了项目概述和 shell 脚本,让我们一起了解如何构建您自己的堆栈。

更新变量

所有变量都由存储库根目录下的环境文件(.env)控制。您只需更改elastickibana的默认用户名和密码。

使用您最习惯的文本编辑器打开.env文件,并将ELASTIC_PASSWORDKIBANA_PASSWORD变量从changeme更新为安全的密码。如果您未更新.env文件中默认的凭据,则脚本将退出。

如果要更改其他变量(例如堆栈版本),您也可以在此文件中进行更改。

启动 Elastic Stack

启动项目容器就像使用 start 选项运行elastic-container.sh shell 脚本一样简单。

**$ ./elastic-container.sh start**

**Starting Elastic Stack network and containers
[+] Running 7/8
⠿ Network elastic-container\_default Created 0.0s
⠿ Volume "elastic-container\_certs" Created 0.0s
⠿ Volume "elastic-container\_esdata01" Created 0.0s
⠿ Volume "elastic-container\_kibanadata" Created 0.0s
⠿ Container elasticsearch-security-setup Waiting 2.0s
⠿ Container elasticsearch Created 0.0s
⠿ Container kibana Created 0.1s
⠿ Container fleet-server Created 0.2s

Attempting to enable the Detection Engine and Prebuilt-Detection Rules
Kibana is up. Proceeding
Detection engine enabled. Installing prepackaged rules.
Prepackaged rules installed!
Waiting 40 seconds for Fleet Server setup
Populating Fleet Settings
READY SET GO!

Browse to https://127.0.0.1:5601
Username: elastic
Passphrase: you-changed-me-from-the-default-right?**

访问 Elastic Stack

所有容器下载并启动后,您将获得一个输出,指示您浏览到https://127.0.0.1:5601

注意:您需要接受自签名 TLS 证书。

启用 Platinum 功能

启用 Platinum 许可证功能完全是可选的。安全功能(如反恶意软件、EDR、EPP 等)包含在基本许可证中。内存、行为和勒索软件防护是 Platinum 许可证功能。如果要更改许可证,我们可以通过.env文件或 Kibana 中进行操作。您可以更新到 Elastic Platinum 30 天。

如果要使用.env文件在构建堆栈时启用这些功能,请将LICENSE=basic更改为LICENSE=trial,然后照常启动项目。

如果您更喜欢使用 Kibana,请单击汉堡菜单,然后单击堆栈管理。

单击许可证管理,然后单击“开始 30 天试用”。

创建 Fleet 策略

现在我们已经启动并运行了整个 Elastic Stack,我们可以创建一个Fleet策略。Fleet 是Elastic Agent(在我们运行 shell 脚本中的start选项时构建)的子程序,它使您能够管理其他 Elastic Agent、策略和集成。

Fleet 在 Kibana 中进行管理,Kibana 是一个用户界面,允许您与存储在 Elasticsearch 中的数据交互并管理您的 Elastic 堆栈。如果您有兴趣了解更多关于 Kibana 的信息,请查看免费培训视频

登录您的 Kibana 实例,单击左上角的“汉堡”菜单,然后导航到“管理”部分下的“Fleet”。

接下来,单击“代理策略”选项卡,然后单击“创建代理策略”按钮。

为您的新策略命名并提供描述(可选)。通常,我们取消选中“收集代理日志”和“收集代理指标”选项,因为这是发送到堆栈的其他数据,对于我们的特定用例,我们通常不需要这些数据。如果您正在进行故障排除或有兴趣了解幕后发生的事情,这些数据可以帮助您了解情况。

接下来,单击您的新策略和蓝色的“添加集成”按钮。

有数百个集成,但我们对这篇博文最感兴趣的是 Elastic Security 的集成。

要安装 Elastic Security,只需单击主集成页面上的图块或搜索“security”。

接下来,单击“添加端点和云安全”按钮以将此集成安装到我们刚刚创建的策略中。

命名集成并单击蓝色的“保存并继续”按钮。

虽然端点和云安全以及系统集成将收集与安全相关的日志,但如果您在 Windows 主机上使用 Sysmon,则可能需要添加“Windows”集成以收集这些日志。

安装集成后,系统会提示您添加更多代理或稍后添加。选择“稍后添加 Elastic Agent”选项,以便我们可以对策略进行一些更改。

现在我们将返回到策略页面。

我们的策略应该有两个集成:securitysystem-1

在添加任何代理之前,我们需要将 Elastic Agent 设置为检测(以便它允许恶意软件完全执行),将 Elastic Agent 注册为受信任的 AV 解决方案(仅限 Windows),并指示端点和云安全集成从安全事件中收集内存样本。这对直接注入内存的“无文件”恶意软件(如 Cobalt Strike)非常有帮助。

如果您想了解有关从 Elastic Agent 生成的事件中提取恶意软件信标的更多信息,请查看我们的其他出版物存储库

要允许恶意软件继续执行,在您的“Windows”策略页面上,单击集成的名称(在我们的示例中为“security”),将保护级别设置为“检测”。

对勒索软件、内存威胁防护和恶意行为部分重复这些步骤。

我们将 Elastic Agent 设置为检测,以便我们引爆的恶意软件能够完全运行,以便我们分析整个执行链。如果要停止恶意软件,可以将其保留在预防模式下。

接下来,滚动到底部并选择“注册为防病毒”切换按钮,然后单击“显示高级设置”超链接。

向下滚动到windows.advanced.memory_protection.shellcode_collect_samplewindows.advanced.memory_protection.memory_scan_collect_samplewindows.advanced.memory_protection.shellcode_enhanced_pe_parsing选项,并将值设置为true

如上所述,这些步骤适用于实验室、沙箱、测试等。这些设置可能会生成大量数据,因此在生产环境中设置这些设置需要考虑资源和规模。

如果要为 Linux 或 macOS 创建策略,请对相应的 OS 重复这些步骤。

完成所有安装后配置后,我们可以单击蓝色的“保存集成”按钮。

启用 Elastic 的预构建检测规则

现在我们已经创建了 Fleet 代理策略,我们需要启用与我们将部署的 OS 或平台(例如 Windows)相关的一组预构建检测规则。为此,您需要转到安全应用程序内的警报页面。

单击汉堡菜单,然后在安全解决方案下选择警报。

接下来,单击蓝色的“管理规则”按钮。

进入“规则”页面后,您可以通过单击“更新 Elastic 预构建规则”按钮来更新 Elastic 提供的所有预构建规则。更新框架在您第一次进入“管理规则”部分时启用,如果“更新 Elastic 预构建规则”按钮不存在,请刷新屏幕。

更新规则后,您可以浏览可用的检测规则,通过多种模式搜索它们,或者只需按标签筛选,我们将在此处通过搜索 Windows 规则来执行此操作。

现在我们可以选择所有 Windows 规则。

选择所有规则后,我们可以批量启用它们。

由于 Elastic Container Project 完全在单个 Docker 容器内运行,因此如果您启用所有可用规则,可能会注意到性能影响。探索不同的规则,并根据您的基础设施和用例启用或禁用它们。

启用这些规则后,它们将处于活动状态,并将针对您的端点代理发送到堆栈中的数据运行。当检测引擎规则被触发时,它们将在安全解决方案中的警报页面中引发。

注册 Elastic Agent

仍在 Fleet 中,我们有几种方法可以添加 Elastic Agent。最直接的方法是从要将 Elastic Agent 注册到的策略中进行操作(否则您必须指定要使用的策略)。您使用哪种方法并不重要,但从 Fleet 中几乎任何位置单击“操作”按钮,然后单击“添加代理”都可以。

向下滚动并单击您将要安装 Elastic Agent 的 OS,然后将说明直接复制粘贴到您将要安装代理的主机上的终端窗口中。请注意,如果您使用的是 Windows,请使用以(或提升到)具有管理权限的帐户运行的 Powershell CLI。

值得注意的是,由于我们的所有 TLS 证书都是自签名的,因此我们需要附加–insecure标志。如果您使用的是受信任的证书,则无需执行此操作。

**.\elastic-agent.exe install --url=https://[stack-ip]:8220 --enrollment-token=[token] --insecure**

回到 Kibana 中,我们可以看到主机上安装了 Elastic Agent 并且数据已记录到 Elasticsearch 中的确认信息。

我们可以看到 Elastic Agent 正在向 Fleet 报告并且处于健康状态。

如果进入“发现”选项卡,我们可以看到各种事件类型报告到 Elasticsearch 中。我们可以通过在主机上打开notepad.execalc.exeping.exe -t www.elastic.co来生成一些测试数据。从“发现”中,我们可以进行简单的查询以验证我们是否看到了数据

**process.name.caseless : (notepad.exe or ping.exe or calc.exe)**

现在我们已经验证了我们看到了数据。让我们来触发一些恶意软件!

测试触发一些恶意软件

您可以从很多地方下载恶意软件,但对于此测试,我们将简单地使用行业标准的EICAR 反恶意软件测试文件来检查功能。

EICAR 测试是一个文件,安全供应商普遍识别该文件,并用于测试反恶意软件软件和平台的操作。它包含单个字符串,并且无害。

在 Windows 主机中,我们将使用 Powershell 下载 EICAR 文件。

**Invoke-WebRequest -Uri "https://secure.eicar.org/eicar.com.txt" -OutFile "eicar.txt"**

正如预期的那样,Elastic Agent 的安全集成立即识别了该事件。

几分钟后,事件将记录到 Kibana 中的安全解决方案中。您可以通过单击汉堡菜单,然后单击“警报”部分来访问该页面。

在这里我们可以看到已填充的警报。

如果单击“分析器”按钮,我们可以深入了解事件以识别生成事件的进程。

在我们的示例中,我们可以看到**powershell.exe**生成了事件,其中包括相关的网络事件 - **secure.eicar.org**,这是下载EICAR测试文件的位置。

摘要

在本篇文章中,我们向您介绍了Elastic Stack和一个开源项目,该项目可用于快速安全地搭建整个堆栈以进行测试、实验和安全研究。

Kibana和安全解决方案是强大的工具,由事件响应者、威胁猎人以及情报分析师构建,并以安全从业人员为目标。要详细了解如何使用这些工具,Elastic提供了一些很棒的(免费和付费)培训,可以帮助您学习如何使用Kibana进行威胁狩猎。