1. 项目概述为什么我们需要一个“诱饵”系统在网络安全领域防守方和攻击者的信息永远是不对称的。攻击者可以无数次尝试而我们只要失守一次就可能面临数据泄露、服务中断甚至勒索的严重后果。传统的防火墙、入侵检测系统IDS就像城堡的围墙和卫兵能阻挡和发现明显的入侵行为但对于那些伪装成“自己人”、利用未知漏洞0day或进行长期、低强度的“慢速攻击”往往力不从心。这时我们就需要一个“诱饵”——蜜罐。蜜罐的本质是一个故意暴露的、充满诱惑但实际无害的系统或服务。它的核心价值不是防御而是感知、诱捕和溯源。当攻击者被蜜罐吸引并与之交互时他的一举一动都会被详细记录包括攻击来源、使用工具、攻击手法、意图目标等。这些情报对于安全团队来说是无价之宝能让我们从被动防御转向主动预警。Hfish 正是这样一款优秀的开源蜜罐。它轻量、跨平台、支持多种仿真服务从低交互的端口监听到高交互的SSH、Redis、MySQL等服务的深度仿真功能全面。对于中小团队、个人开发者或想学习安全监控的爱好者来说Hfish 是一个绝佳的入门和实践工具。今天我就以一个运维兼安全初学者的视角带你从零开始完成一次 Hfish 的简单部署并分享部署中和部署后那些“教科书上不会写”的实战细节。2. 部署前的核心思路与准备工作部署任何一个服务尤其是安全相关服务最忌讳的就是“拿到就装”。盲目安装不仅可能达不到效果还可能引入新的风险。部署 Hfish 前我们需要想清楚几个核心问题。2.1 部署目标与场景定位首先问自己我部署 Hfish 是为了什么学习与研究想了解攻击者的常见手法收集一些攻击样本。这是最常见的个人需求。内网威胁感知担心内网有横向移动的威胁想在内网关键节点部署蜜罐一旦有异常访问立即告警。互联网暴露面监控将蜜罐部署在公网云服务器监控针对常见服务如SSH、RDP、Web的扫描和爆破攻击了解外部威胁态势。欺骗与延缓攻击作为主动防御的一部分用蜜罐消耗攻击者的时间和资源保护真实资产。对于“简单部署”这个目标我们通常定位在“学习研究”和“内网威胁感知”这两个场景。公网部署涉及更多安全策略如防火墙规则、反向代理、日志脱敏等我们后续可以进阶讨论。2.2 环境与资源评估Hfish 非常轻量对资源要求极低。其架构分为管理端服务端和节点端客户端。管理端负责集中展示数据、管理节点、配置告警。可以单独部署在一台机器上。节点端实际部署在各个位置如不同网段、不同服务器的探针负责模拟服务、诱捕攻击并上报数据。对于最简单的“一体机”部署管理端和节点端在同一台机器建议配置如下CPU: 1核即可。内存: 512MB 足够1GB 更从容。磁盘: 5-10GB主要用于存放日志和数据库。操作系统: Linux 是首选如 CentOS 7/8, Ubuntu 18.04/20.04Windows 也支持但不如 Linux 方便管理。本文以Ubuntu 20.04 LTS为例。一个重要原则蜜罐本身不应部署在存有真实敏感业务或数据的生产服务器上。最好使用一台独立的、干净的虚拟机或云主机。因为蜜罐的目的是被攻击理论上它是不安全的。2.3 工具选型与获取Hfish 官方提供了多种部署方式二进制包、Docker 容器、源码编译。对于新手我强烈推荐Docker 部署。原因如下环境隔离Docker 容器将 Hfish 与宿主机环境隔离避免因蜜罐漏洞影响到宿主机。部署简单无需处理复杂的系统依赖一条命令即可拉起服务。维护方便升级、回滚、迁移都非常容易。资源可控可以方便地限制容器的 CPU、内存使用。因此我们的准备工作就两项准备一台 Linux 服务器物理机、虚拟机或云主机均可。在这台服务器上安装 Docker 和 Docker Compose。如果你还没有安装 Docker可以执行以下命令以 Ubuntu 为例# 更新软件包索引 sudo apt-get update # 安装必要的依赖 sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # 添加 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加 Docker 软件源 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 再次更新并安装 Docker sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 安装 Docker Compose (这里以 v2 为例你也可以安装 v1) sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker --version docker-compose --version # 启动 Docker 服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker注意如果你的服务器位于国内访问 Docker Hub 可能较慢建议配置国内镜像加速器如阿里云、腾讯云、中科大的镜像源这能极大提升镜像拉取速度。具体配置方法可参考对应云服务商的文档。3. 一步步实操使用 Docker Compose 部署 Hfish有了 Docker 环境部署 Hfish 就变得异常简单。我们采用 Docker Compose 来定义和运行服务这样配置文件清晰管理也方便。3.1 创建项目目录与配置文件首先我们创建一个独立目录来存放所有相关文件保持环境整洁。mkdir ~/hfish-docker cd ~/hfish-docker然后创建 Docker Compose 的配置文件docker-compose.yml。这个文件定义了 Hfish 服务如何运行。vim docker-compose.yml将以下内容粘贴进去。这里我选择了一个社区维护的、更新较及时的镜像。version: 3.8 services: hfish: image: imdevops/hfish:latest container_name: hfish-server restart: unless-stopped ports: - 4433:4433/tcp # 管理端 WEB 界面 - 4434:4434/tcp # 管理端 API 端口节点注册用 # 以下是模拟服务端口根据你的需要开放。这里先开放几个常见的。 - 22:22/tcp # SSH 蜜罐 - 80:80/tcp # HTTP 蜜罐 - 3306:3306/tcp # MySQL 蜜罐 - 6379:6379/tcp # Redis 蜜罐 environment: - TZAsia/Shanghai # 设置容器时区 volumes: - ./data:/opt/hfish/data # 持久化数据目录包括日志、配置、数据库 - ./logs:/opt/hfish/log # 持久化日志目录可选也可放在data里 networks: - hfish-net networks: hfish-net: driver: bridge配置文件关键点解析ports: 这是最需要理解的部分。格式是宿主机端口:容器端口。4433和4434是 Hfish 管理端自身的端口必须映射。后面的22, 80, 3306, 6379是蜜罐模拟的服务端口。这意味着你的宿主机这些端口将被占用并暴露为蜜罐。请确保宿主机上原本没有重要服务使用这些端口否则会造成冲突。volumes: 将容器内的数据目录挂载到宿主机。这样即使容器删除攻击日志、配置信息也不会丢失。./data和./logs是当前目录下的子目录启动后会自动创建。networks: 创建一个独立的 Docker 网络为了良好的实践虽然这里只有一个服务。3.2 启动 Hfish 服务配置文件保存后在~/hfish-docker目录下执行一条命令即可docker-compose up -d-d参数代表在后台运行。你会看到 Docker 开始拉取镜像并创建启动容器。完成后可以用以下命令检查状态docker-compose ps如果状态显示为Up说明服务启动成功。3.3 初始化访问与配置服务启动后我们就可以通过 Web 界面进行访问和初始配置了。访问管理界面打开浏览器访问https://你的服务器IP:4433。注意是HTTPS协议。首次访问会提示安全风险因为使用的是自签名证书点击“高级”-“继续前往”即可。初始登录默认用户名是admin默认密码是HFish2021。登录后第一件事就是修改这个默认密码修改密码在管理界面通常可以在右上角用户信息或系统设置里找到修改密码的选项。配置节点因为我们是用 Docker Compose 一体部署的管理端和节点端在同一容器内。通常管理端会自动将本机注册为一个节点名为“默认节点”或“localhost”。你可以在“节点管理”或“集群管理”页面查看。如果看不到可能需要手动添加节点节点地址填写宿主机IP或容器内网IP认证密钥在管理端的“节点管理”页面生成。实操心得一端口冲突与规划部署时最容易踩的坑就是端口冲突。比如你的云服务器已经用 22 端口提供了真实的 SSH 服务那么 Docker 映射- “22:22”就会失败。你有两个选择修改蜜罐端口将宿主机端口改为一个不常用的高端口如- “2222:22/tcp”。这样攻击者扫描 2222 端口才会进入蜜罐但真实攻击者通常只扫常见端口效果会打折扣。停用真实服务或更换端口仅用于学习环境在学习环境中可以暂时停用宿主机的 SSH 服务 (sudo systemctl stop ssh)让出 22 端口给蜜罐。但切记这会让你无法通过 SSH 连接服务器务必确保你有其他方式如云控制台的 VNC能访问服务器。更安全的方式是将宿主机的 SSH 服务端口改为其他如 6022并配置防火墙只允许特定 IP 访问 6022。4. 核心功能配置与攻击仿真体验登录管理界面后你会看到一个仪表盘。初始状态数据是空的。我们需要让蜜罐“工作”起来并尝试模拟一次攻击看看效果。4.1 启用与配置蜜罐服务在 Hfish 中蜜罐服务是以“插件”或“服务”的形式存在的。我们需要在节点上启用它们。进入“服务管理”或“蜜罐管理”页面。你应该能看到一个节点就是你的 Docker 容器下面列出了很多可用的服务如SSH、HTTP、MySQL、Redis、FTP、Telnet等。找到你想开启的服务点击“启用”或“配置”。以SSH 蜜罐为例你可以配置欢迎信息Banner比如模仿成OpenSSH_7.6p1。可以配置弱口令账号列表当攻击者尝试爆破时使用列表中的账号密码会返回“登录成功”的假象并记录下攻击者尝试的密码。可以配置交互式命令仿真当攻击者登录后可以执行一些简单的ls,pwd,whoami命令并获得看似正常的响应这属于高交互蜜罐能记录更多行为。启用几个你感兴趣的服务如 SSH、HTTP、Redis。4.2 模拟一次攻击测试蜜罐配置好后它就在静静地监听端口。我们可以自己扮演一次“攻击者”来验证蜜罐是否正常工作。测试 SSH 爆破在你的个人电脑上使用 SSH 客户端尝试连接蜜罐并使用错误密码。ssh root你的服务器IP # 或者如果蜜罐端口不是22比如是2222 ssh -p 2222 root你的服务器IP输入任意错误密码连接会被拒绝。但此时回到 Hfish 的管理界面刷新仪表盘或进入“攻击日志”、“威胁情报”页面你应该能看到一条记录日志会显示攻击源 IP就是你自己的电脑IP、攻击时间、目标端口、协议以及尝试的账号密码。测试 HTTP 扫描在浏览器访问http://你的服务器IP或者使用curl命令curl http://你的服务器IP蜜罐的 Web 服务可能会返回一个默认页或错误页同时这次访问也会被记录在案标记为 Web 扫描或访问。4.3 查看与分析攻击日志这是蜜罐的核心价值所在。点击单条攻击日志你可以看到详细信息攻击来源IP、地理位置如果配置了IP库。攻击目标哪个节点、哪个服务端口。攻击载荷对于 SSH/FTP是尝试的用户名密码对于 HTTP是访问的 URL 和 User-Agent对于 Redis可能是执行的命令。攻击时间和风险等级。你可以通过这些信息分析攻击频率这个 IP 是否在短时间内进行了大量尝试攻击手法是简单的字典爆破还是尝试了特定的漏洞利用路径攻击来源是海外的代理IP还是国内的云主机这有助于判断是自动化脚本还是针对性攻击。实操心得二日志的“噪音”与“信号”将蜜罐部署在公网后你会很快被大量的扫描日志淹没其中99%都是自动化脚本的“无差别扫描”。这些是“噪音”。我们的目标是发现“信号”——那些针对性的、手动的、异常的交互行为。如何过滤关注成功诱捕的交互例如SSH蜜罐中攻击者使用了你配置的弱口令“成功登录”后又执行了几条命令。这比单纯的密码尝试更有价值。关注低频但异常的协议如果你的蜜罐开了某个非常用端口比如 5432 PostgreSQL一旦有访问就值得注意。设置告警规则在 Hfish 的告警设置中可以配置“同一源IP在X分钟内攻击次数超过Y次”则触发邮件或Webhook告警帮你从海量日志中抓出高频攻击者。5. 进阶部署考量与生产环境建议简单的单机 Docker 部署足以满足学习和内部监控的需求。但如果想用于更严肃的环境或者部署在公网以下几个方面的考量至关重要。5.1 网络架构与节点部署真正的威胁感知往往需要分布式部署。管理端独立部署将管理端部署在一台内网安全区、不对外暴露的服务器上。节点分布式部署在各个需要监控的网络区域如DMZ区、办公网、核心生产网旁路部署轻量级的节点端。节点端只需要与管理端的4434端口通信上报数据本身可以不开任何对外端口纯作为内网监测点。节点认证管理端和节点端之间通过预共享的密钥认证确保不会被恶意节点冒充接入。这种架构下即使某个节点被攻陷攻击者也很难溯源到管理端保证了监控系统的隐蔽性和安全性。5.2 安全加固与隐蔽性蜜罐自身的安全也不容忽视。修改默认端口将管理端的4433和4434端口在宿主机防火墙上映射为其他高端口避免被轻易扫描发现。强制 HTTPS/SSL确保管理界面通信加密。使用强密码与多因素认证admin 密码必须复杂有条件可集成 OAuth 等认证。定期备份与更新定期备份data目录下的数据。关注 Hfish 项目的 GitHub 发布页及时更新镜像到新版本修复可能存在的漏洞。宿主机安全确保 Docker 宿主机本身的安全补丁及时更新限制非 root 用户操作 Docker。5.3 数据持久化与日志分析我们之前通过 Docker 卷挂载实现了数据持久化。对于生产环境日志分析需要更进一步。集中式日志可以考虑将 Hfish 的攻击日志./data目录下的日志文件通过fluentd,filebeat等工具收集到Elasticsearch中用Kibana进行可视化分析与公司现有的 SIEM安全信息与事件管理系统集成。日志脱敏如果日志需要发送到第三方分析平台需注意脱敏避免包含敏感信息如你配置的诱饵密码如果和真实密码类似就需要处理。长期存储策略制定日志滚动和归档策略避免磁盘被撑满。5.4 告警响应集成Hfish 支持邮件、Webhook 等告警方式。将其与你的即时通讯工具如钉钉、飞书、企业微信或运维告警平台如 Prometheus Alertmanager集成可以实现实时告警。在 Hfish 管理界面配置 Webhook填写你搭建的告警机器人接口地址。配置告警规则例如“任何服务出现首次攻击”、“SSH蜜罐登录成功”、“某IP一分钟内攻击超过50次”等。当规则触发时告警信息会推送到你的手机或工作群让你能第一时间感知威胁。6. 常见问题与排查实录在实际部署和运行中你可能会遇到以下问题。这里记录了我遇到的一些情况和解决方法。问题一Docker Compose 启动失败提示端口被占用。现象docker-compose up -d时报错Bind for 0.0.0.0:4433 failed: port is already allocated。排查使用sudo netstat -tlnp | grep :4433查看哪个进程占用了 4433 端口。解决方案A停止占用端口的服务如果它不是必须的。例如如果是旧版 Hfish 进程将其停止。方案B修改docker-compose.yml文件将宿主机端口改为一个未被占用的端口如- “8443:4433/tcp”然后通过https://IP:8443访问。问题二能登录管理界面但节点状态异常或没有数据。现象节点显示“离线”或“异常”攻击日志始终为空。排查步骤检查节点服务进入容器docker exec -it hfish-server /bin/bash查看节点服务进程是否正常ps aux | grep [c]lient。检查节点日志tail -f /opt/hfish/log/*.log。检查网络连通性在容器内尝试ping管理端地址如果是本机就是127.0.0.1检查4434端口通不通telnet 127.0.0.1 4434。检查防火墙宿主机防火墙如ufw或firewalld是否放行了4433,4434以及你开放的蜜罐端口22,80等。对于云服务器还要检查安全组规则。检查配置确认节点配置的“管理端地址”和“认证密钥”是否正确。密钥需要在管理端的“节点管理”页面生成然后复制到节点的配置文件中对于 Docker 部署通常通过环境变量传递。问题三蜜罐服务没有响应。现象攻击者扫描到了端口但连接超时或被拒绝Hfish 没有记录。排查确认服务已启用在 Hfish 管理界面确认对应端口的蜜罐服务是“已启用”状态。确认端口映射正确docker-compose ps查看端口映射状态docker port hfish-server查看具体映射。从外部测试在另一台机器上使用telnet 你的服务器IP 22测试端口连通性。如果不通一定是网络或防火墙问题。查看容器日志docker logs --tail 100 -f hfish-server查看容器标准输出看是否有错误信息。问题四日志文件增长过快磁盘空间告急。现象部署在公网后./data目录体积迅速膨胀。解决设置日志轮转Hfish 自身可能有日志配置也可以在 Docker Compose 中通过logging选项配置日志驱动和轮转策略。services: hfish: ... logging: driver: “json-file” options: max-size: “10m” # 单个日志文件最大10MB max-file: “5” # 最多保留5个日志文件定期清理编写一个简单的计划任务cron job定期归档或清理过期的日志文件。调整日志级别如果不是调试需要可以将日志级别调整为WARNING或ERROR减少信息量。部署 Hfish 的过程本身并不复杂但让它持续、稳定、安全地发挥价值需要我们在部署之初就做好规划和考量。从一台简单的 Docker 容器开始你可以逐步扩展到分布式节点、集成告警、分析日志最终构建起一个主动的威胁感知体系。安全是一个持续的过程而蜜罐就是在这个过程中为你点亮黑暗森林的那盏灯让你看清潜在威胁的模样。