ルールの評価では、ポリシーで設定したルールを使用して、ウェブ リクエストを許可または拒否するかどうかを決定します。次の属性を考慮して決定を行います。
- ルールの優先度: 整数の値が小さいほど優先度が高いことを示します。
- SessionMatcher: 次のセッション レベルの属性と照合します。
- ソースマシンの IP アドレス
- ソースマシンのサービス アカウント
- ソースマシンのセキュアタグ
- ターゲット マシンのホスト名
- ApplicationMatcher: 次の HTTP リクエストの
- 属性と照合します。
- URL
- パス
- リクエスト ヘッダー
すべての SessionMatcher
属性と ApplicationMatcher
属性のリストについては、SessionMatcher
と ApplicationMatcher
で使用可能な属性をご覧ください。
ルールの評価の仕組み
ルールは以下の順序で評価されます。
- 優先度の高いルールが最初に評価されます。
SessionMatcher
属性とApplicationMatcher
属性に一致する最も優先度の高いルールによって、トラフィックに適用されるアクションが決まります。- リクエストがそのルールの
SessionMatcher
属性とApplicationMatcher
属性と一致しない場合、次に最も優先度が高いルールが評価されます。 - このプロセスは、リクエストに一致するルールが見つかるか、すべてのルールが評価されるまで続きます。一致するものが見つからない場合、リクエストは拒否されます。
TLS 検査を構成する前
TLS インスペクションを構成する前に、次のルールの評価シナリオを理解する必要があります。
クライアントはプロキシ サーバーに HTTP リクエストを送信できます。次に、ホスト名、送信元 ID、HTTP ヘッダー、パスなど、使用可能なすべてのデータを使用してリクエストが評価されます。
リクエストが許可されている場合、HTTP トラフィックが宛先に送信されます。ただし、リクエストが拒否された場合、HTTP トラフィックの通過は許可されません。
クライアントは、プロキシに HTTP CONNECT リクエストを送信して、宛先への TCP トンネルを確立できます。これは、クライアントが任意の TCP トラフィックを送信する場合や、HTTPS の場合と同様に、プロキシを介して宛先とのエンドツーエンドの TLS 接続を確立する場合に行われます。
ルールに一致する
SessionMatcher
属性があり、ApplicationMatcher
属性が含まれていない場合、ルールの評価の結果、トラフィックが許可されると、宛先へのトンネルが確立され、トラフィックは TCP プロキシされます。これは、HTTPS トラフィックと TCP トラフィックに適用されます。優先度の高いルールでリクエストに対して実行するアクションを特定できない場合、ルールの評価は続行されます。評価が
ApplicationMatcher
属性を持つルールに進むと、トンネリングされたトラフィックは HTTP または HTTPS として解釈されます。基盤となるデータが HTTP または HTTPS でない場合、接続は失敗します。
基盤となるデータが HTTP の場合、ホスト名、送信元 ID、HTTP ヘッダー、パスなど、リクエストが評価されます。評価結果に基づいて、トラフィックが許可または拒否されます。
HTTPS トラフィックの場合、TLS インスペクション フラグが有効になっている場合にのみルールが評価されます。それ以外の場合は、そのルールはスキップされます。
HTTPS トラフィックの場合、ルールは次の条件を満たす場合にのみ検査されます。
- TLS インスペクション フラグが有効になっている。
- トラフィックが
SessionMatcher
属性と一致する。
TLS インスペクション ルールの構成に関する推奨事項
- TCP トラフィックを許可する場合は、TCP トラフィックを許可するルールは、HTTP トラフィックを許可するルールよりも優先度を高くする必要があります。
ApplicationMatcher
属性を使用するルールは、SessionMatcher
属性を使用してスコープを限定し、HTTP として解釈される無関係なフローを最小限に抑える必要があります。- TLS(HTTPS を含む)トラフィックを許可するが TLS インスペクションを実行しないルールは、TCP プロキシルールとして解釈できます。
- トラフィックの不要な TLS インスペクションを回避するには、TLS インスペクション ルールの優先度を TLS 以外のインスペクション ルールよりも低くする必要があります。一致しないトラフィックでフェイル ファストするには、
SessionMatcher
属性を使用して TLS インスペクション ルールのスコープを限定する必要があります。
TLS インスペクション ルールの構成例
次の例の 2 つのルールについて考えてみましょう。
例 1
この例では、優先度の低い他のルールが存在することを前提としています。次の 2 つのルールについて考えてみましょう。
ルール 1
description: do not allow POST requests priority: 10 basicProfile: DENY sessionMatcher: true tlsInspectionEnabled: true applicationMatcher: request.method == 'POST'
ルール 2
description: allow TCP proxying from tag 12345 to example.com priority: 20 basicProfile: ALLOW sessionMatcher: source.matchTag('tagValues/12345') && host() == 'example.com'
この例では、Secure Web Proxy は次のように 2 つのルールを解釈します。
- TCP トラフィックを許可し、特定のタイプの HTTP リクエストを許可しないことは、TCP トラフィックに POST リクエストが含まれる可能性があるため、相互に排他的です。
- ルール 2 のトラフィックは許可されません。これは、タグ 12345 から example.com へのトラフィックがインターセプトされ、HTTP として解釈されて HTTP メソッドが評価されるため、拒否されます。
ルール 2 を適用するには、次のいずれかの解決策を使用します。
- 推奨: ルール 2 の優先度を高くします(優先度: 5)。
許可されたトラフィックが
SessionMatcher
属性と重複しないように、ルール 1 のスコープを設定します。sessionMatcher: !(source.matchTag('tagValues/12345') && host() == 'example.com')
重複するルールが多くなり、管理が難しくなるため、このソリューションはおすすめしません。
例 2
次の 2 つのルールについて考えてみましょう。
ルール 1
description: allow to specific GitHub repository (TLS inspect to match specific path) priority: 10 basicProfile: ALLOW sessionMatcher: true tlsInspectionEnabled: true applicationMatcher: request.url().startsWith('github.com/grpc/grpc')
ルール 2
description: allow TCP proxying from tag 12345 to example.com priority: 20 basicProfile: ALLOW sessionMatcher: host() == 'bankofamerica.com'
この例では、Secure Web Proxy は次のように 2 つのルールを解釈します。
bankofamerica.com
宛てのトラフィックを含むすべてのトラフィックが検査され、優先度の高いルール 1 のrequest.url()
と一致する TLS が検出されます。ルール 2 で TLS インスペクションを回避するには、次のいずれかのソリューションを使用します。
- ルール 2 の優先度を高くします(優先度: 5)。その結果、ルール 1 の評価前にルール 2 が適用され、
bankofamerica.com
からのトラフィックは TLS 検査なしで許可されます。 推奨: ルール 1 のスコープを狭めて、
github.com
ドメインに限定して TLS インスペクションを許可します。スコープを狭めるには、ターゲットを絞ったsessionMatcher
属性を追加します。sessionMatcher: host() == 'github.com'
- ルール 2 の優先度を高くします(優先度: 5)。その結果、ルール 1 の評価前にルール 2 が適用され、
制限事項
TLS 検査を構成する前に、次の制限事項を考慮する必要があります。
サーバーは、公開ルート証明書のみを使用して検証されます。ルート認証局(CA)セットは、Mozilla Root Program に基づいています。証明書の検証の動作は変更される可能性があり、ウェブブラウザが証明書を検証する方法に対応しています。
現時点ではバックエンドの検証が行えないため、非公開証明書または自己署名証明書を使用するサーバーへのトラフィックをインターセプトすることはできません。
Secure Web Proxy では、証明書失効リスト(CRL)のチェックは実行されません。
TLS インスペクションを機能させるには、クライアントは現在、Server Name Indication(SNI)を送信する必要があります。SNI は TLS 仕様の拡張機能で、省略可能ですが、ほとんどのクライアントではデフォルトで有効になっています。
クライアントが Encrypted Client Hello(ECH)(旧称: Encrypted SNI)を必要としている場合、TLS インスペクションは機能しません。
ECH は IETF ドラフト標準であり、事前に確立されたサーバーキーを使用して、クライアントが TLS handshake の開始を暗号化できるようにします。TLS インスペクションはインターセプト プロキシとして機能するため、事前に確立されたサーバーキーにアクセスできません。その結果、ECH は機能しません。
クライアントは、非公開ルート証明書を信頼するように構成する必要があります。
プライベート CA プールから CA を削除すると、その CA によって署名されたキャッシュに保存された証明書が最大 28 時間提供されます。キャッシュに保存された証明書を使用しないようにするには、新しい CA プールを参照するように TLS インスペクション ポリシーを更新します。その結果、Secure Web Proxy は新しい証明書を強制的に生成する必要があります。