peasead/elastic-container
GitHub: peasead/elastic-container
通过 Docker Compose 和自动化脚本在本地快速拉起带 TLS 安全认证的完整 Elastic Stack(含 Fleet 和 Detection Engine),专为安全研究搭建的即用型容器化环境。
Stars: 561 | Forks: 96
# Elastic Container 项目
只需几分钟,即可搭建一个 100% 容器化的 Elastic stack,启用 TLS 安全认证,并预先配置、启用 Elasticsearch、Kibana、Fleet 和 Detection Engine,开箱即用。
如果您想了解有关此项目的更多详细信息以及运行后的后续操作,请查看我们在 Elastic Security Labs 网站上的[博客文章](https://www.elastic.co/security-labs/the-elastic-container-project)。
:warning: 这不是由 Elastic 创建、赞助或维护的项目。Elastic 不对本项目的设计或实现负责。
[](https://postimg.cc/NLH6VR3f)
## 步骤
1. `Git clone` 此仓库
2. 安装前置条件(见下文)
3. 进入 `elastic-container/` 文件夹
4. **设置当前的 stack 镜像 tag** — `.env` 中固定的版本可能会随着时间从 registry 中消失。您可以运行 `bash ./elastic-container.sh update-version`(或 `bash ./elastic-container.sh -u`),将 `STACK_VERSION` 设置为 [Docker Hub 上 elastic/elasticsearch](https://hub.docker.com/r/elastic/elasticsearch/tags) 列出的最新稳定版 `x.y.z` tag,或者打开该页面并在 `.env` 中手动将 `STACK_VERSION` 设置为 Elasticsearch、Kibana 和 Elastic Agent 均存在的 tag。执行 `chmod +x` 后,您可以使用 `./elastic-container.sh` 来代替 `bash ./elastic-container.sh`。
5. 在 `.env` 文件中修改默认密码 `changeme`(不要更改 `elastic` 用户名,它是[必需的内置用户](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html))
6. 在 `.env` 文件中按操作系统批量启用预构建的检测规则(非必选,请参阅下方的用法)
7. 运行 `chmod +x elastic-container.sh`,使 `elastic-container.sh` shell 脚本具有可执行权限
8. 使用 start 参数执行 `elastic-container.sh` shell 脚本:`./elastic-container.sh start`
9. 等待提示出现,告诉您可以浏览 https://localhost:5601 \
(由于使用了自签名证书,您的浏览器可能会发出警告。您可以键入 `thisisnotsafe` 或点击继续,随后您将被引导至 Elastic 登录界面)
## 要求
### 操作系统:
- Linux 或 MacOS
### 前置条件:
- [Docker 套件](https://docs.docker.com/get-docker/)、[jq](https://stedolan.github.io/jq/download/)、[curl](https://curl.se/download.html) 和 [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)。
您可以使用上面的链接、下方的 Linux 软件包安装命令,或者如果您使用的是 MacOS,可以使用 [Homebrew](https://brew.sh/)
**MacOS:**
```
brew install jq git curl docker-compose
brew install --cask docker
```
安装 Docker 后,我们需要为其提供特权访问权限才能使其正常运行。运行以下命令打开 Docker 应用程序,并按照后续步骤操作。
```
open /Applications/Docker.app
```
1. 确认您要打开该应用程序
2. 当提示为 Docker 提供特权访问权限时,选择“确定”
3. 输入您的密码
4. 关闭或最小化 Docker 应用程序
**Ubuntu:**
请按照 [Docker 安装说明](https://docs.docker.com/engine/install/ubuntu/)进行操作。特别需要注意的是,您*必须*安装 `docker-compose-plugin`,这与 `docker-compose` 不同。
```
apt-get install jq git curl
```
**RPM 发行版 (CentOS/Fedora/Rocky/RHEL):**
请按照 [Docker 安装说明](https://docs.docker.com/engine/install/centos/)进行操作。特别需要注意的是,您*必须*安装 `docker-compose-plugin`,这与 `docker-compose` 不同。
```
dnf install jq git curl
```
**其他 Linux 发行版:**
请按照 [Docker 安装说明](https://docs.docker.com/engine/install/)进行操作。特别需要注意的是,您*必须*安装 `docker-compose-plugin`,这与 `docker-compose` 不同。
Arch Linux 用户应安装 `inetutils`,并将 shell 脚本中的 `hostname -I` 更改为 `hostname -i`。
**使用 WSL 2 的 Windows 10/11 (Ubuntu 20.04):**
确保您使用的是 WSL 版本 2。您可以在 PowerShell 中使用 `wsl -l -v` 检查版本。如果版本不对,可以使用 `wsl --set-version Ubuntu-20.04 2` 进行更改
```
apt-get update
apt-get install jq git curl
```
请按照 [Docker 安装说明](https://docs.docker.com/engine/install/ubuntu/)进行操作。特别需要注意的是,您*必须*安装 `docker-compose-plugin`,这与 `docker-compose` 不同。
安装 Docker 套件后,运行 `sudo service docker start` 启动它。
## 用法
本项目使用默认凭据 `elastic:changeme`,纯粹用于本地 Elastic stack 上的安全研究。[请在 `.env` 文件中更改密码](https://github.com/peasead/elastic-container/blob/main/README.md#modifying)。不要更改 `elastic` 用户名,它是[必需的内置用户](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html)
不应将其暴露在 Internet 上或用于生产环境。
### 启用预构建的检测规则
如果您想在启动时按操作系统批量启用 Elastic 的预构建检测规则,可以在 `.env` 文件中将所选操作系统的值从 0 更改为 1。
```
# 按 OS 批量启用 Detection Rules
LinuxDR=0
WindowsDR=1
MacOSDR=0
```
### 更新 `STACK_VERSION`
如果由于 `.env` 中的 tag 已被删除或过期导致拉取失败,请在 `stage` 或 `start` 之前刷新固定版本:
```
$ ./elastic-container.sh update-version
```
这会查询 Docker Hub 上的 [elastic/elasticsearch](https://hub.docker.com/r/elastic/elasticsearch/tags) 仓库,找到匹配 `x.y.z` 的最高稳定版 tag(忽略 SNAPSHOT 和其他不符合 semver 规范的 tag),并重写 `.env` 中生效的 `STACK_VERSION=` 行。使用短标志 `./elastic-container.sh -u` 也可以实现相同的行为。此操作不需要运行 Docker。对于 SNAPSHOT 或预发布版本构建,请手动在 `.env` 中设置 `STACK_VERSION`,使其与已发布的 tag 匹配。
### 启动
**如果您没有[在 `.env` 文件中更改默认密码](https://github.com/peasead/elastic-container/blob/main/README.md#modifying),脚本将会退出。**
启动将会:
- 创建一个名为 `elastic` 的网络
- 下载脚本中定义的 Elasticsearch、Kibana 和 Elastic-Agent Docker 镜像
- 启动 Elasticsearch、Kibana 以及配置为 Fleet Server 的 Elastic-Agent,并包含 Fleet 和 Detection Engine 所需的所有设置
```
$ ./elastic-container.sh start
...
⠿ Container elasticsearch-security-setup Healthy 7.3s
⠿ Container elasticsearch Healthy 39.3s
⠿ Container kibana Healthy 59.3s
⠿ Container elastic-agent Started 59.7s
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://localhost:5601
```
几分钟后,当出现提示时,浏览 https://localhost:5601 并使用您配置的凭据登录。
### 销毁
销毁将会:
- 停止 Elasticsearch 和 Kibana 容器
- 删除 Elasticsearch 和 Kibana 容器
- 删除 `elastic` 容器网络
- 删除创建的 volume
```
$ ./elastic-container.sh destroy
fleet-server
kibana
elasticsearch
elastic
```
### 停止
停止将会:
- 停止 Elasticsearch 和 Kibana 容器而不删除它们
```
$ ./elastic-container.sh stop
fleet-server
kibana
elasticsearch
elastic
```
### 重启
重启将会:
- 重启所有容器
```
$ ./elastic-container.sh restart
elasticsearch
kibana
fleet-server
```
### 状态
请求状态将会:
- 返回正在运行的容器的当前状态
```
$ ./elastic-container.sh status
NAMES: STATUS
fleet-server: Up 6 minutes
kibana: Up 6 minutes
elasticsearch: Up 6 minutes
```
### 清除
清除将会:
- 清除 logs 和 metrics 索引中的所有文档
```
$ ./elastic-container.sh clear
Successfully cleared logs data stream
Successfully cleared metrics data stream
```
### 暂存 (Staging)
暂存容器镜像将会:
- 将所有容器镜像下载到您的本地系统,但不会启动它们
```
$ ./elastic-container.sh stage
8.6.0: Pulling from elasticsearch/elasticsearch
e7bd69ff4774: Pull complete
d0a0f12aaf30: Pull complete
...
```
## 修改
在 `.env` 中定义了相关变量,以下是可以更改的变量。**您必须更改默认密码。**
```
ELASTIC_PASSWORD="changeme"
KIBANA_PASSWORD="changeme"
STACK_VERSION="8.14.0"
```
如果您想更改默认值,只需在变量声明中替换相应的值即可。
如果您想使用不同版本的 Elastic Stack,也可以进行更改。可选的版本位于 Elastic 的 Docker Hub 上:
- [Elasticsearch](https://hub.docker.com/r/elastic/elasticsearch/tags?page=1&ordering=last_updated)
- [Kibana](https://hub.docker.com/r/elastic/kibana/tags?page=1&ordering=last_updated)
- [Elastic-Agent](https://hub.docker.com/r/elastic/elastic-agent/tags?page=1&ordering=last_updated)
### 增加 JVM 堆内存大小
默认的堆内存大小为 512M,在某些情况下可能不够。在这种情况下,我们可以通过编辑 `docker-compose.yml` 并向 elasticsearch 容器传递 `ES_JAVA_OPTS` 环境变量来更改堆内存大小。
```
elasticsearch:
...
environment:
+ - ES_JAVA_OPTS=-Xmx1g -Xms1g
```
## 自动化
要注册 Agent,您将需要注册 token (enrollment token)。
您可以在 `https://:5601/app/fleet/enrollment-tokens` 下或通过 API 获取 token
[https://www.elastic.co/guide/en/fleet/current/fleet-api-docs.html#get-enrollment-token-api](https://www.elastic.co/guide/en/fleet/current/fleet-api-docs.html#get-enrollment-token-api)
```
curl -k --request GET \
--url 'https://:5601/api/fleet/enrollment_api_keys' \
-u : \
--header 'Content-Type: application/json' \
--header 'kbn-xsrf: xx'
```
这将以 JSON 格式返回 token:
```
{
"list": [
{
"id": "461cc77f-e9dd-46f0-b5c8-7babf644b08f",
"active": true,
"api_key_id": "ZS7TYI4B02xLEiUBWuqK",
"api_key": "WlM3VFlJNEIwMnhMRWlVQld1cUs6b3JmRGRyTnBUSmVOc05DeU1NelJIZw==",
"name": "Default (461cc77f-e9dd-46f0-b5c8-7babf644b08f)",
"policy_id": "09528aeb-70c7-4448-91cf-0be1e6a1838a",
"created_at": "2024-03-21T11:44:08.721Z"
},
[...]
```
利用这些信息,就可以注册 Agent,例如通过 WinRM 或 Ansible:
```
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.12.2-windows-x86_64.zip -OutFile elastic-agent-8.12.2-windows-x86_64.zip
Expand-Archive .\elastic-agent-8.12.2-windows-x86_64.zip -DestinationPath .
cd elastic-agent-8.12.2-windows-x86_64
.\elastic-agent.exe install --url=https://:8220 --insecure -f --enrollment-token=
```
标签:AMSI绕过, Docker, Elastic Stack, PB级数据处理, 威胁检测, 安全运维, 安全防御评估, 容器化部署, 流量重放, 版权保护, 请求拦截, 越狱测试