前言
Elastic Stack 是一个模块化的数据分析生态系统。虽然这提供了工程灵活性,但为测试启动开发实例可能会很麻烦。启动 Elastic Stack 最简单的方法是使用 Elastic Cloud - 它是完全交钥匙的。但是,在某些情况下,Elastic Cloud 可能不适用于您的测试环境。为了帮助解决这个问题,本博客将为您提供快速且无痛地启动本地、完全容器化、TLS 安全的 Elastic Stack(启用 Fleet 和检测引擎)所需的必要信息。您将能够创建 Fleet 策略,在本地主机或 VM 上安装 Elastic Agent,并将数据发送到您的堆栈以进行监控或分析。
本博客将涵盖以下内容
- Elastic Stack
- 弹性容器项目
- 如何使用弹性容器项目
- 如何浏览 Kibana 并使用其相关功能进行安全研究
弹性容器项目不是由 Elastic 公司赞助或维护的。该项目的设计和实施考虑可能不反映 Elastic 关于部署生产就绪堆栈的指导。
Elastic Stack
Elastic Stack 由几个不同的组件组成,每个组件都提供一种独特的功能,可以用于各种用例。
Elasticsearch
Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎。作为 Elastic Stack 的核心,它集中存储您的数据,以便进行闪电般的快速搜索、微调的相关性和强大的分析,这些分析可以轻松扩展。
Kibana
Kibana 是用户界面,可让您可视化 Elasticsearch 数据并管理 Elastic Stack。
Elastic Agent
Elastic Agent 是一个模块化代理,允许您从端点收集数据或充当从第三方来源(如威胁源)传输数据的工具。适用于端点的 Elastic Security 集成可防止勒索软件和恶意软件,检测高级威胁,并为响应者提供重要的调查上下文。
弹性容器项目
如上所述,Elastic Stack 是模块化的,这使其在各种用例中非常灵活,但这会增加实现的复杂性。
弹性容器项目是一个开源项目,它使用 Docker Compose 作为一种启动功能齐全的 Elastic Stack 的方式,以便在非生产环境中使用。此项目不是由 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 上运行,您可以使用您的包管理系统(DNF、Yum 或 APT)安装先决条件。
基于 RPM 的发行版
**dnf install jq git curl**
Ubuntu
**apt-get install jq git curl**
您还需要 Docker 套件(包括 docker-compose-plugin)。请查看 Docker 的 适用于您的操作系统的安装说明
克隆项目存储库
弹性容器项目存储在 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 中心下载所有容器。如果您要在不总是有 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) 中控制。您必须更改的唯一内容是 elastic 和 kibana 的默认用户名和密码。
使用您最熟悉的任何文本编辑器打开 .env 文件,并将 ELASTIC_PASSWORD 和 KIBANA_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 证书。
启用白金版功能
启用白金版许可证功能是完全可选的。安全功能,如反恶意软件、EDR、EPP 等都包含在基本许可证中。内存、行为和勒索软件保护是白金版许可证的功能。如果您想更改许可证,我们可以使用 .env 文件或在 Kibana 中进行更改。您可以更新为 Elastic 白金版,有效期为 30 天。
如果您想使用 .env 文件以便在构建堆栈时启用这些功能,请将 LICENSE=basic 更改为 LICENSE=trial,然后像往常一样启动项目。
如果您更喜欢使用 Kibana,请单击汉堡菜单,然后单击“堆栈管理”。
单击“许可证管理”,然后单击“开始 30 天试用”。
创建 Fleet 策略
现在我们已经启动并运行了整个 Elastic Stack,我们可以制定一个 Fleet 策略。Fleet 是 Elastic Agent 的一个子程序(当我们在 shell 脚本中运行 start 选项时构建),它使您能够管理其他 Elastic Agent、策略和集成。
Fleet 在 Kibana 中进行管理,Kibana 是一个 UI,允许您与存储在 Elasticsearch 中的数据进行交互并管理您的 Elastic 堆栈。如果您有兴趣了解有关 Kibana 的更多信息,请查看免费 培训 视频。
登录您的 Kibana 实例并单击左上角的“汉堡”菜单,然后导航至“管理”部分下的“Fleet”。
接下来,单击“代理策略”选项卡,然后单击“创建代理策略”按钮。
为您的新策略指定一个名称和一个描述(可选)。通常,我们取消选中“收集代理日志”和“收集代理指标”选项,因为它会将额外的数据发送到堆栈,而我们通常不需要这些数据来满足我们特定的用例。如果您正在进行故障排除或对幕后发生的事情感兴趣,这些数据可以帮助您理解。
接下来,单击您的新策略和蓝色的“添加集成”按钮。
有数百个集成,但对于此博客,我们最感兴趣的是 Elastic Security 的集成。
要安装 Elastic Security,只需单击主集成页面上的磁贴或搜索“security”。
接下来,单击“添加端点和云安全”按钮,将此集成安装到我们刚刚创建的策略中。
命名集成并单击蓝色的“保存并继续”按钮。
虽然端点和云安全以及系统集成将收集与安全相关的日志,但如果您在 Windows 主机上使用 Sysmon,您可能需要添加“Windows”集成来收集这些日志。
安装集成后,系统将提示您添加更多代理或稍后添加。选择“稍后添加 Elastic Agent”选项,以便我们可以对我们的策略进行一些其他更改。
现在,我们将回到我们的策略页面。
我们的策略应该有两个集成:security 和 system-1。
在我们添加任何代理之前,我们需要将我们的 Elastic Agent 设置为“检测”(以便它允许恶意软件完全执行),将 Elastic Agent 注册为受信任的防病毒解决方案(仅限 Windows),并指示端点和云安全集成从安全事件中收集内存样本。这对于直接注入内存的“无文件”恶意软件(如 Cobalt Strike)非常有帮助。
如果您想了解有关从 Elastic Agent 生成的事件中提取恶意软件信标的更多信息,请查看我们的其他 出版物 和 存储库。
要允许恶意软件继续执行,在您的“Windows”策略页面上,单击集成的名称(在我们的示例中为“security”),将保护级别设置为“检测”。
对勒索软件、内存威胁保护和恶意行为部分重复这些步骤。
我们将 Elastic Agent 设置为“检测”,以便我们引爆的恶意软件能够完全运行,从而我们可以分析整个执行链。如果您希望阻止恶意软件,可以将此设置为“阻止”模式。
接下来,滚动到底部,选择“注册为防病毒软件”开关,然后单击“显示高级设置”超链接。
向下滚动到 windows.advanced.memory_protection.shellcode_collect_sample 、windows.advanced.memory_protection.memory_scan_collect_sample 和 windows.advanced.memory_protection.shellcode_enhanced_pe_parsing 选项,并将值设置为 true。
如上所述,这些步骤适用于实验室、沙盒、测试等。这些设置可能会生成大量数据,因此为生产环境设置这些设置需要资源和大小调整的考虑。
如果您正在为 Linux 或 macOS 制定策略,请针对正确的操作系统重复这些操作。
完成所有安装后配置后,我们可以单击蓝色的“保存集成”按钮。
启用 Elastic 的预构建检测规则
现在我们已经创建了 Fleet 代理策略,我们需要启用与我们将要部署的操作系统或平台(例如 Windows)相关联的预构建检测规则集。为此,您需要转到安全应用程序中的“警报”页面。
单击汉堡菜单,然后在安全解决方案下选择“警报”。
接下来,单击蓝色的“管理规则”按钮。
进入“规则”页面后,您可以单击“更新 Elastic 预构建规则”按钮来更新 Elastic 提供的所有预构建规则。当您第一次进入“管理规则”部分时,会启用更新框架,如果“更新 Elastic 预构建规则”按钮不存在,请刷新屏幕。
规则更新后,您可以浏览可用的检测规则,通过多种不同的模式搜索它们,或者只按标签过滤,我们在这里将搜索 Windows 规则。
现在我们可以选择所有 Windows 规则。
选择所有规则后,我们可以批量启用它们。
由于 Elastic Container Project 完全在单个 Docker 容器内运行,因此如果您启用所有可用的规则,可能会注意到性能影响。探索不同的规则,并根据您的基础结构和用例启用或禁用它们。
在我们启用这些规则后,它们将生效,并将针对您的端点代理发送到您的堆栈的数据运行。当检测引擎规则被触发时,它们将在安全解决方案中的“警报”页面中引发。
注册 Elastic Agent
仍然在 Fleet 中,我们有几种方法可以添加 Elastic Agent。最直接的方法是在我们想要注册 Elastic Agent 的策略中进行操作(否则您必须指定您想要使用的策略)。使用哪种方法并不重要,但在 Fleet 中的任何地方单击“操作”按钮,然后单击“添加代理”都可以。
向下滚动并单击您要安装 Elastic Agent 的操作系统,然后将说明直接复制/粘贴到您要将代理安装到的主机上的终端窗口中。请注意,如果您使用的是 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 报告并且运行状况良好。
如果我们进入“Discover”选项卡,我们可以看到各种事件类型正在向 Elasticsearch 报告。我们可以通过在主机上打开 notepad.exe 、calc.exe 和 ping.exe -t www.elastic.co 来生成一些测试数据。从 Discover 中,我们可以进行简单的查询来验证我们是否看到了数据
**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 进行威胁搜寻。