記事一覧に戻る

Android SSH Term × Warpgate:スマホから本番サーバーを安全に触る

(更新: 2026年3月21日)

この記事は「モバイル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つです。

  1. Tailscale でインターネットに直接ポートを公開しない
  2. Warpgate で認証・アクセス制御・監査を一元管理
  3. SSH Term からは標準的なSSH接続として操作できる

Warpgateとは

Warpgateは、Rust製のオープンソースアクセス管理ツールです。以下のプロトコルに対応しています。

プロトコル用途
SSHサーバー管理・開発
HTTPSWebアプリへのリバースプロキシ
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

セットアップウィザードでは以下を設定します。

  1. 管理者ユーザー名とパスワードを入力
  2. SSHポート:デフォルトの 2222 でOK
  3. Web管理UIポート:デフォルトの 8888 でOK
  4. データベース:組み込みSQLiteを選択(小規模ならこれで十分)

セットアップが完了したら、コンテナを起動します。

docker compose up -d

Web UIでターゲットを追加

ブラウザで https://<サーバーIP>:8888 にアクセスし、管理画面にログインします。

  1. 「Targets」メニューからターゲット(接続先サーバー)を追加
  2. ターゲット名(例: production-web)、ホストポートを入力
  3. 認証情報(パスワードまたは秘密鍵)を設定

ユーザーの作成と2FAの有効化

  1. 「Users」メニューからユーザーを作成
  2. 認証方式で「Password + TOTP」を選択
  3. 「Roles」でロールを作成し、ユーザーとターゲットを紐付け

これにより、特定のユーザーが特定のサーバーにしかアクセスできないというRBACが実現します。


SSH Termからの接続方法

Warpgateの接続形式は非常にシンプルです。

ssh ユーザー名:ターゲット名@warpgateホスト -p 2222

SSH Termでの設定手順

  1. SSH Termを開き、新しい接続を作成
  2. 以下のように入力
項目
ホストWarpgateサーバーのIPまたはドメイン
ポート2222
ユーザー名myuser:production-web
認証パスワード
  1. 接続を開始すると、まずWarpgateのパスワード認証が行われる
  2. 続けてTOTPコードの入力を求められる

ユーザー名:ターゲット名 という形式がWarpgateの特徴です。コロン区切りで「どのユーザーが」「どのサーバーに」接続するかを指定します。

公開鍵認証を使う場合

SSH Termで生成した公開鍵をWarpgateのWeb UIに登録すれば、パスワード入力を省略できます。

# SSH Termの公開鍵をコピーし、WarpgateのWeb UIで
# Users → 該当ユーザー → SSH Keys に貼り付け

公開鍵認証 + TOTP 2FAの組み合わせなら、パスワード漏洩リスクをゼロにしつつ二要素認証を維持できます。


TOTP 2FAをモバイルで使う

WarpgateのTOTP設定は、一般的な認証アプリで利用できます。

セットアップ手順

  1. WarpgateのWeb UIにログイン
  2. 自分のプロフィール画面で「Enable TOTP」をクリック
  3. 表示されたQRコードを認証アプリでスキャン
  4. 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 の形式で接続できます。

「スマホで本番を触るなんて怖い」という時代は終わりです。適切なツールを組み合わせれば、モバイルからでも安全にサーバー管理ができます。ぜひ試してみてください。


関連記事