相互TLS認証(mTLS)とは?

相互TLS認証(mTLS)は認証の一種であり、接続する2者間でTLSプロトコルを使用して相互に認証し合います。

学習目的

この記事を読み終えると、以下のことができるようになります。

  • 相互TLS認証(mTLS)の仕組みを説明する
  • 相互TLS認証と通常のTLS認証の違いを理解する
  • mTLSがどのように攻撃を阻止するかを説明する

記事のリンクをコピーする

相互TLS認証(mTLS)とは?

相互TLS認証(略してmTLS)は、相互認証方式です。 mTLSは、ネットワーク接続の両端にいる当事者がお互いに正しい秘密を持っていることを確認することで、彼らが主張する人物であることを保証します。各自のTLS証明書内の情報に従って、追加の検証が行われます。

mTLSは、Zero Trustセキュリティフレームワーク*で組織内のユーザー、デバイス、サーバーを確認するために良く使用されます。また、APIのセキュリティの維持にも役立ちます。

*ゼロトラストとは、ユーザー、デバイス、ネットワークトラフィックをデフォルトで一切信頼しないことを意味し、多くのセキュリティ上の脆弱性を排除するのに役立つアプローチです。

TLSとは?

Transport Layer Security(TLS)はインターネット上で広く使用されている暗号化プロトコルです。TLSは、以前はSSLと呼ばれていましたが、クライアント-サーバー間接続において、サーバーの認証およびクライアントとサーバー間の通信の暗号化を行い、部外者が通信を盗み見できないようにします。

TLSの仕組みについて理解するために重要なことが3つあります。

1. 公開鍵と秘密鍵

TLSは、公開鍵と秘密鍵という2つの鍵を使用する公開鍵暗号化という技術を使用することで機能します。

  • 公開鍵で暗号化されたものは、秘密鍵でのみ復号化できます。
  • 秘密鍵で暗号化されたものは、公開鍵でのみ復号化できます。

したがって、公開鍵で暗号化されたメッセージを復号化するサーバーは、秘密鍵を所有していることを証明することになります。ドメインまたはサーバーのTLS証明書を調べると、誰でも公開鍵を表示することができます。

2. TLS証明書

TLS証明書はデータファイルで、このファイルには公開鍵、証明書の発行者(TLS証明書は認証局から発行されます)、証明書の有効期限など、サーバーやデバイスの身元を確認するための重要な情報が含まれています。

3. TLSハンドシェイク

TLSハンドシェイクは、TLS証明書の検証と、サーバーが秘密鍵を所有していることを確認するためのプロセスです。また、TLSハンドシェイクはハンドシェイクが終了した後の暗号化方式も確立します。

mTLSの仕組みは?

通常、TLSでは、サーバーはTLS証明書と公開鍵/秘密鍵のペアを持ちますが、クライアントはこれらを持ちません。一般的なTLSの処理は次のようになります。

  1. クライアントからサーバーに接続する
  2. サーバーがTLS証明書を提示する
  3. クライアントがサーバーの証明書を検証する
  4. 暗号化されたTLS接続で、クライアントとサーバーが情報を交換する

ただし、mTLSではクライアントとサーバーの双方が証明書を持ち、双方が公開鍵/秘密鍵のペアを用いて認証を行います。通常のTLSと比較して、mTLSでは両者を検証するための追加ステップがあります(追加の手順は太字です)。

  1. クライアントからサーバーに接続する
  2. サーバーがTLS証明書を提示する
  3. クライアントがサーバーの証明書を検証する
  4. クライアントがTLS証明書を提示する
  5. サーバーがクライアントの証明書を検証する
  6. サーバーがアクセスを許可する
  7. 暗号化されたTLS接続で、クライアントとサーバーが情報を交換する

mTLSにおける認証局

mTLSを実装する組織は、自分自身が認証局として機能します。これは、認証局が外部組織であり、証明書の所有者が関連付けられたドメインを正当に所有しているかどうかをチェックする標準的なTLSとは対照的です(TLS証明書の検証についてご覧ください)。

mTLSには、「ルート」TLS証明書が必要です。この証明書により、組織は自分自身の認証局になることができます。承認されたクライアントとサーバーが使用する証明書は、このルート証明書に対応している必要があります。ルート証明書は自己署名されており、これは組織が自分で作成したことを意味します。(この方法は、公共のインターネット上の一方向TLSでは機能しません。この場合、外部の認証局がこれらの証明書を発行する必要があります)。

なぜmTLSを使用するのか?

mTLSは、クライアントとサーバー間のトラフィックが双方向で安全かつ信頼できることを保証するのに役立ちます。これにより、組織のネットワークやアプリケーションにログインするユーザーに対する追加のセキュリティ層が提供されます。また、Internet of Things(IoT)デバイスなど、ログインプロセスを経ないクライアントデバイスとの接続の検証も行われます。

mTLSは、以下のような様々な種類の攻撃を防ぐことができます。

  • 中間者攻撃:中間者攻撃者はクライアントとサーバーの間に身を置き、両者間の通信の傍受や改ざんを行います。mTLSが使用されている場合、中間者攻撃者はクライアントもサーバーも認証できないため、この攻撃を実行することはほとんど不可能になります。
  • スプーフィング攻撃:攻撃者は、Webサーバーからユーザーに対する「スプーフィング」(なりすまし)の試行、またはその逆を行うことが可能です。両者がTLS証明書で認証する必要がある場合、スプーフィング攻撃ははるかに困難になります。
  • クレデンシャルスタッフィング:攻撃者は、データ漏えいによって流出した資格情報のセットを使用して、正当なユーザーとしてのログインを試行します。正規に発行されたTLS証明書がなければ、クレデンシャルスタッフィング攻撃はmTLSを使用する組織に対して成功することはありません。
  • ブルートフォース攻撃:ブルートフォース攻撃では、攻撃者は通常ボットを使用して高速にユーザーのパスワードを推測したトライアンドエラーを行います。mTLSは、パスワードだけでは組織のネットワークにアクセスできないことを保証します。(レート制限は、この種のボット攻撃に対処するもう一つの方法です)。
  • フィッシング攻撃:フィッシング攻撃の目的は、多くの場合、ユーザーの認証情報を盗み、その認証情報を使ってネットワークやアプリケーションを侵害することです。ユーザーがこのような攻撃に引っかかったとしても、攻撃者はこれらの資格情報を使用するには、TLS証明書とそれに対応する秘密鍵が必要です。
  • 悪意のあるAPIリクエスト:APIセキュリティに使用する場合、mTLSはAPIリクエストが正当な認証されたユーザーからしか来ないことを保証します。これにより、攻撃者は脆弱性を悪用したり、APIの機能を破壊したりすることを目的とした悪意のあるAPIリクエストを送信することができなくなります。

すでにWebサイトではTLSが使われているが、インターネット全体でmTLSが使われない理由は?

日常的な目的であれば、一方向認証で十分な保護が得られます。公衆インターネットにおけるTLSの目的は、1)ユーザーが偽装されたWebサイトを訪問しないようにすること、2)機密データインターネットを構成するさまざまなネットワークを通過する際に安全かつ暗号化された状態に保つこと、3)データが転送中に改ざんされないことを保証すること、です。クライアントがサーバーのIDのみを検証する一方向TLSは、これらの目標を達成します。

さらに、すべてのエンドユーザーデバイスにTLS証明書を配布することは非常に困難です。これに必要な数十億もの証明書を生成、管理、検証することは、ほぼ不可能なタスクです。

しかし、小規模な組織ではmTLSは非常に有用であり、特にその組織がネットワークセキュリティにZero Trustアプローチを採用している場合には、非常に実用的です。Zero Trustのアプローチでは、デフォルトでいかなるユーザー、デバイス、リクエストも信頼しないので、組織は、すべてのユーザー、デバイス、リクエストがネットワーク内の任意のポイントにアクセスしようとするたびに、認証できる必要があります。mTLSは、ユーザーの認証とデバイスの検証によってこれを可能にします。

CloudflareはどのようにmTLSを使用しますか?

Cloudflare Zero Trustは、Zero TrustセキュリティにmTLSを使用しています。また、Cloudflare API ShieldもAPIエンドポイントの検証にmTLSを使用して、権限のない人が悪意のある可能性のあるAPIリクエストを送信できないようにします。CloudflareでmTLSを実装する方法についてご覧ください。