第5章 APIcast ポリシー
APIcast ポリシーは、APIcast の動作を変更する機能の単位です。ポリシーを有効、無効、および設定して、APIcast 動作の変更を制御することができます。ポリシーを使用して、デフォルトの APIcast デプロイメントでは利用することのできない機能を追加します。自分専用のポリシーを作成することや、Red Hat 3scale の提供する 標準ポリシー を使用することができます。
以下のトピックでは、標準 APIcast ポリシー、専用のカスタム APIcast ポリシーの作成、およびポリシーチェーンの作成について説明します。
ポリシーチェーンを使用して、サービスに対するポリシーを制御します。ポリシーチェーンの機能を以下に示します。
- APIcast が使用するポリシーを指定する
- 3scale が使用するポリシーの設定情報を提供する
- 3scale がポリシーを読み込む順番を指定する
Red Hat 3scale でカスタムポリシーを追加することは可能ですが、そのカスタムポリシーはサポートの対象ではありません。
カスタムポリシーを使用して APIIcast の動作を変更するには、以下の操作が必要です。
- カスタムポリシーを APIcast に追加する
- APIcast ポリシーを設定するポリシーチェーンを定義する
- ポリシーチェーンを APIcast に追加する
5.1. APIcast 標準ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Red Hat 3scale では、以下の標準ポリシーが利用可能です。
- 「3scale Auth Caching ポリシー」
- 「3scale Batcher ポリシー」
- 「Anonymous Access ポリシー」
- 「CORS Request Handling ポリシー」
- 「Echo ポリシー」
- 「Edge Limiting ポリシー」
- 「Header Modification ポリシー」
- 「Liquid Context Debug ポリシー」
- 「Logging ポリシー」
- 「Prometheus メトリクス」
- 「OAuth 2.0 Token Introspection ポリシー」
- 「Referrer ポリシー」
- 「RH-SSO/Keycloak Role Check ポリシー」
- 「SOAP ポリシー」
- 「Upstream ポリシー」
- 「URL Rewriting ポリシー」
- 「URL Rewriting with Captures ポリシー」
3scale API Management で標準ポリシーを 有効化および設定 することができます。
5.1.1. 3scale Auth Caching ポリシー リンクのコピーリンクがクリップボードにコピーされました!
3scale Auth Caching ポリシーは、APIcast に送信された認証呼び出しをキャシュします。動作モードを選択して、キャッシュ操作を設定することができます。
3scale Auth Caching では、以下のモードを使用することができます。
1.strict: 承認された呼び出しだけをキャッシュします。
「strict」モードでは、承認された呼び出しだけがキャッシュされます。ポリシーを「strict」モードで実行中に呼び出しが失敗または拒否されると、ポリシーはキャッシュエントリーを無効にします。バックエンドにアクセスできなくなると、キャッシュステータスにかかわらず、キャッシュされたすべての呼び出しが拒否されます。
2.resilient: バックエンドの機能が停止している場合には、最後のリクエストに基づいて承認します。
「resilient」モードでは、承認された呼び出しおよび拒否された呼び出しの両方がキャッシュされます。ポリシーを「resilient」モードで実行中は、呼び出しに失敗しても既存のキャッシュエントリーは無効になりません。バックエンドにアクセスできなくなると、キャッシュにヒットする呼び出しは、キャッシュステータスに応じて承認/拒否の状態を維持します。
3.allow: バックエンドの機能が停止している場合には、過去に拒否されていない限りすべてを許可します。
「allow」モードでは、承認された呼び出しおよび拒否された呼び出しの両方がキャッシュされます。ポリシーを「allow」モードで実行中は、キャッシュされた呼び出しはキャッシュステータスに応じて拒否/許可の状態を維持します。ただし、新規の呼び出しは承認された呼び出しとしてキャッシュされます。
「allow」モードで運用した場合には、セキュリティーの低下が懸念されます。これらの懸念に念頭に置き、注意した上で「allow」モードを使用してください。
4.none: キャッシュを無効にします。
「none」モードでは、キャッシュが無効になります。ポリシーを有効にしたままキャッシュの使用を止める場合に、このモードが役立ちます。
設定プロパティー
プロパティー | 説明 | 値 | 必須/任意 |
---|---|---|---|
caching_type |
| データタイプ: 列挙文字列 [resilient, strict, allow, none] | 必須 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.2. 3scale Batcher ポリシー リンクのコピーリンクがクリップボードにコピーされました!
標準の APIcast 承認メカニズムでは、APIcast が API リクエストを受け取るたびに、3scale バックエンド (Service Management API) に対して 1 回呼び出しが行われます。3scale Batcher ポリシーは、この標準メカニズムの代替手段を提供します。
3scale Batcher ポリシーを使用すると、3scale バックエンドへのリクエスト数が大幅に削減され、レイテンシーが減少しスループットが向上します。そのために、このポリシーは承認ステータスをキャッシュし、使用状況レポートをバッチ処理します。
3scale Batcher ポリシーが有効な場合には、APIcast は以下のフローを使用して承認を行います。
それぞれのリクエストにおいて、ポリシーはクレデンシャルがキャッシュされているかどうかを確認します。
- クレデンシャルがキャッシュされている場合には、ポリシーは 3scale バックエンドに呼び出しを行う代わりに、キャッシュされた承認ステータスを使用します。
- クレデンシャルがキャッシュされていない場合には、ポリシーはバックエンドに呼び出しを行い、残存期間 (TTL) を設定して承認ステータスをキャッシュします。
- リクエストに対応する使用状況を直ちに 3scale バックエンドに報告する代わりに、ポリシーは使用状況のカウンターを累積して、バックエンドにバッチで報告します。累積した使用状況のカウンターは、独立したスレッドにより 1 回の呼び出しで 3scale バックエンドに報告されます (報告の頻度は設定が可能です)。
3scale Batcher ポリシーではスループットが向上しますが、精度は低下します。使用上限および現在の使用状況は 3scale に保存され、APIcast は 3scale バックエンドに呼び出しを行う時にのみ正しい承認ステータスを取得することができます。3scale Batcher ポリシーが有効な場合には、APIcast が 3scale に呼び出しを送信しない期間があります。この期間中、呼び出しを行うアプリケーションが定義された限度を超える可能性があります。
流量制御の精度よりもスループットが重要な場合には、高負荷の API に対してこのポリシーを使用します。報告頻度および承認の TTL が流量制御の期間よりはるかに短い場合には、3scale Batcher ポリシーにより優れた精度が得られます。たとえば、流量制御が 1 日あたりで、報告頻度および承認の TTL が数分に設定されている場合などです。
3scale Batcher ポリシーでは、以下の構成設定がサポートされます。
auths_ttl
: 承認キャッシュの有効期限が切れる TTL を秒単位で設定します。現在の呼び出しの承認がキャッシュされている場合には、APIcast はキャッシュされた値を使用します。
auths_ttl
パラメーターで設定した時間が経過すると、APIcast はキャッシュを削除し、3scale バックエンドに呼び出しを行い承認のステータスを取得します。-
batch_report_seconds
: APIcast が 3scale バックエンドにバッチレポートを送信する頻度を設定します。デフォルト値は10
秒です。
このポリシーを使用するには、ポリシーチェーンで 3scale APIcast
および 3scale Batcher
ポリシーの両方を有効にします。
5.1.3. Anonymous Access ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Anonymous Access ポリシーでは、認証をせずにサービスが公開されます。このポリシーは、認証パラメーターを送信するように変更することのできないレガシーアプリケーション等の場合に有用です。Anonymous ポリシーは、API キーおよびアプリケーション ID/アプリケーションキーによる認証オプションを使用するサービスしかサポートしません。クレデンシャルをまったく持たない API リクエストに対してこのポリシーを有効にした場合には、APIcast はポリシーで設定されたデフォルトのクレデンシャルを使用して呼び出しを承認します。API の呼び出しが承認されるためには、クレデンシャルが設定されたアプリケーションが存在しアクティブでなければなりません。
アプリケーションプランを使用して、デフォルトのクレデンシャルに使用されるアプリケーションに流量制御を設定することができます。
APIcast ポリシーおよび Anonymous Access ポリシーをポリシーチェーンで併用する場合には、APIcast ポリシーの前に Anonymous Access ポリシーを設定する必要があります。
ポリシーに必要な設定プロパティーを以下に示します。
auth_type: 以下に示す選択肢のいずれかの値を選択し、プロパティーが API に設定された認証オプションに対応している状態にします。
- app_id_and_app_key: アプリケーション ID/アプリケーションキーによる認証オプション用
- user_key: API キーによる認証オプション用
- app_id (app_id_and_app_key 認証タイプにのみ有効): API の呼び出しにクレデンシャルが提供されていない場合に、承認に使用するアプリケーションのアプリケーション ID。
- app_key (app_id_and_app_key 認証タイプにのみ有効): API の呼び出しにクレデンシャルが提供されていない場合に、承認に使用するアプリケーションのアプリケーションキー。
- user_key (user_key 認証タイプにのみ有効): API の呼び出しにクレデンシャルが提供されていない場合に、承認に使用するアプリケーションの API キー。
図5.1 Anonymous Access ポリシー
5.1.4. CORS Request Handling ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Cross Origin Resource Sharing (CORS) request handling ポリシーを使用すると、以下の項目を指定することができるので CORS の動作の制御が可能です。
- 許可されるヘッダー
- 許可されるメソッド
- Allow credentials
- 許可されるオリジンヘッダー
CORS Request Handling ポリシーにより、指定されていない CORS リクエストはすべてブロックされます。
APIcast ポリシーおよび CORS Request Handling ポリシーをポリシーチェーンで併用する場合には、APIcast ポリシーの前に CORS Request Handling ポリシーを設定する必要があります。
設定プロパティー
プロパティー | 説明 | 値 | 必須/任意 |
---|---|---|---|
allow_headers |
| データタイプ: 文字列の配列 (CORS ヘッダーでなければなりません) | 任意 |
allow_methods |
| データタイプ: 列挙文字列の配列 [GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, CONNECT] | 任意 |
allow_origin |
| データタイプ: 文字列 | 任意 |
allow_credentials |
| データタイプ: ブール値 | 任意 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.5. Echo ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Echo ポリシーは、受信したリクエストを出力してクライアントに返します。また、オプションで任意の HTTP ステータスコードを返します。
構成プロパティー
プロパティー | 説明 | 値 | 必須/任意 |
---|---|---|---|
status | Echo ポリシーがクライアントに返す HTTP ステータスコード | データタイプ: 整数 | 任意 |
exit |
Echo ポリシーが使用する終了モードを指定します。 | データタイプ: 列挙文字列 [request, set] | 必須 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.6. Edge Limiting ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Edge Limiting ポリシーの目的は、バックエンド API に送信されるトラフィックに対する柔軟な流量制御を提供することで、このポリシーをデフォルトの 3scale 承認メカニズムと共に使用することができます。このポリシーでサポートされるユースケースの例を以下に示します。
-
エンドユーザーの流量制御: リクエストの認証ヘッダーで渡される JWT トークンの「sub」(subject) クレームの値による流量制御 (
{{ jwt.sub }}
として設定します)。 - 1 秒あたりのリクエスト数 (RPS) 流量制御
- サービスごとのグローバル流量制御: アプリケーションごとではなく、サービスごとに流量制御を適用します。
- 同時接続上限: 許容される同時接続の数を設定します。
5.1.6.1. 制限のタイプ リンクのコピーリンクがクリップボードにコピーされました!
このポリシーでは、lua-resty-limit-traffic ライブラリーにより提供される以下の制限タイプがサポートされます。
-
leaky_bucket_limiters
: 平均リクエスト数および最大バーストサイズをベースにした「leaky_bucket」アルゴリズムに基づきます。 -
fixed_window_limiters
: 特定の期間 (最後の X 秒) に基づきます。 -
connection_limiters
: 同時接続の数に基づきます。
すべての制限をサービスごとまたはグローバルに適用することができます。
5.1.6.2. 制限の定義 リンクのコピーリンクがクリップボードにコピーされました!
リミッターはキーを持ち、このキーで制限を定義するのに使用するエンティティーをエンコードします (IP、サービス、エンドポイント、ID、特定ヘッダーの値など)。キーは、リミッターの key
パラメーターで指定します。
key
は以下のプロパティーで定義されるオブジェクトです。
-
name
: キーの名前です。スコープ内で一意でなければなりません。 scope
: キーのスコープを定義します。サポートされるスコープは以下のとおりです。-
service
: 1 つのサービスに影響を及ぼすサービスごとのスコープ -
global
: すべてのサービスに影響を及ぼすグローバルスコープ
-
name_type
:「name」の値がどのように評価されるかを定義します。-
plain
: プレーンテキストとして評価される。 -
liquid
: Liquid として評価される。
-
それぞれの制限には、そのタイプに応じたパラメーターもあります。
leaky_bucket_limiters
:rate
およびburst
-
rate
: 遅延を生じることなく実行できる 1 秒あたりのリクエスト数を定義します。 -
burst
: 許容レートを超えることのできる 1 秒あたりのリクエスト数を定義します。許容レート (rate
で指定される) を超えるリクエストには、人為的な遅延が適用されます。1 秒あたりのリクエスト数がburst
で定義されるレートを超えると、リクエストは拒否されます。
-
-
fixed_window_limiters
:count
、window
。count
は、window
で定義される秒数あたりに実行できるリクエスト数を定義します。 connection_limiters
:conn
、burst
、およびdelay
-
conn
: 許容される同時接続の最大数を定義します。burst
で定義される 1 秒あたりの接続数までこの値を超えることができます。 -
delay
: 制限を超える接続を遅延させる秒数です。
-
例
service_A に対するリクエストを毎分 10 回許可します。
{ "key": { "name": "service_A" }, "count": 10, "window": 60 }
{ "key": { "name": "service_A" }, "count": 10, "window": 60 }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow burst および delay をそれぞれ 10 および 1 に設定して、100 の接続を許可します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
サービスごとにさまざまな制限を定義することができます。複数の制限を定義した場合には、少なくとも 1 つの制限に達すると、リクエストは拒否または遅延されます。
5.1.6.3. Liquid テンプレート リンクのコピーリンクがクリップボードにコピーされました!
Edge Limiting ポリシーではキーに Liquid 変数がサポートされるので、動的なキーに制限を指定することができます。そのためには、キーの name_type
パラメーターを「liquid」に設定する必要があります。これにより、name
パラメーターに Liquid パラメーターを使用することができます。例: クライアント IP アドレスの場合は {{ remote_addr }}
、JWT トークンの「sub」クレームの場合は {{ jwt.sub }}
。
以下に例を示します。
{ "key": { "name": "{{ jwt.sub }}", "name_type": "liquid" }, "count": 10, "window": 60 }
{
"key": { "name": "{{ jwt.sub }}", "name_type": "liquid" },
"count": 10,
"window": 60
}
Liquid のサポートに関する詳細な情報は、「ポリシーでの変数およびフィルターの使用」を参照してください。
5.1.6.4. 条件の適用 リンクのコピーリンクがクリップボードにコピーされました!
条件は、API ゲートウェイがリミッターをいつ適用するかを定義します。各リミッターの condition
プロパティーで少なくとも 1 つの操作を指定する必要があります。
以下のプロパティーで condition
を定義します。
-
combine_op
。演算のリストに適用されるブール演算子です。or
およびand
の 2 つの値がサポートされます。 operations
。評価する必要がある条件のリストです。各演算は、以下のプロパティーを持つオブジェクトにより表されます。-
left
: 演算の左側部分 -
left_type
:left
プロパティーがどのように評価されるか (plain または liquid)。 -
right
: 演算の右側部分 -
right_type
:right
プロパティーがどのように評価されるか (plain または liquid)。 -
op
: 左右の部分の間に適用される演算子。==
(等しい) および!=
(等しくない) の 2 つの値がサポートされます。
-
以下に例を示します。
5.1.6.5. ストアの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Edge Limiting ポリシーは流量制御カウンターに OpenResty 共有ディクショナリーを使用します。ただし、共有ディクショナリーの代わりに外部の Redis サーバーを使用することができます。この設定は、複数の APIcast インスタンスが使用されている場合に役立ちます。Redis サーバーは、redis_url
パラメーターを使用して設定することができます。
5.1.6.6. エラー処理 リンクのコピーリンクがクリップボードにコピーされました!
リミッターでは、エラーの処理方法を設定するために以下のパラメーターがサポートされます。
limits_exceeded_error
: 設定した上限を超えた際にクライアントに返されるエラーステータスコードおよびメッセージを設定することができます。以下のパラメーターを設定する必要があります。-
status_code
: 上限を超えた際のリクエストのステータスコード。デフォルトは429
です。 error_handling
: エラーの処理方法。-
exit
: エラーで応答します。 -
log
: リクエストを通過させ、ログのみを出力します。
-
-
configuration_error
: 設定が正しくない場合にクライアントに返されるエラーステータスコードおよびメッセージを設定することができます。以下のパラメーターを設定する必要があります。-
status_code
: 設定に問題がある場合のステータスコード。デフォルトは 500 です。 error_handling
: エラーの処理方法。-
exit
: エラーで応答します。 -
log
: リクエストを通過させ、ログのみを出力します。
-
-
5.1.7. Header Modification ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Header Modification ポリシーを使用すると、受信したリクエストまたはレスポンスに関して、既存のヘッダーを変更する、補足のヘッダーを定義して追加する、またはヘッダーを削除することができます。レスポンスヘッダーおよびリクエストヘッダーの両方を変更することができます。
Header Modification ポリシーでは、以下の設定パラメーターがサポートされます。
-
request
: リクエストヘッダーに適用する操作のリスト -
response
: レスポンスヘッダーに適用する操作のリスト
それぞれの操作は、以下のパラメーターで構成されます。
-
op
: 適用する操作を指定します。add
操作は既存のヘッダーに値を追加します。set
操作はヘッダーおよび値を作成し、既存のヘッダーの値が既に存在する場合はその値を上書きします。push
操作はヘッダーおよび値を作成しますが、既存のヘッダーの値が既に存在していてもその値を上書きしません。その代わりに、push
は既存のヘッダーに値を追加します。delete
操作はヘッダーを削除します。 -
header
: 作成または変更するヘッダーを指定します。ヘッダー名には任意の文字列を使用することができます (例:Custom-Header
)。 -
value_type
: ヘッダーの値がどのように評価されるかを定義します。プレーンテキストの場合のplain
または Liquid テンプレートとして評価する場合のliquid
いずれかに設定します。詳細は、「「ポリシーでの変数およびフィルターの使用」」を参照してください。 -
value
: ヘッダーに使用される値を指定します。値のタイプが「liquid」の場合には、値は{{ variable_from_context }}
の形式にする必要があります。削除する場合には不要です。
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.8. IP Check ポリシー リンクのコピーリンクがクリップボードにコピーされました!
IP Check ポリシーは、IP のリストに基づいてリクエストを拒否または許可するために使用します。
構成プロパティー
プロパティー | 説明 | データタイプ | 必須/任意 |
---|---|---|---|
check_type |
|
文字列 ( | 必須 |
ips |
| 文字列の配列 (有効な IP アドレスでなければなりません) | 必須 |
error_msg |
| 文字列 | 任意 |
client_ip_sources |
|
文字列の配列。有効なオプションは、 | 任意 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.9. Liquid Context Debug ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Liquid Context Debug ポリシーの想定は、開発環境でのデバッグ用途のみで、実稼働環境での使用は意図されていません。
このポリシーは JSON を使用して API リクエストに応答します。コンテキストで利用可能なオブジェクトおよび値を含み、Liquid テンプレートの評価に使用することができます。3scale APIcast または Upstream ポリシーと組み合わせる場合には、正常な動作のためにポリシーチェーンではこれらのポリシーの前に Liquid Context Debug ポリシーを設定する必要があります。循環参照を避けるために、ポリシーには重複するオブジェクトは 1 回だけ含め、それをスタブ値で置き換えます。
このポリシーが有効な時に APIcast が返す値の例を以下に示します。
5.1.10. Logging ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Logging ポリシーにより、各 API サービスの APIcast (NGINX) アクセスログを個別に有効または無効にすることができます。デフォルトでは、このポリシーはポリシーチェーンで有効になっていません。
このポリシーは、enable_access_logs
設定パラメーターしかサポートしません。サービスのアクセスロギングを無効にするには、ポリシーを有効にし、enable_access_logs
パラメーターの選択を解除して、Submit
ボタンをクリックします。アクセスログを有効にするには、enable_access_logs
パラメーターを選択するか、Logging ポリシーを無効にします。
Logging ポリシーとアクセスログの場所のグローバル設定を組み合わせることができます。APIcast アクセスログの場所を設定するには、APICAST_ACCESS_LOG_FILE
環境変数を設定します。デフォルトでは、この変数は標準出力デバイスの /dev/stdout
に設定されています。グローバル APIcast パラメーターに関する詳細な情報は、「7章APIcast の環境変数」を参照してください。
5.1.11. OAuth 2.0 Token Introspection ポリシー リンクのコピーリンクがクリップボードにコピーされました!
OAuth 2.0 Token Introspection ポリシーを使用すると、OpenID Connect 認証オプションを用いるサービスに使用される JSON Web Token (JWT) トークンを検証することができます。この場合、トークン発行者 (Red Hat Single Sign-On) のトークンイントロスペクションエンドポイントを使用します。
トークンイントロスペクションエンドポイントおよびそのエンドポイントに呼び出しを行う際に APIcast が使用するクレデンシャルを定義する場合、auth_type
フィールドでは以下の認証タイプがサポートされます。
use_3scale_oidc_issuer_endpoint
この設定では、APIcast はクライアント資格情報 (クライアント ID とクライアントシークレット) と、サービス統合ページで設定された OpenID Connect 発行者設定からのトークンイントロスペクションエンドポイントを使用します。
APIcast は、OpenID Connect 発行者の
.well-known/openid-configuration
エンドポイントが返すtoken_introspection_endpoint
フィールドからトークンイントロスペクションエンドポイントを検出します。例5.1
use_3scale_oidc_issuer_endpoint
に設定された認証タイプ以下は、認証タイプが
use_3scale_oidc_issuer_endpoint
に設定されている場合の設定例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow client_id+client_secret
このオプションでは、APIcast がトークン情報を要求するのに使用するクライアント ID およびクライアントシークレットと共に、異なるトークンイントロスペクションエンドポイントを指定することができます。
このオプションを使用する場合には、以下の設定パラメーターを定義します。
-
client_id
: トークンイントロスペクションエンドポイント用のクライアント ID を設定します。 -
client_secret
: トークンイントロスペクションエンドポイント用のクライアントシークレットを設定します。 introspection_url
: イントロスペクションエンドポイントの URL を設定します。例5.2
client_id+client_secret
に設定された認証タイプ以下は、認証タイプが
client_id+client_secret
に設定されている場合の設定例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
auth_type
フィールドの設定にかかわらず、APIcast は Basic 認証を使用してトークンイントロスペクションの呼び出しを承認します (Authorization: Basic <token>
ヘッダー、ここで <token> は Base64 でエンコードされた <client_id>:<client_secret> 設定です)。
トークンイントロスペクションエンドポイントのレスポンスには、active
属性が含まれます。APIcast はこの属性の値を確認します。属性の値に応じて、APIcast は呼び出しを承認または拒否します。
-
true
: 呼び出しを承認します -
false
:Authentication Failed
エラーと共に呼び出しを拒否します
このポリシーを使用すると、トークンのキャッシュを有効にして、同じ JWT トークンに対する呼び出しのたびにトークンイントロスペクションエンドポイントに呼び出しを行うのを避けることができます。Token Introspection ポリシーのトークンキャッシュを有効にするには、max_cached_tokens
フィールドを 0
(機能は無効) から 10000
までの値に設定します。さらに、max_ttl_tokens
フィールドで、トークンの残存期間 (TTL) の値を 1
から 3600
秒に設定することができます。
5.1.12. Referrer ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Referrer ポリシーを使用すると、参照元フィルター機能が有効になります。サービスポリシーチェーンでこのポリシーが有効な場合には、APIcast は今後のリクエストの Referer
ポリシーの値を referrer
パラメーターで Service Management API (AuthRep 呼び出し) に送信します。参照元フィルター機能の仕組みの詳細については、Authentication Patterns の Referrer Filtering セクションを参照してください。
5.1.13. RH-SSO/Keycloak Role Check ポリシー リンクのコピーリンクがクリップボードにコピーされました!
OpenID Connect 認証オプションと共に使用した場合、このポリシーによりロールの確認機能が追加されます。このポリシーは、Red Hat Single Sign-On により発行されたアクセストークンのレルムロールおよびクライアントロールを確認します。すべてのクライアントのリソースまたは 3Scale にロールチェックを追加する場合は、レルムロールを指定します。
ポリシー設定の type プロパティーで指定するロールの確認には、以下の 2 つのタイプがあります。
- whitelist (デフォルト): whitelist が使用されると、APIcast は指定したスコープが JWT トークンに含まれるかどうかを確認し、JWT にそのスコープがなければ呼び出しを拒否します。
- blacklist: blacklist が使用された場合には、JWT トークンにブラックリスト登録したスコープが含まれていれば APIcast は呼び出しを拒否します。
同じポリシーに blacklist および whitelist 両方のチェックを設定することはできませんが、APIcast ポリシーチェーンに複数の RH-SSO/Keycloak Role Check ポリシーインスタンスを追加することができます。
ポリシー設定の scopes プロパティーを使用して、スコープのリストを設定することができます。
それぞれの scope オブジェクトには、以下のプロパティーがあります。
- resource: ロールによって制御されるリソース (エンドポイント)。これは、マッピングルールと同じフォーマットです。文字列の先頭からパターンの照合を行います。完全一致の場合には、最後に $ を追加する必要があります。
resource_type: このプロパティーで、resource の値がどのように評価されるかを定義します。
- プレーンテキストとして (plain): resource の値をプレーンテキストとして評価します。たとえば /api/v1/products$。
- Liquid テキストとして (liquid): resource の値に Liquid を使用することを許可します。例: /resource_{{ jwt.aud }} は、クライアント ID (JWT aud クレームに含まれる) を含むリソースへのアクセスを管理します。
realm_roles: レルムロールを確認する場合に使用します (Red Hat Single Sign-On のレルムロール に関するドキュメントを参照してください)。
レルムロールは、Red Hat Single Sign-On により発行された JWT にあります。
"realm_access": { "roles": [ "<realm_role_A>", "<realm_role_B>" ] }
"realm_access": { "roles": [ "<realm_role_A>", "<realm_role_B>" ] }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 実際のロールは、ポリシーで指定する必要があります。
"realm_roles": [ { "name": "<realm_role_A>" }, { "name": "<realm_role_B>" } ]
"realm_roles": [ { "name": "<realm_role_A>" }, { "name": "<realm_role_B>" } ]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow realm_roles 配列の各オブジェクトでは、以下のプロパティーを使用することができます。
- name: ロールの名前を指定します。
- name_type: plain または liquid のどちらかを指定して、name がどのように評価されるかを定義します (resource_type の場合と同じように機能します)。
client_roles: クライアント namespace に特定のアクセスロールがあるかどうかを確認する場合に、client_roles を使用します (Red Hat Single Sign-On のクライアントロール に関するドキュメントを参照してください)。
クライアントロールは、JWT の resource_access クレームのセクションにあります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーでクライアントロールを指定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow client_roles 配列の各オブジェクトでは、以下のプロパティーを使用することができます。
- name: ロールの名前を指定します。
- name_type: plain または liquid のどちらかを指定して、name の値がどのように評価されるかを定義します (resource_type の場合と同じように機能します)。
- client: ロールのクライアントを指定します。定義しなければ、このポリシーはクライアントに aud クレームを使用します。
- client_type: plain または liquid のどちらかを指定して、client の値がどのように評価されるかを定義します (resource_type の場合と同じように機能します)。
5.1.14. Prometheus メトリクス リンクのコピーリンクがクリップボードにコピーされました!
Prometheus はスタンドアロンのオープンソースのシステムモニタリングおよびアラート用ツールキットです。
Red Hat 3scale の本リリースでは、Prometheus のインストールおよび設定はサポートされていません。オプションとして、コミュニティーバージョンの Prometheus を使用して、APIcast 管理下の API サービスのメトリクスおよびアラートを視覚化することができます。
Prometheus メトリクスの可用性
APIcast と Prometheus のインテグレーションは、以下のデプロイメントオプションで利用することができます。
- Self-managed APIcast (ホスト型 API Management およびオンプレミス型 API Management 両方との組み合わせに対応)
- Embedded APIcast (オンプレミス型 API Management)
APIcast と Prometheus のインテグレーションは、ホスト型 API Management と Hosted APIcast の組み合わせでは利用することができません。
Prometheus メトリクスのリスト
以下のメトリクスは常に使用可能です。
メトリクス | 説明 | タイプ | ラベル |
---|---|---|---|
nginx_http_connections | HTTP 接続の数 | ゲージ | state (accepted、active、handled、reading、total、waiting、writing) |
nginx_error_log | APIcast エラー | カウンター | level (debug、info、notice、warn、error、crit、alert、emerg) |
openresty_shdict_capacity | ワーカー間で共有されるディクショナリーの容量 | ゲージ | dict (すべてのディクショナリーで共通) |
openresty_shdict_free_space | ワーカー間で共有されるディクショナリーの空き容量 | ゲージ | dict (すべてのディクショナリーで共通) |
nginx_metric_errors_total | メトリクスを管理する Lua ライブラリーのエラーの数 | カウンター | - |
total_response_time_seconds | クライアントにレスポンスを送信するのに必要な時間 (秒単位) | ヒストグラム | - |
upstream_response_time_seconds | アップストリームサーバーからの応答時間 (秒単位) | ヒストグラム | - |
upstream_status | アップストリームサーバーからの HTTP ステータス | counter | status |
threescale_backend_calls | 3scale バックエンド (Apisonator) に対する承認および報告リクエスト | カウンター | エンドポイント (authrep、auth、report)、ステータス (2xx、4xx、5xx) |
以下のメトリクスは、3scale Batcher ポリシーを使用する場合にのみ使用可能です。
メトリクス | 説明 | タイプ | ラベル |
---|---|---|---|
batching_policy_auths_cache_hits | 3scale Batcher ポリシーの承認キャッシュのヒット数 | カウンター | - |
batching_policy_auths_cache_misses | 3scale Batcher ポリシーの承認キャッシュのミス数 | カウンター | - |
値を持たないメトリクス
メトリクスが値を持たない場合には、メトリクスは非表示になります。たとえば、nginx_error_log
に報告するエラーがない場合、nginx_error_log
メトリックは表示されません。値を持った場合にのみ表示されます。
5.1.15. SOAP ポリシー リンクのコピーリンクがクリップボードにコピーされました!
SOAP ポリシーでは、ポリシーで指定したマッピングルールを使用して、HTTP リクエストの SOAPAction または Content-Type ヘッダーにより提供される SOAP アクション URI との照合を行います。
設定プロパティー
プロパティー | 説明 | 値 | 必須/任意 |
---|---|---|---|
pattern |
| データタイプ: 文字列 | 必須 |
metric_system_name |
| データタイプ: 文字列 (有効な メトリクス でなければなりません) | 必須 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.16. Upstream ポリシー リンクのコピーリンクがクリップボードにコピーされました!
Upstream ポリシーでは、正規表現を使用して Host リクエストヘッダーを解析し、プライベートベース URL で定義されたアップストリーム URL を別の URL に置き換えることができます。
例:
正規表現 /foo
および URL フィールド newexample.com
が設定されたポリシーが、URL https://www.example.com/foo/123/
を newexample.com
に置き換える
ポリシーチェーンの参照
プロパティー | 説明 | 値 | 必須/任意 |
---|---|---|---|
regex |
| データタイプ: 文字列 (有効な正規表現の構文でなければなりません) | 必須 |
url |
| データタイプ: 文字列 (有効な URL でなければなりません) | 必須 |
ポリシーオブジェクトの例
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.17. URL Rewriting ポリシー リンクのコピーリンクがクリップボードにコピーされました!
URL Rewriting ポリシーを使用すると、リクエストのパスおよびクエリー文字列を変更することができます。
3scale APIcast ポリシーと組み合わせる場合には、ポリシーチェーンで URL Rewriting ポリシーを 3scale APIcast ポリシーの前に設定すると、APIcast のマッピングルールは変更したパスに適用されます。ポリシーチェーンで URL Rewriting ポリシーを APIcast ポリシーの後に設定すると、マッピングルールは元のパスに適用されます。
このポリシーでは、以下の 2 つの操作セットがサポートされます。
-
commands
: リクエストのパスを書き換えるために適用されるコマンドのリスト。 -
query_args_commands
: リクエストのクエリー文字列を書き換えるために適用されるコマンドのリスト。
5.1.17.1. パスを書き換えるためのコマンド リンクのコピーリンクがクリップボードにコピーされました!
commands
リストの各コマンドは、以下の設定パラメーターで構成されます。
-
op
: 適用される操作。設定可能なオプションはsub
およびgsub
です。sub
操作では、指定した正規表現との最初のマッチだけが置き換えられます。gsub
操作では、指定した正規表現とのマッチがすべて置き換えられます。sub および gsub 操作に関するドキュメントを参照してください。 -
regex
: 照合される Perl 互換の正規表現 -
replace
: マッチした際に置き換えられる文字列 -
options
(オプション): 正規表現との照合がどのように行われるかを定義するオプション。設定可能なオプションに関する情報は、OpenResty Lua モジュールプロジェクトのドキュメントの「ngx.re.match」セクションを参照してください。 -
break
(オプション): true に設定すると (チェックボックスを選択する)、コマンドが URL を書き換えた場合、それが適用される最後のコマンドになります (リスト内の後続コマンドはすべて破棄されます)。
5.1.17.2. クエリー文字列を書き換えるためのコマンド リンクのコピーリンクがクリップボードにコピーされました!
query_args_commands
リストの各コマンドは、以下の設定パラメーターで構成されます。
op
: クエリー引数に適用される操作。以下のオプションを設定することができます。-
add
: 既存の引数に値を追加します。 -
set
: 引数が設定されていなければ作成し、設定されていればその値を置き換えます。 -
push
: 引数が設定されていなければ作成し、設定されていれば値を追加します。 -
delete
: 引数を削除します。
-
-
arg
: 操作が適用されるクエリー引数の名前 -
value
: クエリー引数に使用される値を指定します。値のタイプが「liquid」の場合には、値は{{ variable_from_context }}
の形式にする必要があります。delete
操作の場合には、値を考慮する必要はありません。 -
value_type
(オプション): クエリー引数の値がどのように評価されるかを定義します。プレーンテキストの場合のplain
または Liquid テンプレートとして評価する場合のliquid
いずれかに設定します。詳細は、「「ポリシーでの変数およびフィルターの使用」」を参照してください。指定しなければ、デフォルトではタイプ「plain」が使用されます。
例
URL Rewriting ポリシーは、以下のように設定します。
APIcast に送信される元のリクエスト URI:
https://api.example.com/api/v1/products/123/details?user_key=abc123secret&pusharg=first&setarg=original
https://api.example.com/api/v1/products/123/details?user_key=abc123secret&pusharg=first&setarg=original
URL の書き換えを適用した後に APIcast が API バックエンドに送信する URI:
https://api-backend.example.com/internal/products/123/details?pusharg=first&pusharg=pushvalue&setarg=setvalue
https://api-backend.example.com/internal/products/123/details?pusharg=first&pusharg=pushvalue&setarg=setvalue
以下の変換が適用されます。
-
サブストリング
/api/v1/
はパス書き換えコマンドだけにマッチし、/internal/
に置き換えられます。 -
user_key
クエリー引数は削除されます。 -
値
pushvalue
は追加の値としてpusharg
クエリー引数に追加されます。 -
クエリー引数
setarg
の値original
は、設定した値setvalue
に置き換えられます。 -
クエリー引数
addarg
は元の URL に存在しないため、コマンドadd
は適用されませんでした。
ポリシーの設定方法に関する情報は、本書の「3scale でのポリシーチェーンの作成」セクションを参照してください。
5.1.18. URL Rewriting with Captures ポリシー リンクのコピーリンクがクリップボードにコピーされました!
URL Rewriting with Captures ポリシーは「URL Rewriting ポリシー」ポリシーの代替で、API リクエストの URL を API バックエンドに渡す前に書き換えることができます。
URL Rewriting with Captures ポリシーは URL の引数を取得し、その値を書き換えられる URL で使用します。
このポリシーでは transformations
設定パラメーターがサポートされます。これは、リクエスト URL に適用される変換を定義するオブジェクトのリストです。それぞれの変換オブジェクトは、以下の 2 つのプロパティーで構成されます。
-
match_rule
: このルールは受信したリクエストの URL と照合されます。このルールには{nameOfArgument}
形式の名前付き引数を含めることができ、これらの引数を書き換えられる URL で使用することができます。URL は正規表現としてmatch_rule
と比較されます。名前付き引数と照合する値には、[\w-.~%!$&'()*,;=@:]
の文字しか使用することができません (PCRE 正規表現表記)。他の正規表現トークンをmatch_rule
の表記で使用することができます。たとえば、文字列先頭の^
および文字列末尾の$
等です。 -
template
: URL のテンプレートで、これにより元の URL が書き換えられます。match_rule
からの名前付き引数を使用することができます。
元の URL のクエリーパラメータは、template
で指定したクエリーパラメータとマージされます。
例
URL Rewriting with Captures ポリシーは、以下のように設定します。
APIcast に送信される元のリクエスト URI:
https://api.example.com/api/v1/products/123/details?user_key=abc123secret
https://api.example.com/api/v1/products/123/details?user_key=abc123secret
URL の書き換えを適用した後に APIcast が API バックエンドに送信する URI:
https://api-backend.example.com/internal/products/details?user_key=abc123secret&extraparam=anyvalue&id=123
https://api-backend.example.com/internal/products/details?user_key=abc123secret&extraparam=anyvalue&id=123