認可ポリシーの正規化
このページでは、認可ポリシーでサポートされているすべての正規化について説明します。正規化されたリクエストは、認可ポリシーの評価と、最終的にバックエンドサーバーに送信されるリクエストの両方に使用されます。
詳細については、認可正規化のベストプラクティスを参照してください。
パス関連
これは、paths
フィールドとnotPaths
フィールドに適用されます。
1. 単一のパーセントエンコード文字(%HH)
Istioは、単一のパーセントエンコードされた文字を次のように正規化します(正規化は1回のみ実行され、二重デコードは行われません)。
パーセントエンコードされた文字(大文字と小文字を区別しない) | 正規化された結果 | 注 | 有効 |
---|---|---|---|
%00 | N/A | リクエストは常にHTTPコード400で拒否されます | N/A |
%2d | - | (ダッシュ) | 正規化オプションBASE でデフォルトで有効 |
%2e | . | (ドット) | 正規化オプションBASE でデフォルトで有効 |
%2f | / | (スラッシュ) | デフォルトでは無効、正規化オプションDECODE_AND_MERGE_SLASHES で有効にできます |
%30 - %39 | 0 - 9 | (数字) | 正規化オプションBASE でデフォルトで有効 |
%41 - %5a | A - Z | (大文字) | 正規化オプションBASE でデフォルトで有効 |
%5c | \ | (バックスラッシュ) | デフォルトでは無効、正規化オプションDECODE_AND_MERGE_SLASHES で有効にできます |
%5f | _ | (アンダースコア) | 正規化オプションBASE でデフォルトで有効 |
%61 - %7a | a - z | (小文字) | 正規化オプションBASE でデフォルトで有効 |
%7e | ~ | (チルダ) | 正規化オプションBASE でデフォルトで有効 |
例えば、パスが/some%2fdata/%61%62%63
のリクエストは/some/data/abc
に正規化されます。
2. バックスラッシュ(\
)
Istioはバックスラッシュ\
をフォワードスラッシュ/
に正規化します。例えば、パスが/some\data
のリクエストは/some/data
に正規化されます。
これは、正規化オプションBASE
でデフォルトで有効になっています。
3. 複数のスラッシュ(//
、///
など)
Istioは複数のフォワードスラッシュを単一のフォワードスラッシュ(/
)にマージします。例えば、パスが/some//data///abc
のリクエストは/some/data/abc
に正規化されます。
これはデフォルトでは無効になっていますが、正規化オプションMERGE_SLASHES
で有効にできます。有効にした場合、パスはパステンプレート演算子{**}
を含むパスと一致しない可能性があります。例えば、MERGE_SLASHES
を有効にすると、/some/data//abc
は/some/data/{**}/abc
と一致しなくなります。なぜなら、パスは/some/data/abc
に正規化されるからです。
4. 単一のドットと二重ドット(/./
、/../
)
Istioは、RFC 3986に従って、単一ドット/./
と二重ドット/../
を解決します。単一ドットは現在のディレクトリとして解決され、二重ドットは親ディレクトリとして解決されます。
例えば、/public/./data/abc/../xyz
は/public/data/xyz
に正規化されます。
これは、正規化オプションBASE
でデフォルトで有効になっています。
5. クエリ付きパス(/foo?v=1
)
Istioの認可ポリシーは、パスとの比較時にクエスチョンマーク(?
)以降のすべてを削除します。バックエンドアプリケーションは依然としてクエリを参照することに注意してください。
これはデフォルトで有効になっています。
メソッド関連
これは、methods
フィールドとnotMethods
フィールドに適用されます。
1. メソッドが大文字でない
HTTPリクエスト内の動詞が大文字でない場合、IstioはHTTP 400でリクエストを拒否します。
これはデフォルトで有効になっています。
ヘッダー名関連
これは、request.headers[<header-name>]
条件で指定されたヘッダー名に適用されます。
1. 大文字と小文字を区別しないマッチング
Istioの認可ポリシーは、ヘッダー名を大文字と小文字を区別しない方法で比較します。
これはデフォルトで有効になっています。
2. 重複ヘッダー
Istioは、重複するヘッダーをカンマを区切り文字としてすべての値を連結することにより、単一のヘッダーにマージします。
認可ポリシーは、マージされたヘッダーに対して単純な文字列マッチを行います。例えば、ヘッダーx-header: foo
とx-header: bar
を持つリクエストは、x-header: foo,bar
にマージされます。
これはデフォルトで有効になっています。
3. ヘッダー名の空白
ヘッダー名に空白が含まれている場合、IstioはHTTP 400でリクエストを拒否します。
これはデフォルトで有効になっています。