Cloudflare Zero Trustで安全にどこからでもアクセスできるサーバーを構築する
はじめに
最近、新しいPCを購入したのを機に、これまで使っていた古いPCのOSをLinuxに入れ替え、Webサーバー、計算サーバー、ストレージサーバーとして利用し始めました。
最初は自宅のローカルネットワークで動かすだけでしたが、出張先や外出時に外からでも操作したいと思うようになりました。
しかし、サーバーを外部に公開するとなると、ポート開放、固定IPアドレスの取得、証明書の発行…といった面倒な作業が多いです。(Minecraftサーバーを公開しようとして、ルーターの設定に苦戦した記憶があります。)
何か良い方法はないかと調査したところ、Cloudflare Zero Trustという便利なサービスがあることを知りました。
概要
本記事では、Cloudflare Zero Trustを活用して、安全にどこからでもアクセスできるSSHサーバーを構築した記録を備忘録として残します。
Cloudflare Zero Trustとは
このサービスは、Cloudflare社によって提供されている従来のVPNに代わる安全なリモートアクセスの仕組みを提供するセキュリティプラットフォームです。
ローカルネットワークは安全という前提を捨て、自身のPC以外のすべてのアクセスを検証・制御するという「ゼロトラストモデル(Zero Trust Model)」に基づいています。
参考: Cloudflare Zero Trust Overview
ゼロトラストとは?
ゼロトラストとは、「何も信用しない」を前提としたセキュリティの考え方です。ローカルネットワーク、グローバルネットワークの境界を問わず、すべてのユーザーやデバイスからのアクセスを常に検証し、必要最低限の権限のみを付与することで、サイバー攻撃や不正アクセスから情報を守ります。
従来の境界防御モデル(ローカルネットワーク、グローバルネットワークの境界にファイアウォールを配置し防ぐ方式)が、クラウドやテレワークの普及で曖昧になったネットワーク環境には対応しきれなくなったことを背景に提唱されました。
ゼロトラストの考え方
- 「何も信用しない」: ネットワークの内部であろうと外部であろうと、すべてのアクセスを信用しません。
- 「常に検証する」: ネットワークからのアクセスは、ユーザー、デバイス、場所などを都度、厳格に検証します。
- 「最小権限の付与」: 検証の結果、認められたユーザーやデバイスには、必要最低限のアクセス権限を付与します。
参考: ゼロトラストアーキテクチャ適用方針 デジタル庁
https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/e2a06143-ed29-4f1d-9c31-0f06fca67afc/5efa5c3b/20220630_resources_standard_guidelines_guidelines_04.pdf
今回はCloudflare Zero Trustで提供されているサービスの内、Tunnel(ネットワークトンネリング)とAccess(認証)を活用して、以下の図のような構成を目指します。
サーバー側の作業
1. ドメインの取得と登録
ドメインを持っている場合はCloudflareにドメインを登録し、持っていない場合はCloudflareでドメインを購入します。
今回はドメインを持っていない前提で、ドメインを購入する手順を説明します。
1.1. ドメイン登録ページへの移動
Cloudflareホームページにて、[ドメインの登録] > [ドメインの登録] へ移動します。
1.2. ドメインの検索と購入
適切なドメイン名を検索し購入に進みます。この時のドメイン名が、URLに使用するアドレスと同じになります。

1.3. 購入の完了
登録者情報、お支払い情報を登録し購入します。
[ドメインの登録] > [ドメインの管理] にて購入したドメインがアクティブになっていれば完了です。

2. サーバーの設定
自宅のサーバーをCloudflareに登録します。
2.1. Tunnel作成ページへの移動
Zero Trustホームページで、[ネットワーク] > [Tunnels] に移動します。
2.2. Tunnelの作成
[+トンネルを作成する] > [Cloudflared] を選択します。
2.3. Tunnel名の設定
トンネルに適切な名前を付けます。今回は「sample」とします。

2.4. cloudflaredのインストール
サーバーのOSに合わせてcloudflaredを適切にインストールします。

OSを選択すると、適切なインストールコマンドが表示されるため、指示に従いインストールします。
インストールが完了すると、[ネットワーク] > [Tunnels] にて、作成したトンネルが表示されます。

ステータスが「HEALTHY」となっていれば成功です。
2.5. 公開ホスト名の設定
[ネットワーク] > [Tunnels] から作成したトンネルの右側のKebab menu(ケバブメニュー)より [設定] を選択します。
[公開されたアプリケーションルート] > [+公開ホスト名を追加する] より設定を行います。
| 項目 | 設定値 |
|---|---|
| サブドメイン | 任意 |
| ドメイン | 1.で取得したドメインを選択 |
| タイプ | SSH |
| URL | localhost:22 |

3. Cloudflare Accessポリシーの作成
3.1. ポリシー作成ページへの移動
Zero Trustホームページで、[Access] > [ポリシー] に移動します。
3.2. ポリシーの作成
ポリシー名、ルールを作成します。
以下の画像は、ポリシー名: sample、アクセス条件を「日本からのアクセス」かつ、「メールアドレスが sample@example.com のユーザー」のみがアクセスできる、というルールになっています。

補足 Cloudflare Access policiesについて
ほかにも複数の認証方式が登録できるため、公式ドキュメントを参考に適切に作成してください。 Google認証を追加しておくとGoogleアカウントでのログインで認証可能になるので便利です。
4. アプリケーションの登録
4.1. アプリケーション登録ページへの移動
Zero Trustホームページで、[Access] > [アプリケーション] に移動します。
4.2. アプリケーションの設定
[+アプリケーションを追加する] > [セルフホスト] に移動しアプリケーション設定を進めます。

| 項目 | 設定値 |
|---|---|
| アプリケーション名 | 任意 |
| パブリックホスト名 | 2.5.節で設定した値 |
| Accessポリシー | 3.節で作成したポリシーを選択 |
設定後、次へを選択し保存する。
クライアント側の設定
1. cloudflaredのインストール
OSによってインストール方法が異なります。
今回はクライアントがWindows PCの場合を例にします。
winget install --id Cloudflare.cloudflared
他のOSについては、以下のページを参考にしてください。
2. SSH configファイルの設定
~/.ssh/config に以下を記述します。
Windowsの場合: C:\Users\<ユーザー名>\.ssh\config
Host <登録名>
HostName <サブドメイン>.<ドメイン>
# HostName test.<1で入手したドメイン>
ProxyCommand cloudflared.exe access ssh --hostname %h
User <サーバー側のユーザー名>
3. SSH接続
sshコマンドで接続します。
ssh <登録名>
初回にブラウザが立ち上がり、認証を求められます。
認証が完了すると以下の画面が表示されます。

[Approve] をクリックすると以下の画面が表示され、

SSH接続が確立されます。
まとめ
Cloudflare Zero Trustを活用して、安全にどこからでもアクセスできるSSHサーバーを構築する方法を説明しました。
これを使えばネットワーク経由で自宅のPCなどにも安全にアクセスできます。
20分ほどで簡単に設定できるので、リモートアクセスできる環境を作りたいけどやり方がわからない、設定が面倒そうだと思っている方は是非試してみてください。
また、ゲームのサーバーやWebアプリなども気軽に公開できるので、これからどんどん使っていこうと思います。
Discussion