ZTTP 是一个用 Golang 构建的加固型、自托管的零信任 SSH 堡垒代理,具备 HashiCorp Vault 支持的密钥管理、RBAC 策略执行、完整的会话录制以及交互式管理 TUI——专为需要对生产基础设施进行可审计、零信任访问的团队而设计。
现代工程团队需要一种方式,让开发者获得完成工作所需的最小访问权限——不多不少。传统的 SSH 密钥分发容易出错:密钥被共享、遗忘在笔记本电脑上,并且撤销往往迟了好几天。
ZTTP SSH 代理通过充当进入你基础设施的唯一零信任入口来解决这一问题:
| 问题 | ZTTP 解决方案 |
|---|---|
| SSH 密钥在笔记本电脑上共享 | 密钥仅存于 HashiCorp Vault——绝不落盘 |
| 无法了解谁做了什么 | 每一次击键都以 .ttyrec 格式录制 |
| 生产环境访问权限一刀切 | 基于角色的策略引擎按环境执行规则 |
| 无法终止活跃会话 | Kill-switch gRPC 端点可终止任何实时会话 |
| 审计人员面对不透明的访问记录 | 管理 TUI 提供会话回放、文本日志和管理员操作日志 |
Developer Laptop
│
│ zttp
│ (Under the hood: SSH over port 2224)
▼
┌─────────────────────────────────────────────────────────┐
│ ZTTP Proxy │
│ │
│ ① Auth Gate — bcrypt/Argon2id login TUI │
│ ② RBAC Engine — environment-aware policy check │
│ ③ Vault Fetch — ephemeral SSH key retrieval │
│ ④ Bridge — transparent TCP tunnel │
│ ⑤ Audit Writer — ttyrec frame recorder │
└──────────┬──────────────────────────────────────────────┘
│ ssh (private IP, ephemeral key)
▼
Target Server
基础设施服务(Docker Compose):
| 服务 | 用途 |
|---|---|
zttp-proxy | 核心 ZTTP SSH 堡垒代理(Golang 二进制文件) |
zttp-postgres | 控制平面数据库(用户、服务器、RBAC 策略) |
zttp-vault | HashiCorp Vault — 存储 SSH 私钥 |
zttp-nginx | 在 /release/ 提供 CLI 安装程序 |
zttp-init-audit | 修复卷权限的一次性容器 |
.ttyrec 格式录制,并带有时间戳帧服务器(代理主机):
2224 上具有公网或局域网可访问的 IPmake(可选,但推荐)开发者(客户端):
ssh 命令)git clone https://gitlab.com/Nihal799/zttp.git
cd zttp
cp .env.example .env
编辑 .env 并至少设置:
PROXY_NODE_IP=<your-server-public-ip>
POSTGRES_PASSWORD=<a-strong-password>
VAULT_TOKEN=<a-strong-vault-token>
⚠️ 切勿提交你的
.env文件。 它已被列入.gitignore。
make docker-up
# or directly:
docker compose -f deploy/docker-compose.yml up -d --build
make docker-ps
curl http://localhost:8080/healthz
make release PROXY_ADDR=<your-server-ip>:2224
这会为所有平台交叉编译客户端,并使用正确的服务器 URL 自动更新 dist/install.sh 和 dist/install.ps1。Nginx 容器会在 http://<your-server-ip>:8555/ 提供这些文件。
curl -fsSL http://<proxy-ip>:8555/install.sh | bash
irm http://<proxy-ip>:8555/install.ps1 | iex
安装完成后,连接到 ZTTP 网关:
zttp
# or directly:
ssh -p 2224 <your-username>@<proxy-ip>
你将看到一个终端登录界面。通过身份验证后,你将看到一份你被授权访问的服务器列表。
所有配置均通过环境变量(或 .env 文件)完成。完整参考请参见 .env.example。
| 变量 | 默认值 | 描述 |
|---|---|---|
PROXY_LISTEN_ADDR | 0.0.0.0:2222 | SSH 代理绑定地址 |
HTTP_LISTEN_ADDR | 0.0.0.0:8080 | 健康检查 HTTP 地址 |
GRPC_LISTEN_ADDR | 0.0.0.0:9090 | 终止开关 gRPC 地址 |
PROXY_NODE_IP | 127.0.0.1 | 嵌入 CLI 二进制文件的外部 IP |
DATABASE_URL | postgres://zttp:... | PostgreSQL 连接字符串 |
VAULT_ADDR | http://localhost:8201 | Vault 服务器 URL |
VAULT_TOKEN | dev-root-token-zttp | Vault 根令牌(仅限开发环境——生产环境请使用 AppRole) |
MAX_FAILED_ATTEMPTS | 5 | 锁定阈值 |
LOCKOUT_DURATION | 15m | 账户锁定持续时间 |
RATE_LIMIT_PER_MIN | 10 | 每个 IP 每分钟最大登录尝试次数 |
AUDIT_LOG_DIR | /var/log/zttp/audit | 会话录制目录路径 |
SOC_WEBHOOK_URL | (空) | 用于 SOC 告警的可选 webhook |
ZTTP 使用基于角色的模型。每个用户被分配一个角色;每个角色都有一个策略,定义其可以访问哪些服务器环境。
| 角色 | 访问权限 |
|---|---|
security-admin | 完全访问所有环境 + 管理控制台 |
sre-tier1 | 所有环境,包括生产环境 |
sre-tier2 | 仅限预发布和开发环境 |
dev | 仅限开发环境 |
readonly | 开发环境,受限命令集 |
角色和服务器分配通过管理控制台(见下文)进行管理。RBAC 引擎在单个 PostgreSQL 查询中执行所有检查——它绝不会向客户端暴露访问被拒绝的原因(枚举保护)。
从网关菜单连接到 zttp-admin 服务器,或使用具有 security-admin 角色的账户登录。
管理控制台提供以下功能:
| 菜单选项 | 描述 |
|---|---|
| 添加用户 | 创建新用户并分配角色 |
| 添加服务器 | 注册目标服务器(主机名、IP、环境、SSH 用户) |
| 管理服务器访问 | 授予或撤销用户对特定服务器的访问权限 |
| 查看用户 | 列出所有用户及其角色 |
| 查看服务器 | 列出所有已注册的服务器 |
| 查看审计日志 | 浏览会话、回放录制、阅读文本日志 |
| [ 返回 ] | 返回服务器网关 |
所有管理操作都会记录到审计卷内的
admin-actions.log中。
所有会话都存储在 zttp-audit-logs Docker 卷中(容器内路径为 /var/log/zttp/audit/)。
security-admin 身份登录Ctrl+C 返回# List recordings
sudo ls /var/lib/docker/volumes/zttp-audit-logs/_data/
# Play a recording with ttyplay
sudo ttyplay /var/lib/docker/volumes/zttp-audit-logs/_data/<session-id>.ttyrec
# Read admin actions log
sudo cat /var/lib/docker/volumes/zttp-audit-logs/_data/admin-actions.log
要求: Go 1.25+、Docker(用于交叉编译)
# Build proxy + CLI for current platform
make build
# Cross-compile CLI for all platforms (Linux, macOS, Windows)
make release PROXY_ADDR=<proxy-ip>:2224
# Run tests
make test
# Run proxy locally (requires Postgres + Vault already running)
make run-proxy
| 命令 | 描述 |
|---|---|
make build | 为当前平台构建代理和 CLI |
make release | 为所有平台交叉编译 CLI 二进制文件 |
make release-docker | 在 Docker 容器内交叉编译(避免 snap/WSL 问题) |
make docker-up | 启动所有 Docker Compose 服务 |
make docker-down | 停止所有服务并删除卷 |
make docker-logs | 跟踪代理日志 |
make docker-ps | 显示容器状态 |
make test | 运行所有 Go 测试 |
make migrate | 应用数据库迁移 |
make seed | 填充开发数据 |
make hashpw PW=mypassword | 为手动数据库填充生成 bcrypt 哈希 |
make clean | 删除编译的二进制文件和构建缓存 |