404SecNotFound/OpenCTI-Deployment-Toolkit

GitHub: 404SecNotFound/OpenCTI-Deployment-Toolkit

一套面向 Ubuntu LTS 的 OpenCTI 生产级部署与加固脚本,帮助安全团队在 30 分钟内搭建具备自动监控、安全加固和多情报源连接器的威胁情报平台。

Stars: 0 | Forks: 0

# OpenCTI 部署工具包 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Bash](https://img.shields.io/badge/shell-bash-1f425f.svg)](https://www.gnu.org/software/bash/) [![OpenCTI](https://img.shields.io/badge/OpenCTI-6.8.x-blue.svg)](https://github.com/OpenCTI-Platform/opencti) [![Ubuntu](https://img.shields.io/badge/Ubuntu-22.04%20%7C%2024.04-orange.svg)](https://ubuntu.com/) [![Status](https://img.shields.io/badge/status-actively%20maintained-brightgreen.svg)](#status) OpenCTI 官方的 Docker 仓库可以让你启动一个运行中的平台,但并不能为你提供一个达到生产环境标准的部署。**本工具包旨在填补这一空白。** 只需五个 Bash 脚本,即可在 30 分钟内将一台全新的 Ubuntu 虚拟机转化为一个经过加固、具备监控能力且加载了连接器的 OpenCTI 部署环境——这其中甚至包括帮你提前解决了那些通常会在第一天就遇到的问题:RabbitMQ 调优、Docker-UFW 防火墙绕过、连接器 UUID 偏移、TLP 值错误、摄入停滞、needneed 拦截、端口冲突等等。 这些都是真实部署经验中血与泪的教训。完整的故障与解决记录请参阅 [LESSONS-LEARNED.md](LESSONS-LEARNED.md)。 ## 为什么这对检测工程师至关重要 如果你要构建检测内容——如 SIEM 规则、威胁狩猎查询、威胁模型——你需要一种快速的方法来搭建一个加载了真实情报源(如 AlienVault OTX、abuse.ch、MITRE ATT&CK、MITRE ATLAS)的 CTI 实验室,而不是把一天的时间浪费在调整 Compose 文件上。这个工具包能在 30 分钟内为你搭建好这样的实验室,配备了 HTTPS 和防火墙进行安全加固,并通过每 15 分钟运行一次的 cron 健康检查来自动重启停滞的连接器,从而保持系统的稳定。 连接器模板库被设计为可扩展的。只需添加一次你自己的自定义模板,之后在每次客户项目中只需一条命令即可完成部署。 ## 你将获得什么 | 脚本 | 用途 | |---|---| | `install-opencti.sh` | 在 Ubuntu 22.04 / 24.04 上进行引导安装。包括虚拟机规格检测、基于配置文件的调优、内核与 ulimit 加固、Docker CE 安装、密钥生成以及动态连接器 UUID 生成。 | | `harden.sh` | 生产环境加固覆盖层。提供带有自动 HTTPS 的 Caddy 反向代理、将内部服务绑定到 localhost、附带 Docker 绕过修复的 UFW 防火墙、SSH 加固、fail2ban 以及无人值守的安全升级。 | | `add-connector.sh` | 通过模板部署连接器——无需手动编辑 YAML。内置了 AlienVault、MITRE、AbuseIPDB、ThreatFox、URLhaus、MISP、TweetFeed 的模板。支持自定义 YAML。可自动生成 UUID、进行 compose 验证并实时跟踪日志。 | | `manage.sh` | 日常维护(Day-2)操作——包括查看状态、日志、备份、升级、密码重置以及彻底清理环境。 | | `health-check.sh` | 15 分钟一次的 cron 健康监控。通过 OpenCTI GraphQL 监控容器状态并检测数据摄入停滞。带有防死循环退避机制(anti-loop backoff)的自动重启。 | ## 成功部署后的样子 在完成安装、加固和连接器加载后,在一个正常运行的堆栈上执行 `health-check.sh --status` 的输出结果如下所示: ``` Container restart counters: Connector ingestion state: connector-alienvault last_work=15min ago last_checked=0min ago connector-mitre-atlas last_work=47min ago last_checked=0min ago connector-opencti last_work=143min ago last_checked=0min ago connector-threatfox last_work=60min ago last_checked=0min ago connector-urlhaus last_work=62min ago last_checked=0min ago ``` 重启计数器为空意味着没有出现过任何故障。`last_work` 时间戳确认了每个连接器都在持续执行实际的数据摄入周期。 ## 快速开始 在一台全新的 Ubuntu 22.04 或 24.04 虚拟机上(推荐配置:16 GB 内存,8 核 CPU,100+ GB SSD): ### 步骤 1 - 安装(8 到 12 分钟) ``` sudo ./install-opencti.sh ``` 大部分时间都花在拉取镜像上(OpenCTI、Elasticsearch、RabbitMQ、MinIO、Redis 及各种连接器)。在 16 GB 内存的虚拟机上,平台本身需要 3 到 5 分钟才能在所有容器启动后通过首次健康检查。脚本会一直等待直到检查通过。 **验证:** ``` sudo docker compose ps # all containers healthy or running curl -fsS "http://localhost:8080/health?health_access_key=$(sudo grep ^OPENCTI_HEALTHCHECK_ACCESS_KEY /opt/opencti/.env | cut -d= -f2)" ``` 凭据已保存至 `/root/opencti-credentials.txt`(文件权限模式为 600)。 ### 步骤 2 - 启用 HTTPS + 防火墙进行安全加固(3 到 5 分钟) ``` sudo ./harden.sh --hostname cti.lab.local --local-ca ``` 对于内部主机名(`*.local`、`*.lan`、`*.internal`),Caddy 会从其内置的本地 CA 颁发自签名证书。对于公共主机名,请添加 `--email you@example.com` 以获取真实的 Let's Encrypt 证书。 **验证:** ``` curl -kI https://cti.lab.local/ # expect HTTP/2 200 sudo ufw status numbered # expect: 22/80/443 allowed, all else denied ``` 然后将 `cti.lab.local` 添加到你笔记本电脑的 hosts 文件中,指向该虚拟机的 IP 地址,即可在浏览器中进行访问。 ### 步骤 3 - 添加数据源(每个连接器需 1 到 2 分钟) ``` sudo ./add-connector.sh --template alienvault --api-key YOUR_OTX_KEY sudo ./add-connector.sh --template urlhaus --api-key YOUR_ABUSE_CH_KEY sudo ./add-connector.sh --template threatfox --api-key YOUR_ABUSE_CH_KEY sudo ./add-connector.sh --template mitre ``` 每个连接器大约需要 60 到 90 秒的时间进行部署和启动。脚本会实时显示 30 秒的日志输出,以便你确认连接器已成功注册并开始获取数据。 **验证:** ``` sudo ./add-connector.sh --list # see all built-in templates sudo docker compose ps connector-alienvault # expect: Up ``` 然后在 OpenCTI 的 Web 界面中访问:**Data → Ingestion → Connectors → Monitoring**,以观察在接下来的一小时内消息数量的增长。 ### 步骤 4 - 自动健康监控(即刻生效) ``` sudo ./health-check.sh --install-cron ``` 大功告成。该脚本会通过 cron 每 15 分钟运行一次。日志记录在 `/var/log/opencti-health.log` 中。它会自动重启不健康或停滞的容器,并带有防死循环的退避机制。 **验证:** ``` sudo grep opencti-health /etc/crontab # expect: */15 * * * * line sudo ./health-check.sh # one-shot run sudo ./health-check.sh --status # connector ingestion state ``` ## 基于配置文件的虚拟机调优 `install-opencti.sh` 会自动检测虚拟机的硬件规格,并从五个调优配置中选择一个最合适的: | 内存 | 配置文件 | Elasticsearch 堆内存 | Worker 副本数 | |------------|-------------|--------------------|-----------------| | < 6 GB | minimal | 2G | 1 | | 6 到 12 GB | lab | 3G | 2 | | 12 到 24 GB| standard | 6G | 3 | | 24 到 48 GB| production | 12G | 4 | | 48+ GB | enterprise | 16G | 6 | 你可以随时通过编辑 `/opt/opencti/.env` 并运行 `docker compose up -d` 来手动覆盖这些设置。 ## 连接器部署选项 共有四种添加连接器的方式,按利弊权衡排序如下: 1. **`add-connector.sh`** *(推荐社区版用户使用)* - 模板驱动、可重复、幂等、不依赖 UI。内置模板并支持自定义 YAML。 2. **XTM Composer + UI 目录** - Filigran 官方的 UI 驱动部署方式。**需要企业版。** 应用内提供 30 天免费试用。为个人研究人员和注册慈善机构提供免费的非营收(NFR)许可证。请在 [filigran.io](https://filigran.io/opencti-enterprise-editions-license-request/) 申请。 3. **Portainer / Dockge** - 通用的 Docker Compose UI 管理。直观易用,但本质上仍是基于 YAML 的。如果你已经在同一台主机上管理其他 Docker 工作负载,这会非常有用。 4. **手动编辑 compose 文件** - 最后的手段。直接编辑 `/opt/opencti/docker-compose.yml`,并使用 `uuidgen` 为每个连接器生成新的 UUID。这种方式极易出错,尤其是在处理 UUID 复用和 YAML 缩进问题时。 详细的利弊分析请参阅 [LESSONS-LEARNED.md](LESSONS-LEARNED.md)。 ## 安全加固:大多数指南忽略的盲区 `harden.sh` 解决了在开箱即用的安装中遗留下来的三个真实的生产环境暴露风险。 ### Docker + UFW 防火墙绕过问题 在默认情况下,执行 `ufw deny 9000` 对使用 `-p 9000:9000` 启动的容器毫无作用。Docker 会直接修改 iptables 并完全绕过 UFW 的 INPUT 链。这是 Docker 的官方设定行为,而不是一个 bug。大多数 OpenCTI 指南都会将 MinIO、RabbitMQ 管理界面、Elasticsearch 和 Redis 暴露在 `0.0.0.0` 上,而运维人员却误以为 UFW 正在保护它们。 `harden.sh` 从两个方面解决了这个问题:首先,将这些内部服务重新绑定到 `127.0.0.1`,使它们永远无法从局域网中被访问;其次,将标准的 ufw-docker 规则写入 `/etc/ufw/after.rules`,使得 UFW 今后能够真正地对容器流量生效。 ### 免去 DNS 烦恼的 TLS 加密 对于内部主机名(`*.local`、`*.lan`、`*.internal`、`*.test`),Caddy 会从其内置的本地 CA 签发自签名证书。只需在每台客户端机器上信任一次该根 CA 证书,你就能在 `https://cti.lab.local` 上获得绿色的小锁图标,而无需购买域名或搭建内部 PKI。 对于公共主机名,只需添加 `--email you@example.com`,Caddy 就会自动获取真实的 Let's Encrypt 证书。同一个 Caddyfile、同一个脚本,只是证书来源不同。 ### SSH 与操作系统安全维护 加入了保守的 SSH 加固措施(禁用 root 登录、最多尝试 4 次、禁用 agent 或 X11 转发),启用了无人值守的安全升级,并安装了 fail2ban,在 10 分钟内发生 5 次 SSH 登录失败后实施 1 小时的封禁。这些措施谈不上新奇——只是人们经常忽略了那些从实验用途逐渐转为生产环境的服务器所需的一致性安全配置。 ## 健康监控:真正有效的信号 `health-check.sh` 监控以下四个层面: 1. **平台** - 使用访问密钥检测 `/health` 端点 2. **核心服务** - Elasticsearch、RabbitMQ、Redis、MinIO 的容器健康状况 3. **连接器** - 容器状态及数据摄入停滞检测 4. **Worker(工作节点)** - 副本数量是否与配置文件匹配 连接器检查使用 **OpenCTI GraphQL API** 来查询每个连接器最近的 `Work.received_time`——这也就是 OpenCTI Web 界面在连接器详情页所使用的字段。如果一个计划任务连接器在运行 60 分钟后仍未生成新的 Work 记录,脚本就会将其标记为停滞并执行重启。 **为什么不直接检查容器的运行状态?** 因为一个连接器容器可能显示为“running(运行中)”,但实际上什么也没做——可能因为密钥被吊销而卡在向 OTX API 的调用上、可能因为上游响应缓慢而阻塞、或者可能陷入了分页循环中死循环。因此,容器状态是必要条件,但并不充分。`Work.received_time` 才是证明该连接器确实在履行其职责的凭证。 **防死循环退避:** 在同一个容器经历 3 次连续的自动重启后,脚本将放弃重启并等待人工干预。在修复根本原因后,请使用 `--reset` 参数重置计数。 ``` sudo ./health-check.sh # one-shot check sudo ./health-check.sh --install-cron # install 15-min cron sudo ./health-check.sh --status # restart counters + ingestion state sudo ./health-check.sh --reset # clear backoff counters ``` ## 系统要求 - **操作系统:** Ubuntu 22.04 LTS 或 24.04 LTS - **推荐配置:** 16 GB 内存,8 核 CPU,100+ GB SSD,桥接网络 - **最低配置:** 8 GB 内存,4 核 CPU,50 GB 磁盘 *(可以安装并运行,但速度较慢)* - **网络环境:** 需要连接外部互联网以下载镜像和获取情报源数据 - **权限:** root 权限(通过 `sudo`) ## 测试环境 - OpenCTI 平台:**6.8.x** *(默认固定版本:6.8.12)* - Ubuntu:**22.04 LTS** 和 **24.04 LTS** - Docker:**来自 Docker 官方 APT 源的 CE 版本** (当前稳定版) - Caddy:**2.11.x** - VMware Workstation、ProxmoxVE、AWS EC2 *(均已通过测试)* 其他系统配置理论上也可以运行,但未经验证。我们非常欢迎提交为其他发行版(如 Debian、RHEL、Rocky)增加测试覆盖率的 Pull Request。 ## 状态 本工具包作为正在持续进行的 OpenCTI 部署工作流的一部分,处于**积极维护**状态。我们会定期审查提交的 Issue 和 Pull Request。 **在这里,“积极维护”意味着:** - 通过 Issue 报告的 Bug 将在合理的时间内得到分类处理 - 可按需添加新的连接器模板 - 会持续跟进当前发布的 OpenCTI 6.8.x 和 7.x LTS 版本的兼容 - 没有服务等级协议(SLA)——这是一个社区作品,而非商业产品 **如果您遇到以下情况,请不要使用此工具包:** - 你需要进行物理隔离(air-gapped)或完全离线的部署 *(脚本假设了网络畅通)* - 你正在搭建多节点的 OpenCTI 集群 *(本工具包针对的是单虚拟机部署)* - 你需要正式的供应商支持 *(请使用 Filigran 的商业产品)* - 你目前就需要对 RHEL/Rocky/CentOS 的支持 *(截至目前仅支持 Ubuntu)* ## 文档 - [经验教训](LESSONS-LEARNED.md) - 部署过程中遇到的真实问题以及内置在脚本中的修复方法 - [贡献指南](CONTRIBUTING.md) - 如何提交 Issue、Pull Request 以及新的连接器模板 - [安全策略](SECURITY.md) - 如何负责任地报告安全漏洞 - [示例](examples/) - 你可以参考和修改的自定义连接器 YAML 文件 ## 许可证 MIT - 可自由使用、修改、重新分发甚至销售。详见 [LICENSE](LICENSE)。 ## 致谢 如果这个工具包为您节省了部署的痛苦时间,最廉价的感谢方式就是给本仓库点个 ⭐,以便让更多的从业者发现它。当然,提交 Pull Request 和 Issue 报告对我们帮助更大。
标签:abuse.ch, CISA项目, Cloudflare, CTI平台, Docker, Docker-UFW, HTTPS, MITRE ATLAS, MITRE ATT&CK, MIT许可, OpenCTI, RabbitMQ, 健康检查, 威胁建模, 威胁情报, 安全实验室, 安全运营, 安全防御评估, 定时任务, 应用安全, 开发者工具, 开源, 性能调优, 扫描框架, 搜索引擎查询, 漏洞修复, 版权保护, 特权提升, 生产环境, 系统加固, 网络安全, 网络安全培训, 自动化运维, 自动化部署, 防火墙, 隐私保护