Android SSH Term × Warpgate:スマホから本番サーバーを安全に触る
この記事は「モバイルSSH完全ガイド」のクラスター記事です。モバイルSSHの全体像はガイドをご覧ください。
はじめに
「出先からスマホで本番サーバーを触りたい。でも、セキュリティが心配……」
この悩みを抱えるエンジニアは多いはずです。SSHの公開鍵認証だけでは、誰がいつ何をしたかを後から追跡するのが難しく、チーム運用では不安が残ります。
そこで登場するのが Warpgate です。Warpgateはオープンソースのセルフホスト型アクセス管理ツールで、SSH接続に2FA・セッション録画・監査ログを追加できます。しかも専用クライアントが不要で、標準のSSHクライアントからそのまま接続できるのが最大の魅力です。
本記事では、Docker ComposeによるWarpgateの構築から、Android SSH Termでスマホから安全に本番サーバーへ接続するまでの手順を解説します。
全体構成図
まず、今回構築するシステムの全体像を把握しましょう。
graph LR
A["📱 Android<br/>SSH Term"] -->|SSH接続| B["🌐 Tailscale<br/>VPN Mesh"]
B -->|暗号化トンネル| C["🔐 Warpgate<br/>Docker Container"]
C -->|認証・録画・監査| D["🖥️ 本番サーバーA"]
C -->|認証・録画・監査| E["🖥️ 本番サーバーB"]
C -->|認証・録画・監査| F["🗄️ DBサーバー"]
ポイントは3つです。
- Tailscale でインターネットに直接ポートを公開しない
- Warpgate で認証・アクセス制御・監査を一元管理
- SSH Term からは標準的なSSH接続として操作できる
Warpgateとは
Warpgateは、Rust製のオープンソースアクセス管理ツールです。以下のプロトコルに対応しています。
| プロトコル | 用途 |
|---|---|
| SSH | サーバー管理・開発 |
| HTTPS | Webアプリへのリバースプロキシ |
| MySQL | データベース接続 |
| PostgreSQL | データベース接続 |
Warpgateの主な特徴
- 専用クライアント不要:標準のSSHクライアントでそのまま接続できる
- TOTP 2FAとOIDC SSO対応:二要素認証やシングルサインオンでセキュリティを強化
- セッション録画:SSHセッションをすべて記録し、後から再生できる
- コマンドレベル監査ログ:誰がいつどのコマンドを実行したかを追跡
- RBAC(ロールベースアクセス制御):ユーザーごとに接続先を制限
- Docker/単一バイナリ:導入が簡単
Docker ComposeによるWarpgate構築
前提条件
- Docker / Docker Compose がインストール済み
- ドメインまたは固定IPがある(Tailscale利用の場合は不要)
ディレクトリ構成
warpgate/
├── docker-compose.yml
└── data/ # Warpgateの設定・DB・録画データ
docker-compose.yml
version: "3.8"
services:
warpgate:
image: ghcr.io/warp-tech/warpgate:latest
container_name: warpgate
restart: unless-stopped
ports:
- "2222:2222" # SSH
- "8888:8888" # 管理用Web UI
volumes:
- ./data:/data
environment:
- TZ=Asia/Tokyo
初回セットアップ
# ディレクトリ作成
mkdir -p warpgate/data
cd warpgate
# 初回セットアップ(対話形式)
docker compose run --rm warpgate setup
セットアップウィザードでは以下を設定します。
- 管理者ユーザー名とパスワードを入力
- SSHポート:デフォルトの
2222でOK - Web管理UIポート:デフォルトの
8888でOK - データベース:組み込みSQLiteを選択(小規模ならこれで十分)
セットアップが完了したら、コンテナを起動します。
docker compose up -d
Web UIでターゲットを追加
ブラウザで https://<サーバーIP>:8888 にアクセスし、管理画面にログインします。
- 「Targets」メニューからターゲット(接続先サーバー)を追加
- ターゲット名(例:
production-web)、ホスト、ポートを入力 - 認証情報(パスワードまたは秘密鍵)を設定
ユーザーの作成と2FAの有効化
- 「Users」メニューからユーザーを作成
- 認証方式で「Password + TOTP」を選択
- 「Roles」でロールを作成し、ユーザーとターゲットを紐付け
これにより、特定のユーザーが特定のサーバーにしかアクセスできないというRBACが実現します。
SSH Termからの接続方法
Warpgateの接続形式は非常にシンプルです。
ssh ユーザー名:ターゲット名@warpgateホスト -p 2222
SSH Termでの設定手順
- SSH Termを開き、新しい接続を作成
- 以下のように入力
| 項目 | 値 |
|---|---|
| ホスト | WarpgateサーバーのIPまたはドメイン |
| ポート | 2222 |
| ユーザー名 | myuser:production-web |
| 認証 | パスワード |
- 接続を開始すると、まずWarpgateのパスワード認証が行われる
- 続けてTOTPコードの入力を求められる
ユーザー名:ターゲット名 という形式がWarpgateの特徴です。コロン区切りで「どのユーザーが」「どのサーバーに」接続するかを指定します。
公開鍵認証を使う場合
SSH Termで生成した公開鍵をWarpgateのWeb UIに登録すれば、パスワード入力を省略できます。
# SSH Termの公開鍵をコピーし、WarpgateのWeb UIで
# Users → 該当ユーザー → SSH Keys に貼り付け
公開鍵認証 + TOTP 2FAの組み合わせなら、パスワード漏洩リスクをゼロにしつつ二要素認証を維持できます。
TOTP 2FAをモバイルで使う
WarpgateのTOTP設定は、一般的な認証アプリで利用できます。
セットアップ手順
- WarpgateのWeb UIにログイン
- 自分のプロフィール画面で「Enable TOTP」をクリック
- 表示されたQRコードを認証アプリでスキャン
- 6桁のコードを入力して確認
おすすめの認証アプリ
| アプリ | 特徴 |
|---|---|
| Google Authenticator | シンプルで定番 |
| Microsoft Authenticator | バックアップ機能あり |
| Aegis | オープンソース、暗号化バックアップ |
モバイルSSHでの2FAフロー
SSH Termで接続すると、パスワード認証の後にターミナル上でTOTPコードの入力を求められます。
$ ssh myuser:production-web@warpgate -p 2222
Password: ********
Two-factor authentication code: 123456
Welcome to Warpgate
Connected to production-web
認証アプリとSSH Termをスプリットスクリーンで並べると、コードの入力がスムーズです。Android 12以降なら画面分割が標準で使えます。
セッション録画と監査ログ
Warpgateの最も強力な機能のひとつがセッション録画です。
何が記録されるか
- 接続元IPと接続時刻
- 認証方法と認証結果
- 実行されたコマンド(コマンドレベル監査ログ)
- ターミナル出力の録画(asciicast形式で再生可能)
Web UIでの確認方法
管理画面の「Sessions」タブを開くと、過去のセッション一覧が表示されます。各セッションをクリックすると、ターミナル操作の録画を再生できます。
チーム運用での安心感
セッション録画があると、以下のようなシーンで役立ちます。
- 障害発生時:誰がどのコマンドを実行したか即座に特定できる
- 引き継ぎ時:前任者の作業手順を録画で確認できる
- セキュリティ監査:外部監査に対するエビデンスとして提出できる
「誰がいつ何をしたか」が完全に残る。これだけで、スマホから本番サーバーを触ることへの心理的ハードルが大きく下がります。
Tailscaleとの併用構成
Warpgateを直接インターネットに公開するのは、セキュリティ上のリスクがあります。Tailscaleと組み合わせることで、ポートを一切公開せずに安全な接続を実現できます。
構成のポイント
graph TB
subgraph Internet["インターネット"]
A["📱 Android<br/>SSH Term + Tailscale"]
end
subgraph Tailnet["Tailscale Network<br/>100.x.x.x"]
B["🔐 Warpgate<br/>100.64.0.10:2222"]
C["🖥️ サーバーA<br/>192.168.1.10"]
D["🖥️ サーバーB<br/>192.168.1.11"]
end
A -->|WireGuard暗号化| B
B -->|プライベートネットワーク| C
B -->|プライベートネットワーク| D
セットアップ手順
1. WarpgateサーバーにTailscaleをインストール
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
2. docker-compose.ymlを修正
Tailscaleの内部IPだけでリッスンするように変更します。
services:
warpgate:
image: ghcr.io/warp-tech/warpgate:latest
container_name: warpgate
restart: unless-stopped
ports:
- "100.64.0.10:2222:2222" # Tailscale IPのみ
- "100.64.0.10:8888:8888" # Tailscale IPのみ
volumes:
- ./data:/data
environment:
- TZ=Asia/Tokyo
3. AndroidにTailscaleをインストール
Google PlayからTailscaleアプリをインストールし、同じアカウントでログインします。
4. SSH Termの接続先をTailscale IPに変更
| 項目 | 値 |
|---|---|
| ホスト | 100.64.0.10(TailscaleのIP) |
| ポート | 2222 |
| ユーザー名 | myuser:production-web |
この構成のメリットは以下の通りです。
- ポート公開ゼロ:ファイアウォールでSSHポートを開ける必要がない
- WireGuardベースの暗号化:通信経路が二重に暗号化される
- Tailscale ACL:Tailscale側でもアクセス制御を追加できる
- NAT越え不要:自宅サーバーでもVPS不要で接続可能
運用のベストプラクティス
セキュリティ面
- パスワード認証は無効化し、公開鍵 + TOTP の組み合わせを推奨
- WarpgateのWeb UIにもTOTPを設定する
- ロールを細かく分ける:本番/ステージング/開発で別ロールを作成
- Tailscale ACLでWarpgateへの接続元を自分のデバイスに限定
監査面
- セッション録画の保存期間を設定する(ディスク容量に注意)
- 定期的にWeb UIで異常なセッションがないか確認
- Webhook連携でSlackにセッション開始通知を飛ばすと便利
まとめ
Warpgate + Tailscale + SSH Termの組み合わせにより、スマホから本番サーバーを触る際のセキュリティと利便性を両立できます。
| 課題 | 解決策 |
|---|---|
| 認証が弱い | Warpgateの公開鍵 + TOTP 2FA |
| 誰が何をしたかわからない | セッション録画 + コマンド監査ログ |
| ポートを公開したくない | Tailscaleでゼロポート公開 |
| 接続先を制限したい | WarpgateのRBAC |
| 専用アプリが必要 | 標準SSHクライアントで接続可能 |
特にWarpgateは専用クライアントが不要という点が大きな強みです。SSH Termに限らず、どんなSSHクライアントからでも user:target@host の形式で接続できます。
「スマホで本番を触るなんて怖い」という時代は終わりです。適切なツールを組み合わせれば、モバイルからでも安全にサーバー管理ができます。ぜひ試してみてください。