Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitLabGitLab/oseguera12/cowrie-honeypot-digitalocean
云基础设施安全网络安全DevSecOps威胁情报日志分析
GitLaboseguera12/cowrie-honeypot-digitalocean

Cowrie and Grafana Honeypot using Terraform on DigitalOcean

基于Cowrie、Loki、Promtail和Grafana构建的中等交互SSH/Telnet蜜罐——通过Terraform部署于DigitalOcean,并配有GitLab CI验证流水线。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站
153个月前尚未审核

使用 Terraform 在 DigitalOcean 上部署 Cowrie 和 Grafana 蜜罐

演示视频

目录

  • 目录
  • 系统概述
  • 技术栈
  • 项目目录结构
  • 硬件要求
  • 安装与配置
  • Terraform 状态管理
  • CI/CD 流水线
  • 系统架构
  • 观察记录
  • 使用方法
  • 项目文档
    • 架构设计与权衡
    • 系统运行流程
    • 遇到的问题与限制
    • 未来改进
  • 安全考量
  • 贡献者
  • 许可证

系统概述

一个使用 Terraform 部署在 DigitalOcean 云服务器上的 SSH/Telnet 蜜罐堆栈。攻击行为由 Cowrie 捕获,存储在 Loki 中,并在 Grafana 中通过攻击来源的实时世界地图进行可视化。

技术栈

  • DigitalOcean
  • Terraform
  • Docker
  • Cowrie
  • Loki
  • Grafana
  • Promtail
  • DB-IP (City Lite 下载)

项目目录结构```

honeypot/ ├── cowrie/ │ └── etc/ │ ├── cowrie.cfg # Cowrie honeypot configuration │ └── userdb.txt # Accepted and rejected fake credentials ├── geoip/ │ └── .gitkeep # Placeholder - MMDB files are gitignored ├── grafana/ │ ├── provisioning/ │ │ ├── dashboards/ │ │ │ ├── dashboards.yml # Provisioning: dashboard provider │ │ │ └── honeypot-dashboard.json # Pre-built Attack Monitor dashboard │ │ └── datasources/ │ │ └── loki.yml # Auto-provisioned Loki datasource │ └── grafana.ini # Grafana server settings ├── loki/ │ └── config.yml # Loki single-binary config and retention ├── promtail/ │ └── config.yml # Promtail scrape and GeoIP pipeline ├── scripts/ │ ├── geoip-update.sh # Download or refresh GeoIP database │ └── setup-firewall.sh # Host UFW rules for honeypot ports ├── terraform/ │ ├── templates/ │ │ ├── cloud-init.yaml.tftpl # Droplet first-boot script (Terraform-templated) │ │ └── env.tftpl # .env lines embedded via Terraform │ ├── backend.tf # Terraform backend config │ ├── main.tf # Droplet, SSH key, firewall, cloud-init │ ├── outputs.tf # IPs and helpful post-apply values │ ├── terraform.tfvars.example # Example variable values (copy to terraform.tfvars) │ ├── variables.tf # Terraform input variables │ └── versions.tf # Terraform and provider version constraints ├── .env.example # Example environment file for manual setup ├── .gitignore # Ignored paths and files ├── .gitlab-ci.yml # CI/CD pipeline: fmt, validate, Checkov ├── docker-compose.yml # Docker Compose file for the honeypot stack ├── LICENSE # GPLv2 license ├── manual-deployment.sh # Legacy VM bootstrap without Terraform └── README.md # Project documentation

root@kitploit:~
## 硬件需求

> 注意:这些要求基于 DigitalOcean 截至 2026 年 5 月的 Basic Droplet 方案,是运行该项目的最低要求。

- 提供商:DigitalOcean
- 方案:Basic Droplet - 1 个 Intel vCPU
- 内存:1 GB(+2 GB 交换空间)
- 存储:35 GB NVMe SSD
- 操作系统:Ubuntu 24.04 LTS

## 安装与设置

>注意:安装后,建议打开一个新终端,验证在关闭原始会话之前仍能通过 `ADMIN_SSH_PORT`(默认:2022)进行 SSH 连接。

### Terraform 部署(推荐)

1. 创建一个具有读写权限的 DigitalOcean API 令牌:

- 登录 DigitalOcean,导航至 Account > API > Tokens > Generate New Token。
- 为令牌命名(例如 "Cowrie Honeypot")并选择 "Full Access" 权限。
- 点击 "Generate Token",将令牌值复制到安全位置(之后将无法再次查看)。

2. 在本地机器上创建一个 SSH 密钥对,并复制公钥路径。

3. 进入 `terraform` 目录,然后复制并编辑变量文件:

> 注意:在应用之前,`terraform.tfvars` 中至少必须配置 `do_token`、`ssh_public_key_path` 和 `grafana_admin_password`。```bash
cd terraform
cp terraform.tfvars.example terraform.tfvars
  1. 应用配置并开始部署:

注意:本地机器上必须安装 Terraform。请访问 Terraform 安装指南 获取说明。```bash terraform init # Initialize Terraform and download providers terraform apply

root@kitploit:~
5. 如果测试 - 使用替换重新部署:```bash
terraform apply -replace="digitalocean_droplet.honeypot" 
  1. 清理 - 完成后销毁基础设施:```bash terraform destroy
root@kitploit:~
### 手动部署(旧版)

1. 创建一个满足上述硬件要求并包含你的 SSH 密钥的 DigitalOcean droplet。

2. SSH 登录到该 droplet 或使用 DigitalOcean 网页控制台,然后运行以下命令:```bash
ssh root@<your-droplet-ip> # If using DigitalOcean web console, skip this command
git clone https://gitlab.com/Oseguera12/cowrie-honeypot-digitalocean.git /opt/honeypot
cd /opt/honeypot
cp .env.example .env
nano .env
bash manual-deployment.sh

Terraform 状态管理

注意:默认情况下,Terraform 将状态写入本地机器的 terraform/terraform.tfstate。该文件包含敏感的输出值(Droplet IP、Grafana 密码、SSH 密钥指纹),绝不能提交到版本控制中。.gitignore 已涵盖 *.tfstate 和 *.tfstate.*。

本地状态的风险:

  • 如果机器丢失或文件被删除,状态会丢失
  • 无法在团队成员之间共享
  • 没有锁定机制——两个并发的 apply 运行可能损坏文件

对于任何超出个人实验的范围,请切换到远程后端。terraform/backend.tf 包含一个注释掉的 DigitalOcean Spaces 配置(兼容 S3)。

启用远程后端的方法:

  1. 在 DigitalOcean 账户中创建一个 Spaces 存储桶
  2. 在 API > Spaces Keys 下生成一个 Spaces 访问密钥
  3. 将密钥导出为环境变量(不要将它们放入 terraform.tfvars 中): ```bash export AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY=
    root@kitploit:~
  4. 在 terraform/backend.tf 中取消注释 backend "s3" 块,并填写你的存储桶名称和区域端点。
  5. 运行 terraform init -migrate-state 将现有的本地状态迁移到 Spaces。

CI/CD 流水线

.gitlab-ci.yml 在每次推送时,在单一的 validate 阶段中运行三个任务:

注意:terraform:fmt 和 terraform:validate 在失败时会阻塞流水线。checkov:scan 设置为 allow_failure: true,因为某些发现是有意为之的权衡。对于可接受的特定发现,请使用内联的 # checkov:skip=CKXXX 注释来抑制,而不是完全禁用该任务。

已知接受的风险

CKV_DIO_4(“确保防火墙入站规则不是完全开放”)针对整个 digitalocean_firewall 资源触发一次。通过在 terraform/main.tf 的资源块内放置一个 # checkov:skip=CKV_DIO_4: 注释来抑制它。下表记录了每个开放端口为何是有意为之。

系统架构```mermaid

flowchart TB internet((Internet))

subgraph tf["Terraform"] fw[DigitalOcean Cloud Firewall] droplet[Ubuntu 24.04 droplet] fw --> droplet end

subgraph compose["Docker Compose on droplet"] cowrie["Cowrie honeypot — SSH on port 22, Telnet on port 23"] promtail[Promtail with GeoIP labels] loki[Loki log store] grafana["Grafana — host :3000"] cowrie -->|JSON logs from ./data/cowrie-logs| promtail --> loki --> grafana end

internet -->|22/23 honeypot| fw internet -->|Admin SSH :2022| fw internet -->|Grafana :3000| fw droplet --> compose

root@kitploit:~
## Observations

Data captured over 5 days of live deployment (2026-05-05 to 2026-05-09):

| Metric                    | Value  |
|---------------------------|--------|
| Total connections         | 41,700 |
| Login attempts            | 15,400 |
| Successful logins         | 868    |
| Commands executed         | 836    |
| Files downloaded          | 6      |
| Unique source countries   | 106    |

### Top attacking countries

| Country         | Connections |
|-----------------|-------------|
| Germany         | 9,768       |
| Netherlands     | 9,110       |
| United States   | 7,706       |
| United Kingdom  | 3,858       |
| Singapore       | 1,770       |
| Belgium         | 1,422       |

### Credential patterns

The most common username attempted was `root` with 3,866 attempts, followed by
`admin` (728) and `user` (494), reflecting automated scanners targeting
default credentials and known service accounts. The most common password was
`123456` (1,480 attempts) followed by `123` and `12345`, consistent with
dictionary-based brute-force tooling.

### Attacker behavior inside the fake shell

868 login attempts succeeded against the fake credential set. Of those sessions,
836 commands were executed. The most common command was `uname -s -v -n -r -m`
(360 executions) — a standard system fingerprinting command run by automated
post-exploitation scripts to identify the target OS and architecture before
deploying a payload. Other observed commands included `export HISTFILE=/dev/null`
to disable shell history logging, and `export HISTSAVE=/dev/null`, indicating
attackers actively attempting to cover their tracks even inside what they believed
was a compromised system.

### Key takeaway

The volume of automated scanning traffic — 41,700 connections in 5 days from 106
countries — confirms that any publicly accessible SSH service faces constant
brute-force attempts within hours of exposure. The behavioral pattern of
immediately running `uname` followed by history-suppression commands is consistent
with automated post-exploitation frameworks operating with minimal human
involvement.

## Usage

### Using Grafana Dashboard

> Note: Dashboard Credentials are set in terraform.tfvars or .env (for manual deployment)

Dashboard can be accessed at:```
http://<your-droplet-ip>:3000

使用 admin / <GRAFANA_ADMIN_PASSWORD> 登录。

Cowrie 蜜罐接受凭证

cowrie/etc/userdb.txt - 包含蜜罐可接受的凭证。

  • 编辑此文件以调整蜜罐凭证

  • 登录成功后攻击者进入伪 shell,所有命令均被记录

  • 被拒绝的条目记录为失败尝试

项目文档

本节详细介绍了开发本项目期间所做的决策和遇到的问题。它反映了项目的开发过程和经验教训。如果只想了解如何使用该项目,请跳至安全注意事项。

架构设计及权衡

为何选择云托管?

  • 蜜罐需要高可用以全天候捕获和分析数据。虽然可以在本地机器上使用虚拟机或容器部署蜜罐,但保持该机器全天在线和可访问并不实际。云托管为托管蜜罐和持续捕获数据提供了更实用可靠的解决方案。
  • 此外,由于云托管允许选择特定资源和服务,因此更容易创建和维护可部署和扩展的代码库。只要项目正常工作且配置的环境符合预期,任何有兴趣部署自己蜜罐的人都可以无需额外步骤进行部署。

为何选择 DigitalOcean?

  • 虽然 AWS、GCP、Azure 等其他提供商也可用,但 DigitalOcean 为本项目提供了更经济的选择。由于蜜罐必须保持在线并全天候向 Droplet 内外发送数据,DigitalOcean 的定价模式有助于保持成本可预测。这未考虑其他提供商的促销活动,例如为新用户或长期承诺提供的免费积分或折扣。

为何选择 Terraform?

  • 另一种方案 manual-deployment.sh 适用于不熟悉 Terraform 或不愿使用它的用户。该路径需要预配 Droplet、连接、克隆仓库并运行脚本。Terraform 允许更快迭代:编辑代码库并重新部署,而无需从本地机器重复每个手动步骤。它还简化了基础设施的拆除和重新开始。如果项目从单个蜜罐扩展到蜜网,Terraform 的扩展性优于手动配置或仅使用旧脚本。

为何选择 Cowrie?

  • Cowrie 是一个知名、积极维护的中等交互蜜罐。它可能比更轻量的陷阱消耗更多资源,但其功能以及与栈中其他组件的配合使其成为自然选择。针对特定用例可以替换其他蜜罐,尽管许多蜜罐已不再维护或需要更多资源。

为何选择 Loki?

  • 主要限制是硬件:在具有 1 GB RAM 且运行多个其他服务的 Droplet 上进行日志聚合和搜索。Elasticsearch 太重。Graylog 底层仍然依赖 Elasticsearch,在限制条件下无法正常运行。其他选项也类似消耗资源。Grafana Loki 与栈匹配,并且在非常重负载的查询之外都能保持在预算内。牺牲了一些查询功能:如果仪表盘拉取过多数据,Loki 会变慢,UI 无响应,蜜罐可能丢失或延迟数据。

为何选择 Grafana?

  • 最初考虑自定义仪表盘,但 Grafana 功能完整、可定制且文档完善,加快了搭建速度,使我能够专注于收集和发送日志。它不如最小化的自定义 UI 轻量,但在小幅升级 Droplet 后,它在硬件限制内运行良好。其他具有预构建仪表盘的工具会消耗更多资源,而在此用例中没有明显优势。

为何选择 Promtail?

  • Promtail 是 Loki 的既定日志发送器(Grafana Alloy 是较新的继承者)。Promtail 占用 RAM 较少,并支持与本项目匹配的流水线阶段(JSON 解析、GeoIP、标签)。Fluentd 或 Logstash 等替代品对于 1 GB Droplet 来说太重。

为何选择 GeoIP?

  • 攻击地图需要源 IP 的城市和国家上下文。项目通过 scripts/geoip-update.sh 使用 DB-IP City Lite:无需账户或 API 密钥,从而简化了任何克隆仓库用户的部署。Promtail 内置的 GeoIP 阶段读取本地 MMDB 文件并为 Grafana Geomap 面板添加标签。

系统执行流程

使用 Terraform 或手动部署脚本设置蜜罐时发生的步骤概述。

Terraform(推荐)

在您的机器上:

  1. 配置 terraform/terraform.tfvars:API 令牌、SSH 公钥路径、Grafana 密码、仓库 URL/分支、可选 manage_do_firewall
  2. 运行 terraform init:本地安装 DigitalOcean 提供商
  3. 运行 terraform apply:Terraform 构建计划,然后创建或更新资源

在 DigitalOcean 中:

  1. SSH 公钥上传到您的账户
  2. 根据 Terraform 变量创建 Droplet:
    • 镜像(Ubuntu)、大小和区域来自 droplet_image、droplet_size、region 等
    • 步骤 4 中的 SSH 密钥被附加
    • user_data 设置为渲染后的 cloud-init:首次启动时,VM 获得管理 SSH 端口、git repo_url / repo_branch 以及生成的 .env 的 base64 编码副本(来自 env.tftpl 的 Grafana 密码和 ADMIN_SSH_PORT)
  3. 云防火墙(仅在 manage_do_firewall 为 true 时):
    • Terraform 创建 DigitalOcean 防火墙并与该 Droplet 关联
    • 入站 TCP:您的管理 SSH 端口、22、23 和 3000(参见 terraform/main.tf)
    • 出站:广泛的 TCP/UDP 和 ICMP,以便 Droplet 可以更新软件包、拉取镜像和下载 GeoIP 数据

在 Droplet 上,cloud-init 自动运行:

  1. Cloud-config:package_update / package_upgrade,然后安装列出的软件包(curl、git、ufw 等)。引导早期,write_files 创建 /root/honeypot.env(Terraform 渲染的 env.tftpl 作为 base64:Grafana 密码、ADMIN_SSH_PORT 等)
  2. runcmd 引导脚本(在 terraform/templates/cloud-init.yaml.tftpl 中的顺序):将 iptables / ip6tables 设置为传统后端
  3. Swap:如果缺失则创建 2 GB 文件(/swapfile、fstab、swappiness)
  4. Docker:从 Docker 的 apt 仓库安装 Engine 和 Compose 插件;

在 Docker Compose 内部:

  1. Loki 启动并通过健康检查(容器内 /ready 端口 3100;主机上仅 127.0.0.1:3100)
  2. Promtail 和 Grafana 等待 Loki 健康(docker-compose.yml 中的 depends_on),然后启动
  3. Cowrie 可独立启动:它将主机端口 22 和 23 发布到容器中,并将 JSON 日志写入 data/cowrie-logs 供 Promtail 使用

手动设置(旧版)

用户创建 VM,SSH 登录,然后从克隆的仓库运行脚本。

manual-deployment.sh 执行以下操作:

  1. 加载并验证 .env
  2. 系统更新:apt update & apt upgrade
  3. 安装软件包:工具加上 ufw 和 iptables
  4. 配置 swap:如果缺失则创建 2 GB 文件
  5. 安装 Docker:Engine + Compose 插件,启用服务
  6. 配置 SSH:sshd 在 ADMIN_SSH_PORT 并禁用 ssh.socket
  7. 配置防火墙:scripts/setup-firewall.sh
  8. 配置 GeoIP:scripts/geoip-update.sh 和每月 cron
  9. 启动栈:docker compose pull / up -d,然后脚本等待 Loki 和 Grafana 健康检查并打印摘要

遇到的问题

硬件限制

  • 有限的硬件资源导致性能缓慢和偶尔超时。这影响了仪表盘,因为它依赖于能够以用户设定的间隔(有时由多个设备同时访问仪表盘)快速查询数据库。

考虑的解决方案:

  • 垂直扩展以获取更多资源
  • 使用更少面板的自定义仪表盘以减少数据库负载
  • 限制同时访问仪表盘的设备数量
  • 在单独的数据库中聚合日志供仪表盘读取,以减轻主数据库压力

解决方法:

  • 扩展到略大的 Droplet,性能更好

权衡:

  • 虽然成本每月增加约 1-2 美元,但可用资源翻倍。访问 NVMe SSD 存储和更多 RAM(相比基本 Droplet)使仪表盘更稳定且性能更高。这避免了花费时间创建具有更少面板和响应速度较差的体验的自定义仪表盘。

经验教训:

  • 利用促销、折扣和定价层级,在预算范围内获取尽可能多的资源。最基础的 Droplet 与成本略有增加之间的差异使可用资源翻倍,节省了时间,使产品更完整。此外,尽快运行蜜罐意味着更早捕获和分析数据。

超时问题

  • 尝试 SSH 到 Droplet 进行管理访问时连接超时。另外,docker compose up 失败,因为端口 22 已被占用,无法供 Cowrie 绑定。

考虑的解决方案:

  • sshd 配置错误或监听在错误的端口
  • 移动管理 SSH 端口后防火墙规则阻止了它
  • 其他进程已占用端口 22

解决方法:

  • 修正操作顺序:先将 sshd 移动到 ADMIN_SSH_PORT(默认 2022)并重启,然后停止并禁用 ssh.socket 以释放端口 22 供 Docker 绑定给 Cowrie。两步完成后应用 UFW 规则以允许新管理端口。

权衡:

  • 没有功能权衡。这是一个配置和顺序修复。

经验教训:

  • 注意那些需要按特定顺序释放资源才能启动的服务。在 Ubuntu 24.04 上,ssh.socket 是一个 systemd socket 单元,它保留端口 22 用于按需 SSH 激活。必须在 Docker 绑定主机端口 22 给 Cowrie 之前停止并禁用它。如果它仍处于活动状态,docker compose up 将以"地址已在使用中"失败。

未来改进

GeoIP 功能

  • 城市级 GeoIP 是近似的。地图面板依赖于 DB-IP 数据库,可能遗漏或错误标记某些 IP(移动设备、VPN、过时数据)。栈可以稍后扩展,使用不同的数据库或富化管道以获得更高的地理位置置信度。

Grafana HTTPS

  • Grafana 当前运行在 HTTP 上。未来的改进将是将其放在带有 TLS 证书的反向代理(nginx 或 Caddy)后面,这也允许将 Grafana 端口限制为 localhost 并通过 443 代理。

代理服务器功能

  • 为了使蜜罐看起来更真实,可以通过位于不同区域的服务器进行代理。这样攻击者更难根据 IP 或地理位置识别其为蜜罐。

安全注意事项

  • Grafana 使用 HTTP。未启用 TLS 的端口 3000 意味着凭据以明文传输。
  • Loki 仅在 127.0.0.1 上监听(不暴露)
  • terraform.tfvars 被 gitignore 忽略,绝不能提交
  • Cowrie 在其容器内以非特权用户运行
  • 如果 Grafana 暴露在测试环境之外,应将其置于具有 HTTPS 的反向代理之后

贡献者

  • Oseguera12

许可证

GNU 通用公共许可证版本 2.0(GPLv2) 请参阅 LICENSE 文件中的完整许可证文本。

下载工具
任务工具用途
terraform:fmthashicorp/terraform:1.8格式化:如果任何文件需要 terraform fmt 则失败
terraform:validatehashicorp/terraform:1.8配置有效性(不联系 DigitalOcean)
checkov:scanbridgecrew/checkov:latest检查 Terraform 代码中的 IaC 配置错误
检查 ID资源发现决定
CKV_DIO_4digitalocean_firewall.honeypot — 管理 SSH 入站管理 SSH 端口对 0.0.0.0/0 开放接受 — 为便携式实验室固定 IP 不现实;建议在生产环境中限制
CKV_DIO_4digitalocean_firewall.honeypot — 端口 22 入站端口 22 对 0.0.0.0/0 开放有意为之 — 这是 SSH 蜜罐暴露面;限制来源会破坏目的
CKV_DIO_4digitalocean_firewall.honeypot — 端口 23 入站端口 23 对 0.0.0.0/0 开放有意为之 — Telnet 蜜罐暴露面;理由同端口 22
CKV_DIO_4digitalocean_firewall.honeypot — 端口 3000 入站Grafana HTTP 暴露给 0.0.0.0/0为实验室可访问性接受 — 已知限制已在安全注意事项中记录;生产部署应限制为已知 IP 或通过 HTTPS 在端口 443 上进行代理
面板描述
攻击世界地图地理地图,包含热力图+标记层,显示每个连接的来源位置
总连接数选定时间范围内入站蜜罐会话的数量
登录尝试凭证暴力破解尝试总数
成功登录攻击者匹配 userdb.txt 凭证的次数
执行命令在伪 shell 中执行的 shell 命令
下载文件通过 wget/curl 捕获的恶意软件/脚本
连接速率时间序列:连接/秒、失败登录/秒、成功登录/秒
热门用户名尝试次数最多的 SSH 用户名
热门密码尝试次数最多的密码
热门命令执行次数最多的 shell 命令
按国家统计的攻击国家级别连接表
近期事件最新事件的实时日志流
文件下载攻击者尝试拉取的每个文件的表格
systemctl enable --now docker
  • 真实 SSH:sshd 在 ADMIN_SSH_PORT 上;禁用 ssh.socket 以释放主机端口 22 供 Cowrie 使用
  • 应用仓库:从 repo_url / repo_branch 执行 git clone 到 /opt/honeypot(必须包含 docker-compose.yml 和配置文件)
  • 磁盘上的 .env:将 /root/honeypot.env 移到 /opt/honeypot/.env(模式 600)
  • 主机防火墙:scripts/setup-firewall.sh(UFW 用于管理 SSH、22、23、3000)
  • GeoIP:scripts/geoip-update.sh(DB-IP City Lite 放入 geoip/);为同一脚本添加每月 cron 行
  • Cowrie 绑定挂载:创建 data/cowrie-logs 和 data/cowrie-dl,权限符合 Compose 预期
  • 启动栈:从 /opt/honeypot 执行 docker compose pull 然后 docker compose up -d