Cloudflare で mTLS を利用する
Cloudflare で mTLS を利用するのがあまりにも簡単だったので書いておきます。
mTLS について
一般的に TLS を利用する場合は「クライアントがサーバーから送られてきた証明書を検証する」という仕組みを利用し、
信頼できる機関が発行した証明書を利用しているかどうかや証明書のドメインが一致しているかどうかなどを確認します。
mTLS (mutual TLS) というのは TLS 利用時に「クライアントから送られた証明書をサーバが検証する」という仕組みです。
つまりサーバーがクライアントがわから送られてくる証明書を確認するというフェーズが挟み込まれます。
この証明書自体は何を使ってもよく、オレオレ証明書でもかまいません。
クライアント側に証明書を設定するという仕組みです。VPN とかを利用したりする方は経験があるかもしれません。
mTLS はめんどくさい
クライアント側に証明書を設定するというのが本当にめんどくさいです。さらにそのクライアントが破棄されたタイミングで revoke しなければなりません。それもめんどくさいです。
ブラウザで利用するにも証明書を設定する必要があります。証明書をクライアント毎に発行するという場合もあるでしょう。
つまり mTLS は凄くめんどくさいです。
なぜ mTLS を使いたいのか
めんどくさい mTLS ですが、メリットが多くあります。
1. 中間者攻撃 MITM が防げるようになります。mTLS はクライアントもサーバー両方チェックするので間に入り込むのがほぼ不可能になります。
-
ほぼ最強の認証の仕組みとして使える。証明書検証をサーバーが行う前提なのでクライアントが正しい証明書を持っているかどうかというチェックだけで認証が行えます。最高です。
-
接続中の負荷は変わらない。mTLS を使ったとしても最初のハンドシェイク時以外は負荷は特に変わりません。HTTP/2 や HTTP/3 であれば繋ぎっぱなしで利用するでしょうからほとんど負荷が変わりません。
-
アタックに強い。そもそも証明書を送ってこなければ相手にしませんし、証明書の改ざんは基本的に無理なので何をやっても無駄になります。
-
なりすましに強い。両方で認証する仕組みになるためなりすましをするのがほぼ不可能になります。
凄い簡単にいえば mTLS 使うだけで認証をあまり何も考えなくて良くなります。ただ revoke だけはちゃんとしないとだめです。
Cloduflare で mTLS
Cloudflare では mTLS のためのクライアント証明書を発行するのがとても簡単です。
Cloudflare にドメインが登録済みの前提です。
クライアント証明書
クライアント証明書の作成
ECC で 15 年を選んでいます。別に RSA でも 10 年でもいいです。
クライアント証明書の取得
二度と表示されないので、ちゃんと保存しましょう。
ホストの登録
mTLS を有効にするホストを登録します。ここでは mtls.shiguredo.co.jp を登録しています。
mTLS のルール設定
ファイアーウォールの設定で、mTLS で設定したドメインを登録します。ボタン一つです。
ファイアウォール設定一覧
mTLS の設定が追加されていることを確認します。
設定の確認
mTLS の設定としてホスト名が mtls.shiguredo.co.jp でクライアント証明書を要求していることを確認します。
以下は mTLS で守られた URL です。アクセスしてみてください。
Cloudflare Workers で mTLS
Cloudflare Workers のカスタムドメインで指定したドメインを指定して mTLS ルールを作るだけで終わりです。
時雨堂では Fluent Bit からの Out HTTP の送り先であるエンドポイントを mTLS にすることで変なアクセスを受け付けないようにしています。
さらに Cloudflare の IP 制限も mTLS とセットで行うことで、より強固にすることが可能です。
宣伝
TLS について学びたい場合は以下の本をオススメします。
プロフェッショナルSSL/TLS – 技術書出版と販売のラムダノート
資料
-
mTLSとは?| 相互TLS | Cloudflare
- 図でわかりやすく説明してくれている
-
Cloudflare のクライアント証明書と対象ホストを Workers で区分けする - Qiita
- Cloudflare WAF は revoke されていないクライアント証明書を「すべて」を成功させてしまうため Workers で証明書のフィンガープリントを使って証明書固有に縛ってしまう仕組みの解説
Discussion