Honeypot 蜜罐部署实战:Cowrie SSH 攻击捕获指南

适用场景

Honeypot 蜜罐部署适用于安全团队主动捕获攻击行为的场景:在互联网暴露段部署诱饵系统,记录暴力破解、漏洞利用与恶意软件投放全过程,用于威胁情报积累、攻击溯源和人员安全意识培训。Cowrie 是其中最成熟的中交互 SSH/Telnet 蜜罐,可模拟真实终端并完整记录攻击者指令,适合安全运维与红蓝对抗演练。

前置条件

  • 一台可被外网访问的 Linux 服务器(建议 1 核 1G 以上)
  • 已安装 Docker 与 Docker Compose
  • 预留端口:蜜罐默认监听 2222(SSH),可映射到公网 22
  • 防火墙规则配合,避免蜜罐被扫描器误封

原理说明

Cowrie 基于 Twisted 框架实现,原理是模拟一个假的 SSH/Telnet 服务端:攻击者建立连接后,Cowrie 会处理其认证与命令交互,将输入的命令放入受限的虚拟文件系统执行并记录。所有交互以 JSON 格式写入日志,包含源 IP、用户名/密码、完整命令序列、下载的文件等。蜜罐的价值在于「诱敌深入」——真实业务不会有人尝试弱口令,任何对蜜罐的访问都默认可疑。

操作步骤

1. 使用 Docker 部署 Cowrie

# 创建部署目录
mkdir -p /opt/cowrie && cd /opt/cowrie

# 拉取镜像
docker pull cowrie/cowrie:latest

# 运行(公网端口 2222 模拟 SSH)
docker run -d --name cowrie \
  -p 2222:2222 \
  -v /opt/cowrie/log:/cowrie/cowrie-git/var/log/cowrie \
  --restart=unless-stopped \
  cowrie/cowrie:latest

2. 基础配置

# 进入容器查看配置模板
docker exec -it cowrie cat /cowrie/cowrie-git/etc/cowrie.cfg.dist > /opt/cowrie/cowrie.cfg

# 修改关键项:监听端口与主机名伪装
sed -i 's/^hostname = .*/hostname = web-prod-01/' /opt/cowrie/cowrie.cfg
sed -i 's/^listen_endpoints = .*/listen_endpoints = tcp:2222:interface=0.0.0.0/' /opt/cowrie/cowrie.cfg

# 挂载配置重启
docker stop cowrie && docker rm cowrie
docker run -d --name cowrie \
  -p 2222:2222 \
  -v /opt/cowrie/log:/cowrie/cowrie-git/var/log/cowrie \
  -v /opt/cowrie/cowrie.cfg:/cowrie/cowrie-git/etc/cowrie.cfg \
  --restart=unless-stopped \
  cowrie/cowrie:latest

3. 公网端口映射(将蜜罐伪装成真实 SSH)

# 若公网 22 端口空闲,直接映射
# 修改 -p 参数为 22:2222 即可

# 若 22 被真实 SSH 占用,用 iptables 转发(按需选择,勿照抄)
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
# 建议真实 SSH 改到高端口,将公网 22 让给蜜罐

注意:将蜜罐映射到 22 端口意味着所有 SSH 扫描流量都会进入蜜罐,请确保真实 SSH 已迁移至其他端口并配置密钥登录。

4. 日志分析与攻击提取

# 查看 JSON 日志(每条连接一条记录)
tail -f /opt/cowrie/log/cowrie.json | python3 -m json.tool

# 统计尝试过的用户名 TOP10
grep -o '"username": "[^"]*"' /opt/cowrie/log/cowrie.json | sort | uniq -c | sort -rn | head -10

# 统计攻击者来源 IP TOP10
grep -o '"src_ip": "[^"]*"' /opt/cowrie/log/cowrie.json | sort | uniq -c | sort -rn | head -10

# 提取攻击者执行过的完整命令
grep -o '"input": "[^"]*"' /opt/cowrie/log/cowrie.json | sort -u

5. 与告警平台联动

# 实时告警:新连接即通知(示例为钉钉/企业微信 Webhook 思路)
tail -F /opt/cowrie/log/cowrie.json | while read line; do
  src=$(echo "$line" | python3 -c "import sys,json;print(json.load(sys.stdin).get('src_ip',''))")
  [ -n "$src" ] && curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
    -H 'Content-Type: application/json' \
    -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"蜜罐告警: $src 尝试登录\"}}"
done

6. 数据沉淀为威胁情报

# 每日归档攻击 IP 到文件,供防火墙/威胁情报平台消费
grep '"src_ip"' /opt/cowrie/log/cowrie.json | grep -o '"[0-9.]*"' | sort -u > /opt/cowrie/attack_ips_$(date +%F).txt
# 接入 Suricata/防火墙黑名单示例
# iptables -A INPUT -s 1.2.3.4 -j DROP

配置验证

# 验证 1:端口监听正常
ss -tlnp | grep 2222

# 验证 2:本地模拟攻击(应看到认证失败记录)
ssh -p 2222 root@127.0.0.1
# 输入任意密码后应提示拒绝,且 cowrie.json 新增一条记录

# 验证 3:日志实时写入
tail -1 /opt/cowrie/log/cowrie.json | python3 -m json.tool

常见问题

FAQ 1:蜜罐会不会被攻击者利用攻击内网其他机器?

Cowrie 运行在容器内并提供受限虚拟文件系统,攻击者命令不会真实执行,无法形成跳板。但仍建议:仅开放蜜罐端口、限制容器资源(--memory=512m --cpus=1)、宿主机开启防火墙,并将蜜罐与生产网络严格隔离。

FAQ 2:如何提高蜜罐的诱捕效果?

伪装越像真实系统越容易诱捕:修改 hostname 为业务风格名称、在虚拟文件系统中放置 /etc/passwd、数据库备份等诱饵文件(Cowrie 默认提供 fs.pickle 虚拟文件系统)、开启 Telnet 服务。同时监控指标不应只看连接数,更要关注成功登录与命令执行的深度。

FAQ 3:蜜罐日志量太大如何处理?

对 JSON 日志按天轮转:logrotate -f /etc/logrotate.d/cowrie;分析侧建议接入 ELK/ClickHouse 做聚合检索,仅将命中高危行为(如成功登录、下载文件)的连接提取告警,避免告警疲劳。

总结

Honeypot 蜜罐是攻防对抗中性价比极高的「情报探针」。通过 Cowrie 的 Docker 化部署,几分钟即可获得一个能完整记录 SSH 攻击行为的诱饵系统;将其日志持续沉淀为攻击 IP 与常用凭据清单,可与防火墙、Suricata、威胁情报平台联动形成防御闭环。蜜罐应作为安全体系的补充层,与漏洞管理、基线加固等手段配合使用。