
ゼロトラストSSH踏み台プロキシ。Vaultをバックエンドとした鍵管理、RBACポリシー適用、完全なセッション録画、および本番インフラへの監査可能なアクセスを実現する管理用TUIを備えています。
ZTTPは、Golangで構築された堅牢なセルフホスト型ゼロトラストSSH踏み台プロキシです。 HashiCorp Vaultを基盤とした鍵管理、RBACポリシーの適用、完全なセッション記録、そしてインタラクティブな管理TUIを備えており、本番インフラへの監査可能なゼロトラストアクセスを必要とするチーム向けに設計されています。
現代のエンジニアリングチームには、開発者が業務を遂行するために必要最小限のアクセス権を与える手段が必要です — それ以上でもそれ以下でもありません。従来のSSH鍵配布はエラーが起きやすく、鍵が共有されたり、ノートPC上で忘れ去られたり、失効が数日遅れたりします。
ZTTP SSHプロキシは、インフラへの単一のゼロトラストの扉として機能することで、この問題を解決します:
| 課題 | ZTTPの解決策 |
|---|---|
| ノートPC上でSSH鍵が共有される | 鍵はHashiCorp Vault内にのみ存在 — ディスク上には決して置かれない |
| 誰が何を行ったかが見えない | すべてのキーストロークが.ttyrec形式で記録される |
| 本番環境への無差別なアクセス | ロールベースのポリシーエンジンが環境ごとのルールを適用する |
| アクティブなセッションを停止する手段がない | キルスイッチの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 で公開または LAN からアクセス可能な 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
これにより、すべてのプラットフォーム向けのクライアントがクロスコンパイルされ、dist/install.sh と dist/install.ps1 が正しいサーバー URL で自動更新されます。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 ごとの 1 分あたりの最大ログイン試行回数 |
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 ロールを持つアカウントでログインしてください。
管理コンソールでは以下を提供します:
| メニューオプション | 説明 |
|---|---|
| Add User | ロール割り当て付きで新規ユーザーを作成 |
| Add Server | ターゲットサーバーを登録(ホスト名、IP、環境、SSH ユーザー) |
| Manage Server Access | 特定サーバーへのユーザーアクセスを付与または取り消し |
| View Users | すべてのユーザーとそのロールを一覧表示 |
| View Servers | 登録済みのすべてのサーバーを一覧表示 |
| View Audit Logs | セッションの閲覧、録画の再生、テキストログの読み取り |
| [ Back ] | サーバーゲートウェイに戻る |
すべての管理操作は監査ボリューム内の
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 | 手動での DB シード用に bcrypt ハッシュを生成 |
make clean | コンパイル済みバイナリとビルドキャッシュを削除 |