😊

Cloudflare Zero Trustを使って、赤ちゃんの様子をモニタリングするシステムを構築する

2023/07/28に公開

はじめに

ご無沙汰しています。Team DELTA代表の丹です。
実は最近子供がうまれ、育休をいただいていたのですが、育休が開けるのに際して「いつでも赤ちゃんの様子を確認したい」という思いが強くなったので
表題の赤ちゃんモニタリングシステムを構築しました。という記事です。

やったこと

  • Cloudflare Zero Trustを使って、家の外からセキュアに赤ちゃんの様子を確認できるシステムを構築した
  • Raspberry PiとWEBカメラで家のローカルNW向けに映像を配信する
  • Cloudflare Zero Trust + WARP Clientを使ってVPNを構築し、家のNWと疎通して出先で映像を見られる
  • Cloudflare Zero Trustは導入がめちゃくちゃ簡単かつ従来型のVPNよりアイデンティティベースに細かい設定ができセキュア

Cloudflare Zero Trustとは

  • Cloudflareが提供している、組織向けのセキュリティ・ネットワークアクセスソリューション
  • 正確にはVPNではない(VPNのような感じの機能はあるが)
  • いろいろな機能があるが、今回はZero Trust Network Access = ZTNAと呼ばれる機能を利用する

映像配信システムの構築

  • 今回はMomo Clientを使って簡単にRaspberry Pi+USB WEBカメラをWebRTC経由で配信する。

  • まず、家のローカルNW向けに映像配信のサーバーを立てる。
    参考:https://qiita.com/Ninagawa_Izumi/items/88460922abb04a82c220

  • Momoの起動と、映像配信の疎通を確認してみる。

  • この状態だと、家のNW内からプライベートなIP(192.168.x.x)でアクセスすることはできるが、家の外からのアクセスはできない

  • そのままだと上記のような構成になる

Cloudflare Zero Trustの導入

  • 最終的な構成は以下を目指す。

成し遂げたい状態

  • クライアント端末はWARP Client経由でCloudflare Zero Trustネットワーク配下に入る。
  • Cloudflare Zero Trustネットワーク内で特定のCIDRに合致するIPへの通信は、 cloudflaredと呼ばれるトンネルプロセスを通して家のネットワークに飛ばされる。

これはつまり、

  • クライアント端末にWARP Clientがインストールされていて、かつ自社(今回の場合は自宅)用の専用ネットワークに接続できている状態。
  • cloudflared が家のネットワークに常駐していてかつ、Cloudflare Zero TrustネットワークはどのCIDRをどのcloudflaredトンネルに流すべきかを知っている状態

となる。
これを一つ一つ解決していこう。

なお、cloudflared は外部からのリクエストからさらされているわけではなく、逆にcloudflared側がCloudflare Zero Trustネットワークに対して能動的に接続しに行っているらしい。
これにより、cloudflared が常駐しているネットワークインタフェースがインターネットから可視である必要がなく、よりセキュアな接続が可能になるとのこと。

当初の状態

  • 当初は、クライアント端末は(モバイル通信であれば)いきなりインターネットに接続しており、グローバルIPが無い家の端末は到達できない状態になっている。

チームの作成

  • まずCloudflareのダッシュボードのサイドバーから「Zero Trust」を選択
  • すると、Team domainを決めろと言われるので適当な文字列を入れる。今回はtan-t.cloudflareaccess.comとした
  • 続いて、Settings > WARP Client > Device Enrollment Policiesから、Enrollできるデバイスの条件を指定

この時点で、以下の部分が作成される。

WARP Clientの導入

  • https://1.1.1.1/ からWARP Clientをインストールする。今回はAndroidのアプリをインストールした。
  • 「環境設定」 > 「アカウント」から先ほど作成したチームドメインにログインする。メールによるパスワードレス認証がデフォルトのはず。Device Enrollment Policyに適したデバイスまたはメールアドレスであればログインできる
  • スイッチをオンにして、Cloudflare Zero Trustにサインインした状態のWARP経由でのネットワークアクセスを有効化する。

これでクライアント側は専用のCloudflare Zero Trustネットワークに接続した状態となった。

LAN内にcloudflaredを導入

  • ここまでで、クライアント端末はCloudflare Zero Trustネットワークに接続し、全トラフィックがCloudflare Zero Trustネットワークを通ってインターネットに出ていくようになっている。

  • 続いて、Cloudflare Zero Trustネットワークにつながるトンネルプロセスを家のネットワークに導入する。

  • 自宅の適当な端末にcloudflaredと呼ばれるトンネルプロセスをインストールしてみる。

  • 今回は、常時起動していて必ずカメラにアクセスできるということで対象となるRaspberry Pi自体にインストールすることとした。

  • https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/ から、該当のOS(Raspibianの場合はDebian arm64bitのはず)に合わせてcloudflaredのインストールを行う。

  • その後、ログインを実行する。

cloudflared tunnel login
  • 今度はCloudflareのweb画面へのログインが求められるので完遂する。

この時点で、家のネットワークからCloudflare Zero Trustネットワークに能動的に接続するトンネルが構築された。
ただ現在は、どのトラフィックがこのトンネルに流されるべきかを定義していないので、続けてトンネルの作成と設定を行う。

トンネルの作成と設定

  • tunnelを作成する。なお自宅のNWのためhomeという名前とした。
cloudflared tunnel create home
  • tunnel IDが画面に出るので控えておく。
cloudflared tunnel route ip add 192.168.0.0/24 home
  • このコマンドで、192.168.x.x のCIDRを home というトンネルと紐づけるということをCloudflare Zero Trustネットワークに要請した。
  • 続けて、このトンネルと現在まさにこの端末で動いているcloudflaredを紐づけるということを行う。

  • /root/.clodflared/config.ymlに、先ほど作成した home トンネルを紐づける設定を記述し保存する。

vi /root/.cloudflared/config.yml
tunnel: <tunnel ID>
credentials-file: /root/.cloudflared/<tunnel ID>.json
warp-routing:
    enabled: true
  • これにより、Raspberry Piで動いているcloudflared プロセスが Cloudflare Zero Trustの専用ネットワークと紐づき、かつ192.168.x.xへのトラフィックをトンネルを経由して受け付ける状態となった。

Split Tunnelsの除外エントリの削除

  • だが、実はこのまま192.168.x.x(Raspberry Piが動いているIP)にWARP Client経由で接続してもうまくいかない。

  • Split Tunnelsといい、特定のIPやCIDRへのアクセスをWARPアクセスから除外したり入れたりできる機能があるのだが、そのデフォルトに192.168.0.0/24が含まれているからである。

  • Cloudflare Zero Trust管理画面のサイドバーから「Settings」 > 「WARP Client」 > 「Profile Settings」 > 「Split Tunnels」から、「Exclude」に記載の192.168.x.x系のエントリを削除すると、WARP経由のトラフィックが家のネットワークに流れるようになる。

  • ここまでで最終的に構築できたのは以下のような構成になった。

  • 最後にサービス化して終了する。
cloudflared service install
  • 疎通確認を行う。

AKACHAN!!!!!!!!!!!!!!

  • 家の外(4G回線)かつWARPクライアントを利用したVPN接続で家のRaspberry Piに接続されたWEBカメラの状態をWebRTC経由で閲覧することに無事成功した。

ふりかえり

  • Momo ClientとCloudflare Zero Trust + WARPを利用して、驚くほど簡単にリモート・赤ちゃん監視システムを構築できた。

  • 一方で、SSLの導入やプライベートDNSの導入など、エンタープライズグレードでの活用を行うのであればまだまだ考えるべきことは多い。

  • しかし、Cloudflare Zero Trustを利用すれば、端末単位やアカウント単位でのきめ細やかな権限制御ができるうえ、仕組み上cloudflaredがトンネルを開けている先のNWは全く外界から不可視なままでいられるという点は非常にセキュアだと思う。

  • 今後もVPNやNWレベルでのセキュリティが求められるような場面では、Cloudflare Zero Trustの機能を活用することも積極的に検討したい。

  • ちなみに、今回は1アカウントのみでの利用になるためCloudflare Zero Trust自体の利用料はゼロ。

  • Raspberry Piとクライアント端末はP2PでWebRTC接続するので、Raspberry Piの電気代以上のコストは全くかかっていない。

We're Hiring!

ここまで読んでくださってありがとうございます!

そもそもCloudflare Zero Trustを使ってみようと思ったのも、ここ数年特に力を入れているCTO Booster(https://costcut.cloud/)のお客様にCloudflare Zero Trustを使ったソリューションをご提案できないだろうか?
と常日頃考えていた結果でもあります。

Team DELTA では、ベンチャースタートアップのCTO様を中心に技術支援を行っているソフトウェア開発チームというユニークなポジションを活かし、
「提案が成果につながる」「勉強すればするほど、それをすぐに顧客への価値提供=事業成果につなげられる」という環境になっています。
エンジニアにとっては非常に面白い環境だと思うので、ぜひぜひここまで読んでくださった方とは何らかの形で繋がりたいです!

まだまだカオスな中ではありますが、代表である私が育休をがっつり取っているぐらい、メンバーにとって働きやすい環境を目指しています。

ご興味ありましたら delta.tech@sevenrich.jp まで!

Discussion