暗号化されたServer Name Indication(サーバー名表示)(ESNI) は、ユーザーの閲覧を非公開にするのに役立ちます。これは、ユーザーがどのWebサイトを訪問しているかを明らかにするTLSハンドシェイクの暗号化されていない部分を暗号化します。
この記事を読み終えると、以下のことができるようになります。
関連コンテンツ
是非、Cloudflareが毎月お届けする「theNET」を購読して、インターネットで最も人気のある洞察をまとめた情報を入手してください!
記事のリンクをコピーする
暗号化されたServer Name Indication(サーバー名表示)(ESNI)は、ユーザーの閲覧データをプライベートに保つために不可欠な機能です。これは、スヌーピングする第三者がTLSハンドシェイク プロセスを覗き見て、ユーザーが訪問しているWebサイトを特定できないようにします。ESNI は名前通り、TLSハンドシェイクのServer Name Indication(SNI)、つまりサーバー名を表示する部分を暗号化することでこれを実現します。
SNI は、クライアントとサーバー間の接続の開始時にTLS証明書を表示するようにWebサーバーに指示します。SNIはTLSプロトコルに追加され、サーバーが同じIPアドレスで複数のTLS証明書をホストできるようにします。
SNIは、郵送先住所にあるアパートの部屋番号のようなものだと考えてください。1軒の建物内に複数の部屋があるため、各部屋を区別するために異なる番号が必要です。同様に、サーバーはIPアドレスによって示されますが、クライアントデバイスは、サーバーへの最初のメッセージにSNIを含めて、どのWebサイト(どの部屋番号)に到達しようとしているかを示す必要があります。
Transport Layer Security (TLS) は、インターネット上での通信を非公開かつ安全に保つ暗号化プロトコルです。TLSは、WebブラウザがWebサイトを読み込むときのように、主にアプリケーションとWebサーバー間の通信を暗号化するために使用されます。TLSを使用するすべてのWebサイトには、TLS証明書が必要です。TLSはSSLと呼ばれることもありますが、SSL はプロトコルの古い名前です。
すべてのTLS接続は、「ハンドシェイク」と呼ばれるものから始まります。実生活において、初めて会った2人がお互いに自己紹介するときにハンドシェイク(握手)をするのと同じように、TLSハンドシェイクは(ユーザーのスマートフォンのような)クライアントデバイスとWebアプリケーションまたはWebサイト間通信の導入部分です。TLSハンドシェイク中、通信する2つのデバイスは、使用する暗号化キー について同意します。必要なステップが複数あるにもかかわらず、TLSハンドシェイクにかかる時間はわずか数ミリ秒です。
SNIはTLSハンドシェイクの最初のステップの、小さいながらも重要な部分です。TLSハンドシェイクの最初のメッセージは、「Client Hello」と呼ばれます。このメッセージの一部として、クライアントはWebサーバーの TLS証明書を表示するように要求します。サーバーは、応答の一部として証明書を送信することになっています。
問題は、多くのWebサーバーが複数のWebサイトをホストし、各Webサイトが独自のTLS証明書を持っている可能性があることです。サーバーがクライアントに間違ったものを表示した場合、クライアントは目的のWebサイトに安全に接続できず、 「この接続ではプライバシーが保護されません」というエラーになります。
SNIは、クライアントが到達しようとしているWebサイトを示すことで、この問題を解決します。逆説的に、SNIを使用してTLSハンドシェイクが正常に完了するまで、暗号化は行われません。その結果、TLSハンドシェイクの開始時にClient Helloメッセージが送信されるため、通常のSNIは暗号化されません。クライアントとサーバー間の接続を監視する攻撃者は、それ以降の通信はすべて攻撃者にとって解読不能であっても、ハンドシェイクのSNI部分を読み取ることによって、クライアントが接続していたWebサイトを特定する可能性があります。(攻撃者は、フィッシング Webサイト を設定してユーザーを騙すなど、さまざまな方法でこの情報を利用する可能性があります)。
ESNI は、Client HelloメッセージのSNI部分(およびこの部分のみ)を暗号化することによって、SNIの秘密を保持します。暗号化は、通信する両者(この場合はクライアントとサーバー)が情報の暗号化と復号化のための鍵を持っている場合にのみ機能します。これは、両方がロッカーの鍵を持っている場合に限り、2人のユーザーが同じロッカーを使用できるのと同じです。Client Helloメッセージは、クライアントとサーバーがTLS暗号化キーに合意する前に送信されるため、ESNI暗号化キーは他の方法で通信する必要があります。
ソリューション:公開鍵暗号化 。Webサーバーは、DNSレコード に公開鍵を追加します。これにより、クライアントが適切なサーバーを見つける場所を検索するときに、サーバーの公開鍵も検出されます。これは、訪問者が安全に家に入ることができるように、家の外の鍵付きの箱に家の鍵を入れておくようなものです。その後、クライアントは公開キーを使用してSNIレコードを暗号化し、その特定のサーバーだけが復号化できるようにします。(これはやや簡略化された説明です。専門的で詳細な説明については、このブログ記事 を参照してください)。
では、アリスがボブのWebサイト、www.bobisawesome.example.comを訪問しようと思っている場面を想像してみてください。すべての責任あるWebサイトの所有者と同様に、ボブは自分のWebサイトにTLSを使用しており、ボブのWebサイトを訪れる訪問者との間のすべてのトラフィックが暗号化されます。ボブはまた、アリスのようなサイト訪問者をさらに保護するためにESNIを実装しました。
アリスがノートパソコンのブラウザに https://www.bobisawesome.example.com と入力すると、ノートパソコンはWebサイトを読み込むために次のプロセスをたどります。
* この最後の文は、プロセスのDNS部分が DNSSECを使用し、DNS over HTTPSまたはDNS over TLSを使用している場合にのみ適用されます。詳細は下記参照。
ESNIはWeb上のプライバシーとセキュリティへの大きな一歩ですが、他の新しいプロトコルや機能も重要です。インターネットはセキュリティとプライバシーを念頭に置いて設計されませんでした。その結果、プライバシー優先になっていないWebサイトを訪問する過程には多くのステップがあります。しかし、さまざまな新しいプロトコルが、悪意のある攻撃者から各ステップを暗号化して保護するのに役立っています。
ドメインネームシステム(DNS)は、www.bobisawesome.example.com のような人間が読めるWebサイトのアドレスを英数字のIPアドレスに一致させます。これは、誰もが使う大きなアドレス帳で誰かのアドレスを調べるようなものです。ただし、通常のDNSは暗号化されません。つまり、ユーザーが検索しているアドレスを誰でも見ることができ、だれでもアドレス帳になりすますことができるのです。ESNIが設定されている場合でも、攻撃者はユーザーがクエリしているDNSレコードを確認し、訪問しているWebサイトを特定する可能性があります。
これらのギャップを埋めるために、DNS over TLS、DNS over HTTPS、DNSSEC という3つのプロトコルが追加されています。
DNS over TLSとDNS over HTTPS はどちらも同じことをします:TLS暗号化でDNSクエリを暗号化します。二つの主な違いは、使用するネットワーク層と使用するネットワークポートです。DNSSEC は、DNSレコードが実在し、DNSサーバを偽装する攻撃者(DNSキャッシュポイズニング攻撃のように)ではなく、正規のDNS サーバーから取得されていることを確認します。
Encrypted Client Hello(ECH)は、Client HelloのSNI部分を暗号化して保護する、TLSプロトコルのもう一つの拡張機能です。ただし、ESNIとは異なり、ECHはClient Hello全体を暗号化します。ECHについての詳細は、こちらのブログ記事をご覧ください。
Cloudflareネットワークは2018年9月からESNIをサポートしています。CloudflareはESNIをサポートする最初の主要なネットワークであるだけでなく、CloudflareはESNIの開発にも尽力しました。ESNIはまだ公式のRFC、またはインターネット標準として公開されていませんが、RFC草案があります。
この無料のESNIチェッカーツールで 、セキュリティ、プライバシー、およびESNIの使用状況についてブラウザを確認してください。SNI が作成された理由 、または TLSハンドシェイクがどのように機能するかについての詳細はこちらをご覧ください。