部署 T-Pot:构建高级威胁捕获与分析平台的精妙指南
介绍
T-Pot:多功能蜜罐平台简介
在网络安全领域,威胁检测与防御是至关重要的课题。T-Pot 作为一款由德国电信安全团队(Telekom Security)开发的多功能蜜罐平台,以其强大的功能和灵活的部署方式,成为安全研究人员和企业用户的得力助手。T-Pot 集成了 Kibana、Elasticvue 等强大的工具,内置了多个蜜罐,为用户提供了一个全面的网络威胁捕获、分析和可视化解决方案。
什么是 T-Pot?
T-Pot 是一个开源的蜜罐生态系统,旨在通过模拟真实的网络服务来吸引和捕获攻击者的行为。它基于 Docker 容器技术,能够快速部署多种蜜罐服务,并结合强大的日志分析和可视化工具,帮助用户深入了解网络威胁的模式与特征。无论是用于安全研究、威胁情报收集,还是企业内部的防护测试,T-Pot 都能提供高效的支持。
核心功能与特点
T-Pot 的强大之处在于其集成性和多样性,以下是其主要特点:
内置多种蜜罐
T-Pot 预装了多个常见的蜜罐服务,例如 Conpot(工业控制系统蜜罐)、Cowrie(SSH/Telnet 蜜罐)、Dionaea(恶意软件捕获蜜罐)等。这些蜜罐模拟了常见的网络服务(如 SSH、HTTP、FTP)以及工业协议,能够捕获从简单脚本攻击到复杂 APT(高级持续性威胁)的各类行为。强大的数据分析工具
T-Pot 集成了 Kibana 和 Elasticvue 等工具,通过 Elasticsearch 存储和索引捕获的数据。Kibana 提供直观的可视化仪表盘,让用户可以实时监控攻击事件、分析攻击来源和模式;Elasticvue 则为 Elasticsearch 数据提供了一个简洁的管理界面,方便用户查询和调试。容器化架构
基于 Docker 和 Docker Compose,T-Pot 将每个蜜罐和服务封装在独立的容器中。这种设计不仅简化了安装和维护,还提高了系统的可移植性和扩展性。用户只需一台支持 Docker 的服务器,就能快速搭建完整的蜜罐网络。灵活的部署模式
T-Pot 支持多种运行模式,包括标准模式(Standard)、Hive 模式(分布式部署)和轻量模式(Lite),用户可以根据需求选择适合的配置。无论是单机测试还是分布式威胁捕获,T-Pot 都能灵活适应。社区支持与更新
作为开源项目,T-Pot 拥有活跃的社区支持,用户可以获取最新的蜜罐插件和安全更新,确保系统始终能够应对新兴威胁。应用场景
T-Pot 的设计使其适用于多种场景:
威胁情报收集:通过捕获攻击者的行为,T-Pot 可为企业提供实时的威胁情报,帮助识别潜在风险。
安全研究:研究人员可以利用 T-Pot 分析恶意软件、攻击手法和网络流量模式。
教育培训:T-Pot 提供了一个安全的实验环境,适合网络安全课程和攻防演练。
企业防护:部署在网络边界,T-Pot 可以作为早期预警系统,分散攻击者的注意力,保护核心资产。
技术架构
T-Pot 的架构清晰且高效,主要组件包括:
蜜罐层:由多个 Docker 容器运行的蜜罐服务,监听常见端口(如 22、80、443)并记录攻击数据。
数据存储层:Elasticsearch 负责存储所有捕获的日志和事件,确保数据的高效索引和检索。
分析与可视化层:Kibana 和 Elasticvue 将原始数据转化为可视化的图表和报告,便于用户理解。
管理层:通过 Nginx 提供 Web 界面(默认端口 64297),用户可以登录查看仪表盘和管理配置。
安装与使用
T-Pot 的安装非常简单,只需在支持 Docker 的 Linux 系统(如 Ubuntu)上运行安装脚本即可。官方推荐最低配置为 8GB 内存和 128GB 存储空间,以确保所有容器和服务正常运行。安装完成后,用户可以通过浏览器访问 Web 界面,配置蜜罐并查看捕获的数据。
组件作用:
T-Pot共五个组件:Attack Map、Cyberchef、Elasticvue、Kibana 和 Spiderfoot。这些组件在 T-Pot 生态系统中(或与 T-Pot 相关的安全分析环境中)发挥着重要作用,尽管并非所有组件都是 T-Pot 的核心内置组件。以下是这些组件的具体作用和功能
1. Attack Map
- 作用:
Attack Map 是 T-Pot 中的一个可视化工具,负责将捕获的攻击数据映射到地理位置,提供全球攻击来源的动态视图。它通常与 map_data 和 map_web 组件协作,生成交互式的攻击地图。 - 功能:
- 实时显示攻击者的地理分布(如国家或城市)。
- 通过颜色和标记表示攻击频率或严重性。
- 支持时间轴分析,追踪攻击模式的变化。
- 典型应用:
- 帮助安全分析师识别攻击来源的集中区域(如某国的高频攻击)。
- 用于生成威胁情报报告,展示全球威胁态势。
2. Cyberchef
- 作用:
Cyberchef 是一个强大的在线工具(通常通过 Web 界面集成),用于数据分析和解码。它在 T-Pot 环境中常被用作辅助工具,处理捕获的恶意数据。 - 功能:
- 支持多种数据转换操作(如 Base64 解码、XOR 加密、哈希计算)。
- 提供正则表达式匹配和字符串操作,用于解析日志或恶意软件样本。
- 允许用户创建自定义工作流,自动化数据处理。
- 典型应用:
- 分析 Cowrie 或 Dionaea 捕获的恶意文件,解码隐藏的命令或数据。
- 快速验证攻击者上传内容的结构或意图。
3. Elasticvue
- 作用:
Elasticvue 是一个轻量级的 Elasticsearch 管理界面,专为简化数据查询和调试而设计。它是 T-Pot 数据存储层的辅助工具。 - 功能:
- 提供直观的 Web 界面,浏览和搜索 Elasticsearch 索引。
- 支持实时监控索引状态和数据统计。
- 允许用户执行复杂的查询或导出数据。
- 典型应用:
- 排查 Elasticsearch 数据导入问题(如 Logstash 配置错误)。
- 快速验证蜜罐日志是否正确索引。
4. Kibana
- 作用:
Kibana 是 T-Pot 的核心可视化组件,与 Elasticsearch 集成,负责将捕获的数据转化为交互式图表和仪表盘。 - 功能:
- 创建自定义仪表盘,展示攻击事件、流量统计和地理分布。
- 支持时间序列分析和过滤,追踪攻击趋势。
- 提供插件支持,扩展可视化功能(如地图插件)。
- 典型应用:
- 实时监控 T-Pot 捕获的攻击活动。
- 生成详细的安全报告,用于企业合规性或研究目的。
5. Spiderfoot
- 作用:
Spiderfoot 是一个开源的 OSINT(开放源情报)工具,通常作为 T-Pot 的扩展组件,用于自动收集与攻击者相关的外部情报。 - 功能:
- 扫描公开数据源(如 WHOIS、DNS 记录、社交媒体),识别攻击者的基础设施。
- 生成关联图,展示目标网络与已知威胁的联系。
- 支持多种模块,覆盖域名、IP 和电子邮件情报。
- 典型应用:
- 分析捕获的攻击者 IP,追踪其背后的域名或组织。
- 增强威胁情报,识别潜在的 APT 活动。
T-Pot 安装文档(Ubuntu 22.04.1 LTS,VMware,无代理)
目标与环境
-
目标:在 Ubuntu 22.04.1 LTS 上安装 T-Pot(Hive 模式),使用 VMware,无代理配置。
-
系统要求:建议 8GB RAM,128GB 磁盘空间(最低 4GB RAM,50GB 磁盘空间)。
-
网络要求:需直接访问 ghcr.io 和 download.docker.com,无代理。
-
当前日期:2025年3月14日
步骤 1:准备系统和网络环境
确保系统更新并网络连接正常。
- 更新系统
sudo apt update && sudo apt upgrade -y
- 扩展命令:检查是否有可升级的包:
apt list --upgradable
- 扩展命令:检查是否有可升级的包:
- 安装基本工具
sudo apt install curl git net-tools ca-certificates -y sudo update-ca-certificates
- 扩展命令:验证工具版本:
curl --version && git --version && netstat --version
- 扩展命令:验证工具版本:
- 配置 DNS
- 检查并确保系统能够正确解析域名:
添加或替换为以下内容:sudo nano /etc/resolv.conf
保存并退出(Ctrl+O,Enter,Ctrl+X)。nameserver 8.8.8.8 nameserver 8.8.4.4
- 测试 DNS 解析:
若返回 IP 地址,则 DNS 配置正常。sudo systemctl disable --now systemd-resolved
- 扩展命令:验证 DNS 文件内容:
sudo systemctl disable --now systemd-resolved
- 注意:若修改后被覆盖,可禁用 systemd-resolved:
sudo systemctl disable --now systemd-resolved
- 检查并确保系统能够正确解析域名:
- 测试网络连通性
ping -c 4 8.8.8.8 ping -c 4 google.com curl -I https://ghcr.io/v2/ # 测试 T-Pot 镜像仓库 curl -I https://download.docker.com # 测试 Docker Hub
- 扩展命令:检查网络路径:
traceroute google.com
- 扩展命令:检查网络路径:
- 检查系统资源
在安装前,确保系统资源充足:free -h # 检查内存 df -h # 检查磁盘空间 nproc # 检查 CPU 核心数
- 建议:若内存低于 8GB 或磁盘空间不足,考虑增加资源以避免容器启动失败。
步骤 2:安装 Docker
T-Pot 依赖 Docker,确保安装过程无误。
- 添加 Docker GPG 密钥
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
- 扩展命令:验证密钥文件:
ls -l /etc/apt/keyrings/docker.gpg
- 扩展命令:验证密钥文件:
- 配置 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 扩展命令:检查源文件:
cat /etc/apt/sources.list.d/docker.list
- 优化:若下载速度慢,可替换为国内镜像(如阿里云):
修改为:sudo nano /etc/apt/sources.list.d/docker.list
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy stable
- 扩展命令:检查源文件:
- 安装 Docker
sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
- 扩展命令:检查安装版本:
dpkg -l | grep docker
- 扩展命令:检查安装版本:
- 配置 Docker 镜像加速器(可选)
输入以下内容并保存:sudo mkdir -p /etc/docker sudo nano /etc/docker/daemon.json
{ "registry-mirrors": [ "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ] }
- 扩展命令:验证配置文件:
cat /etc/docker/daemon.json
- 扩展命令:验证配置文件:
- 启动并验证 Docker
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl enable docker sudo docker --version sudo docker compose version sudo docker run hello-world
- 扩展命令:检查 Docker 服务状态:
sudo systemctl status docker
- 格式化检查容器状态:验证 hello-world 容器:
sudo docker ps --format "table {{.Names}}\t{{.Status}}"
- 扩展命令:检查 Docker 服务状态:
步骤 3:克隆 T-Pot 仓库
获取 T-Pot 源码,提供两种方式:HTTPS(无需密钥)和 SSH(需配置密钥)。
- 选项 1:使用 HTTPS 克隆(无需 SSH 密钥)
git clone https://github.com/telekom-security/tpotce.git cd tpotce
- 扩展命令:验证仓库版本:
git log -1
- 扩展命令:验证仓库版本:
- 选项 2:使用 SSH 密钥克隆
- 生成 SSH 密钥:
按提示操作,建议不设置密码直接回车。ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 查看公钥并添加到 GitHub:
复制输出内容,登录 GitHub,在 Settings > SSH and GPG keys 中添加新 SSH 密钥。cat ~/.ssh/id_rsa.pub
- 测试 SSH 连接:
若返回 Hi <username>! You've successfully authenticated...,则配置成功。ssh -T git@github.com
- 克隆仓库:
git clone git@github.com:telekom-security/tpotce.git cd tpotce
- 扩展命令:验证仓库版本:
git log -1
- 生成 SSH 密钥:
步骤 4:运行 T-Pot 安装脚本
配置系统参数并运行安装脚本。
- 检查端口冲突
sudo netstat -tuln | grep -E ":80|:443|:22|:23|:9200|:5601"
- 扩展命令:若有冲突,查找并终止进程:
sudo lsof -i :9200 # 示例,替换端口号 sudo kill -9 <PID>
- 扩展命令:若有冲突,查找并终止进程:
- 设置系统参数(为 Elasticsearch)
sudo sysctl -w vm.max_map_count=262144
- 扩展命令:持久化并验证:
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p sysctl vm.max_map_count
- 扩展命令:持久化并验证:
- 执行安装脚本
./install.sh
- 输入 y 确认安装,选择 h(Hive 模式),设置 Web 用户名(如 master)和密码(如 your_password)。
- 扩展命令:若失败,检查脚本日志:
tail -n 50 install.log
- 优化:配置 .env 文件
安装脚本会生成 .env 文件,但需要手动检查和修正,确保变量格式正确且 WEB_USER 为 Base64 编码。- 检查 .env 文件:
示例内容可能如下:cat .env
存在的问题:WEB_USER=your_user WEB_PASS=your_password TPOT_REPO=dtagdevsec TPOT_VERSION=latest TPOT_PULL_POLICY=always BEELZEBUB_LLM_MODEL: "ollama" BEELZEBUB_LLM_HOST: "http://ollama.local:11434/api/chat" BEELZEBUB_OLLAMA_MODEL: "openchat" GALAH_LLM_PROVIDER: "ollama" GALAH_LLM_SERVER_URL: "http://ollama.local:11434" GALAH_LLM_MODEL: "llama3.1"
- 变量格式错误:BEELZEBUB_LLM_MODEL 等变量使用了冒号 : 而不是等号 =,这会导致 tpotinit 容器启动失败。
- WEB_USER 需要 Base64 编码:T-Pot 要求 WEB_USER 是一个 Base64 编码的 htpasswd 值,直接设置 WEB_USER=master 会导致 tpotinit 解析失败。
- WEB_PASS 不需要:T-Pot 不使用 WEB_PASS,应删除。
- 修复步骤:
- 编辑 .env 文件:
修正变量格式,将冒号 : 改为等号 =,并删除 WEB_PASS:sudo nano .env
WEB_USER=<Base64编码值> TPOT_REPO=dtagdevsec TPOT_VERSION=latest TPOT_PULL_POLICY=always BEELZEBUB_LLM_MODEL="ollama" BEELZEBUB_LLM_HOST="http://ollama.local:11434/api/chat" BEELZEBUB_OLLAMA_MODEL="openchat" GALAH_LLM_PROVIDER="ollama" GALAH_LLM_SERVER_URL="http://ollama.local:11434" GALAH_LLM_MODEL="llama3.1"
- 生成 Base64 编码的 WEB_USER:
假设输出为:htpasswd -n -b "master" "your_password" | base64 -w0
将 WEB_USER 修改为:bWFzdGVyOiRhcHIxJGRqZDVmOG4kZW9KeXdZOHJ3ZlR6MGlVVWZzL2tMUWpXRVMxCl9wCg==
保存并退出(Ctrl+O,Enter,Ctrl+X)。WEB_USER=bWFzdGVyOiRhcHIxJGRqZDVmOG4kZW9KeXdZOHJ3ZlR6MGlVVWZzL2tMUWpXRVMxCl9wCg==
- 加载环境变量:
export $(grep -v '^#' .env | xargs)
- 编辑 .env 文件:
- 检查 .env 文件:
- 确保必要目录存在
sudo mkdir -p /data/nginx/conf sudo mkdir -p /data/nginx/cert sudo chmod -R 755 /data/nginx
- 扩展命令:验证目录权限:
ls -ld /data/nginx/conf /data/nginx/cert
- 扩展命令:验证目录权限:
- 重启系统
sudo reboot
步骤 5:验证 T-Pot 安装
检查服务状态并验证访问。
- SSH 登录
ssh <username>@<你的IP> -p 64295
- 示例:ssh leo@192.168.205.133 -p 64295
- 扩展命令:检查 SSH 端口:
sudo netstat -tuln | grep 64295
- 检查服务状态
sudo systemctl status tpot sudo docker ps -a
- 格式化检查所有容器状态:
确保所有容器(如 conpot_ipmi, nginx, elasticsearch, kibana)状态为“Up”或“healthy”。sudo docker ps --format "table {{.Names}}\t{{.Status}}"
- 扩展命令:查看容器详情:
sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
- 格式化检查所有容器状态:
- 验证特定容器状态
- 检查 Elasticsearch:
若状态为 Exited,查看日志:sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep elasticsearch
sudo docker logs elasticsearch
- 检查 Kibana:
sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep kibana
- 检查 Nginx:
sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep nginx
- 检查 Elasticsearch:
- 访问 Web 界面
- 在浏览器输入:https://<你的IP>:64297
- 接受自签名证书警告,使用安装时设置的用户名和密码登录。
- 扩展命令:测试 Web 接口连通性:
curl -k -I https://<你的IP>:64297
- 检查 Kibana 访问
- 获取 Kibana 的 Docker 内部 IP:
sudo docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' kibana
- 测试 Kibana 连通性(替换 <Kibana_IP> 为上一步输出的 IP):
curl -I http://<Kibana_IP>:5601
- 若外部访问失败,检查端口映射:
sudo docker port kibana
- 若端口未映射,手动运行:
sudo docker run -d --name=kibana -p 5601:5601 dtagdevsec/kibana:latest
- 修改 Kibana 监听地址(若需外部访问):
sudo docker exec -it kibana /bin/bash echo 'server.host: "0.0.0.0"' >> /usr/share/kibana/config/kibana.yml exit sudo docker restart kibana
- 验证 Kibana 重启后状态:
sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep kibana
- 获取 Kibana 的 Docker 内部 IP:
故障排查与维护
- 查看容器日志
sudo docker logs <容器名>
- 示例:sudo docker logs elasticsearch
- tpotinit 启动失败
- 若 tpotinit 状态为 Exited 或 unhealthy,查看日志:
若报错 WEB_USER is not set or empty,检查 .env 文件是否正确配置 Base64 编码的 WEB_USER。sudo docker logs tpotinit
- 若 tpotinit 状态为 Exited 或 unhealthy,查看日志:
- Elasticsearch 启动失败
- 检查端口冲突:
若被占用,杀掉进程:sudo netstat -tulnp | grep 9200
sudo kill -9 <进程ID>
- 确保数据目录权限:
sudo chown -R 1000:1000 /data/elasticsearch sudo chmod -R 755 /data/elasticsearch
- 重启:
sudo docker compose -f docker-compose.yml up -d elasticsearch
- 检查端口冲突:
- 重启服务
cd ~/tpotce sudo docker compose -f docker-compose.yml down sudo docker compose -f docker-compose.yml up -d
- 检查重启后容器状态:
sudo docker ps --format "table {{.Names}}\t{{.Status}}"
- 检查重启后容器状态:
- 停止所有容器
sudo docker stop $(sudo docker ps -q)
- 检查停止后状态:
sudo docker ps --format "table {{.Names}}\t{{.Status}}"
- 检查停止后状态:
- 更新镜像
cd ~/tpotce sudo docker compose pull sudo docker compose up -d
- 检查更新后容器状态:
sudo docker ps --format "table {{.Names}}\t{{.Status}}"
- 检查更新后容器状态:
- 监控资源
watch -n 5 "docker stats --no-stream"
注意事项
- 系统要求:低于推荐配置可能导致容器崩溃,建议预留足够资源。
- 网络环境:若无法访问 ghcr.io,检查网络设置或联系管理员。
- 安装时间:根据网络速度,可能需要 15 分钟到 1 小时。
- 端口冲突:安装前确保常用端口(如 80、443、22、23、9200、5601)未被占用。
- Kibana 访问:蜜罐容器使用 Docker 内部 IP,需通过外部 IP 或端口映射访问。
验证你的环境
- 系统信息:
Distributor ID: Ubuntu Description: Ubuntu 22.04.1 LTS Release: 22.04 Codename: jammy
- 本文档适用于上述环境,无需桥接模式。
扩展命令表格
以下是所有扩展命令及其功能,方便调试时快速参考:
命令 | 功能 |
---|---|
apt list --upgradable | 检查系统是否有可升级的软件包 |
curl --version && git --version && netstat --version | 验证基本工具的安装版本 |
cat /etc/resolv.conf | 显示当前 DNS 配置文件内容 |
sudo systemctl disable --now systemd-resolved | 禁用 systemd-resolved,避免 DNS 配置被覆盖 |
traceroute google.com | 检查网络路径,诊断连通性问题 |
ls -l /etc/apt/keyrings/docker.gpg | 验证 Docker GPG 密钥文件是否存在及权限 |
cat /etc/apt/sources.list.d/docker.list | 显示 Docker 软件源配置文件内容 |
`dpkg -l | grep docker` |
cat /etc/docker/daemon.json | 验证 Docker 镜像加速器配置文件内容 |
sudo systemctl status docker | 检查 Docker 服务运行状态 |
sudo docker ps --format "table {{.Names}}\t{{.Status}}" | 格式化显示所有容器名称和状态 |
git log -1 | 显示 T-Pot 仓库最新提交信息 |
ssh -T git@github.com | 测试 SSH 密钥与 GitHub 的连接 |
sudo lsof -i :9200 | 查找占用指定端口(如 9200)的进程 |
sudo kill -9 <PID> | 强制终止指定进程 |
sudo sysctl -p | 应用系统参数配置文件(如 vm.max_map_count) |
sysctl vm.max_map_count | 检查当前 vm.max_map_count 值 |
tail -n 50 install.log | 查看安装脚本最后 50 行日志,排查错误 |
sudo nano .env | 编辑 T-Pot 的环境配置文件 |
ls -ld /data/nginx/conf /data/nginx/cert | 验证 Nginx 目录权限 |
`sudo netstat -tuln | grep 64295` |
sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | 格式化显示容器名称、状态和端口映射 |
`sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep elasticsearch` |
`sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep kibana` |
`sudo docker ps --format "table {{.Names}}\t{{.Status}}" | grep nginx` |
curl -k -I https://<你的IP>:64297 | 测试 Web 界面连通性(忽略证书警告) |
sudo docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' kibana | 获取 Kibana 的 Docker 内部 IP |
curl -I http://<Kibana_IP>:5601 | 测试 Kibana 内部 IP 的连通性 |
sudo docker port kibana | 检查 Kibana 的端口映射 |
sudo docker logs <容器名> | 查看指定容器日志 |
sudo docker system prune -af | 强制清理所有未使用的 Docker 对象 |