Cloudflare Zero Trustで自宅PCにアクセスする
イントロダクション
最近自宅のネットワークが極端に遅かったため、IPv4 PPPoEからIPv6 IPoEに構成変更しました。
IPv4時代は固定グローバルIPを購入して外出先から自宅にVPNを張れるようにしていましたが、IPv6では残念ながらL2TP/IPSecが使えない。
(参考:https://zenn.dev/apple_nktn/articles/80acf34cf0634b)
そもそもVPNで拠点接続するという構成自体が最近のトレンドではないよね、ということもありZTNA(Zero Trust Network Access)サービスであるCloudflare Zero Trustを試してみることにしました。
ゼロトラストネットワークとは(個人的な理解)
ネットワーク上のあらゆるアクセスを信頼せず全て検査するという概念。
従来のDMZを用いた境界型防御は境界の内側は「暗黙的に信頼」されている状態と言えます。
詳細はNIST SP800-207
また、境界型防御はアプリケーション等の「守るべきもの」が境界の中にあることが前提として構築・運用されます。
しかし、クラウドシフトによるSaaS/PaaSの利用増加により境界の外にアプリケーションがあることも少なくなりました。リモートワークも絡むとユーザ端末-SaaS間で境界の外でアクセスが完結することもあります。
これらの潮流に対応するために境界の内か外かで信頼するのではなく、そもそも全てのアクセスが信頼されないものとしてユーザやデバイス、コンテキストによってアクセスを検証・認証認可しアプリケーションのセキュリティを保つという考え方がゼロトラストです。
Cloudflare Zero Trust
Cloudflare Zero TrustはCDNで有名なCloudflareが提供するゼロトラスト製品群です。
ガートナーが提唱するIT戦略であるSASE(Secure Access Service Edge: サッシー)を実現するプラットフォームとして提供されています。
とても有難いことにFreeプランが用意されていること、インターネット上で構築やってみた系の記事があることから今回は上記プラットフォームを利用することに決めました。
用意したもの
- Raspberry Pi 2 ModebB
- iPad
- ドメイン
- Cloudflareアカウント
- Googleアカウント(GoogleをIdPとして使用)
構成図
Raspberry Piのセットアップ
Cloudflare Tunnelを稼働させるためにデーモンが必要になるのでラズパイをセットアップ。
(Windowsにもインストールできるようですが、強制再起動等で繋がらなくなるのが嫌なのでラズパイを使用)
以下を参考にしました。
今ってあれこれ使ってISOを焼く必要がなく、公式が素敵ツールを出していると知って驚愕、、、
32G以上のmicroSDカードをFAT32にフォーマットするのもツールがやってくれる。
shhdの起動と公開鍵の配置もツールのオプションで可能なため最初からsshでアクセス可能。
cloudflareアカウントの取得~Tunnelの作成
cloudflareにサインアップします。
URL: https://dash.cloudflare.com/
サインアップするとドメイン登録のガイダンスが出るので、そのまま登録に移ります。
今回は元々持っていたドメインを登録し権威DNSを移管しました。
DNSの移管後Zero Trustダッシュボードに移動します。
ドメインの詳細画面→Accessの順に遷移し「Zero Trustを起動する」をクリックします。
Zero Trustのチーム名(テナントのようなもの)の作成と支払い手段の登録を求められるので登録するとダッシュボードに到達しました。
Access→Tunnelsの順に遷移し「Add a tunnel」ボタンをクリックします。
Tunnel名を指定して「Save Tunnel」をクリック。
cloudflaredのインストール指示が出るので環境を選択します。
Raspberry Pi OSはDebianベースで32ビットなのでそれぞれ選択するとコマンドが表示されます。
clooudflaredのインストール
ラズパイにSSH接続し、まずはapt updateします
$ apt update
$ apt upgrade
先程ポータルで表示されたコマンドをコピペで実行します(画像再掲)
ここで問題発生。以下のエラーが出ました。
dpkg: error processing archive cloudflared.deb (--install):
package architecture (386) does not match system (armhf)
Errors were encountered while processing:
cloudflared.deb
調べたところ同じエラーに遭遇している人を発見したので、この記事の方法でのインストールに切り替えました。
インストール後サービスの起動状態がactive(running)になっていることを確認します。
$ systemctl status cloudflared
cloudflareポータルでの設定
ラズパイの設定が終わったらポータルに戻ります。
cloudflaredのインストール指示画面で「Next」をクリックして次の画面に進みます。
ルーティング設定を求められます。
今回はVPNの代替として使用したいので「Private Network」タブで自宅NWのCIDRを入力し「Save Tunnel」をクリックします。
続いてIdPを登録するためにSettings→Authentication→Login methodsの「Add new」の順にクリックして登録画面に遷移します。
IdPを選択すると登録指示画面に遷移するので指示通り登録します。
今回はGoogleをIdPとしました。
次にデバイス許可設定を追加します。
Settings→Warp Client→Manageの順にクリックし、Device Enrollmentの「Manage」画面でGoogleをIdPに設定したためルールとして自分のGoogleアカウントを許可する設定を追加。
最後にSplit Tunnelsの設定を行います。
デフォルト設定だとローカルIPのセグメントはcloudflareへのルーティング対象外となっています。解決するにはデフォルトルールに存在するルーティングの除外ルールから使用するIPレンジを削除するか、新規にルールを定義しルーティング対象のIPレンジを指定するかから選択可能です。
今回は後者で設定を行いました。
疎通確認
エッジ端末として使用するiPadの設定を行います。
App Storeで「Warp」アプリを検索しインストールします。
初回起動時にVPNプロファイルのインストールを求められるので実行します。
続いてZero Trustにログインします。
ハンバーガーメニュー→アカウント→「Cloudflare Zero Trustにログイン」をクリックします。
チーム名の入力が求められるので、ポータルでZero Trust初回起動時に設定したチーム名を入力します。
SSO設定したGoogleアカウントを入力します。
cloudflareからパスコードが届くので入力するとログインが完了します。
トグルをオンにしてトンネルを確立します。
自宅PCにRDPして接続が確認できました(祝)
嵌ったこと
-
Split Tunnelの設定もれ
ルーティング設定がPrivate Networkの場合ポータルの指示通りに設定を行っただけだと接続できませんでした。
同じ事象に嵌った方が記事を出していたので追加設定を実施して解決。 -
Pingが通らない
正直これが一番嵌りました。
Split Tunnel設定もれで自宅PCにRDPできなかったので、疎通確認と思いPingを打つが通らなかった。
Split Tunnel設定後Pingを打って確認をするが通らない(実はもう疎通はできている)→なぜ???となり、あれこれ設定を調べたり投入→Pingを打って通らないのループ。。。
そもそも「Ping(ICMP)は通らない」ようです。
※通す方法はあるかもですが、そこまで調べませんでした
P.S.
今回の構成をすべて終え、長らく使っていたYAMAHA RTX1200はお役御免となりました。
ありがとう、お疲れ様。
Discussion