クライアントVPN不要! Cloudflareを使ってWebサーバへゼロトラストアクセスを実現

f:id:sbc_saito:20210317113202p:plain 皆様こんにちは! プロダクト技術課の斎藤です。(組織が変更になりました)

SBクラウドはクラウドフレア・ジャパン株式会社と提携し、Cloudflareのソリューションを提供しております。

www.sbcloud.co.jp

本日はその中でも、Cloudflare Accessを利用したWebサーバへのアクセスに認証機能を導入と
Argo Tunnelを利用したWebサーバとCloudflare間の暗号化を行い、ゼロトラストネットワークを構築します。

構成図

今回はこの様な構成を考えてみました。 f:id:sbc_saito:20210316182815p:plain

WebサーバはAlibaba Cloud東京リージョンのECSを利用して
インターネットへのアクセスはSource NATをNATゲートウェイで行います。
Argo Tunnelを利用すればNAT環境下であってもサーバを安全にインターネットに公開ができます。
また、Cloudflare Accessで認証成功したユーザのみ、Webサーバへアクセスできる仕組みとなっております。

Cloudflareを利用するための準備

Cloudflareを利用するためにはドメインをCloudflareと紐づいている必要があります。
セットアップについては松田さんが詳しく説明されている過去postがありますので参照ください。 www.sbcloud.co.jp

Cloudflare Accessをセットアップ

Cloudflareダッシュボードにログインし、Accessタブ→ログインメソッド→追加→One-Time Pinを選択し、保存します。
ログインメソッドに「One-Time Pin」が表示されたことを確認します。 f:id:sbc_saito:20210316190027p:plain

続いてログインメソッドの下部にあるAccess ポリシーに移動します。
「Accessポリシーを作成」をクリックします。
ここで公開するWebサーバのサブドメインと、アクセスポリシー内容を設定します。 今回はサブドメイン名を「saito」、アクセスポリシーを「@g.softbank.co.jp」のドメインのEメールアドレスのみを許可する様に設定しています。
サブドメインが「saito」なので私の環境のFQDNはsaito.<ドメイン>になりますね。
許可のアクセスポリシーを追加した場合は、その他の条件でアクセスすると拒否する様になります。
アクセスポリシーは他にもIPアドレスやGitHub組織等でも制限することが可能です。
f:id:sbc_saito:20210316191547p:plain

以上でCloudflare Accessの設定は完了です。

Argo Tunnelをセットアップ

今回のWebサーバの環境です。

ECS Instance Type: ecs.c6.large
OS: CentOS 8.2.2004 (Core)
nginx version: nginx/1.14.1

予めnginxをインストールさせた環境にArgo Tunnelを動作させるために必要なCloudflare deamonを導入します。
Install cloudflared · Cloudflare for Teams documentation

インストール方法がいくつかありますが、今回は導入が簡単な.rpm版をインストールします。

$sudo wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb

$sudo dpkg -i cloudflared-stable-linux-amd64.deb

続いてCloudflareにログインしてサーバを認証します。

$cloudflared login


f:id:sbc_saito:20210316184114p:plain

ターミナルに表示されたhttp://~のURL(上記画像の赤枠部分)をお使いのWebブラウザにコピペしてアクセスします。
(Webブラウザを利用することができるWebサーバならばそのままWebブラウザが立ち上がります。)

すると、Webサーバをどのドメイン(ゾーン)で認証したいか問われますので選択します。

私の環境ではドメインは1つしか登録していないので、1つだけ表示されていますね。 f:id:sbc_saito:20210316183751p:plain

右下の「認証する」をクリック。 f:id:sbc_saito:20210316183758p:plain


これでサーバの認証完了です。 f:id:sbc_saito:20210316183736p:plain



そして下記コマンドでArgo Tunnelを張り、WebサーバとCloudflare間の通信を暗号化します。 FQDNとWebサーバのIPアドレスは適宜置き換えてください。

$sudo cloudflared tunnel --hostname <FQDN> --url http://<WebサーバのプライベートIPアドレス>



下記画像の様にエラーが特に表示されなければArgo Tunnelが成功しています。

f:id:sbc_saito:20210316184844p:plain

もう一つ確認方法としてCloudflare上のDNSレコードも確認してみましょう。
先ほどArgo Tunnelを張る際に指定したサブドメインがAAAAレコードで登録されていることが確認できます。

f:id:sbc_saito:20210316185348p:plain

いざアクセス!

クライアントのWebブラウザから、Cloudflareに登録したhttp://<FQDN>へアクセスします

するとログインメソッドとAccessポリシーの時に設定した条件であるEメールアドレスを入力する画面が表示されます。 f:id:sbc_saito:20210317140442p:plain

条件に合致するEメールアドレスを欄に入力して「Send me a code」ボタンをクリックすると

Cloudflareから入力したEメールアドレス宛にワンタイムパスコードが送信されます。 f:id:sbc_saito:20210316220146p:plain

Webブラウザに戻りメール内に記載されているワンタイムパスコードを入力して「Sign in」をクリックすると f:id:sbc_saito:20210317140436p:plain

アクセスが許可され、Webサーバへアクセスすることが出来ました!(nginxの初期ページ)

f:id:sbc_saito:20210316220004p:plain

ちなみにWebブラウザのURLバーをみてみるとhttps化されており、鍵アイコンが表示されていますね。
実はWebサーバへのトラフィックをCloudflareを介すことにより、簡単にSSL対応が出来てしまうのです! これがCloudflare SSLというソリューションです。 f:id:sbc_saito:20210316221323p:plain

Webブラウザから証明書の詳細を覗いてみました。
Cloudflare SSLを利用しているときは、SSL証明書の有効期限切れを心配する必要はありません。最新のSSL脆弱性についても最新情報が維持されます。
これで「突然Webへ繋がらなくなった!」という証明書切れのトラブルからもおさらば出来ますね!
f:id:sbc_saito:20210316221331p:plain

様々なCloudflareソリューションが互いにインテグレーションしており、セキュア&利便性に貢献しているんですね。 f:id:sbc_saito:20210316222954p:plain

最後に

クライアントにVPNソフトウェアをインストールしなくても、簡単&セキュアに社内システムにアクセスできる時代になりました。
WebサーバがNAT環境にあってもArgo Tunnelによりインターネット公開が出来、しかも通信はTCP/IPレベルで暗号化されています。
加えてCloudflareからWebサーバ間およびCloudflareからクライアント間はアプリケーション層におけるSSL暗号化も可能で更にセキュアな環境が導入出来ます。

今後は他のCloudflareソリューションについてもご紹介する予定です。
Cloudflareに少しでもご興味持っていただけたら幸いです!

Cloudflare関連記事

www.sbcloud.co.jp www.sbcloud.co.jp www.sbcloud.co.jp