第9章 ポリシーエンフォーサー
Policy Enforcement Point (PEP: Policy Enforcement Point) は、異なる方法で実装できる設計パターンです。Red Hat Single Sign-On は、さまざまなプラットフォーム、環境、およびプログラミング言語に PEP を実装するのに必要な方法をすべて提供します。Red Hat Single Sign-On の認可サービスは RESTful API を提供し、一元化された認可サーバーを使用して詳細な認可に OAuth2 認可機能を活用します。
PEP は、保護されているリソースに関連付けられたポリシーを評価して、Red Hat Single Sign-On サーバーからアクセス決定を強制します。これは、保護されたリソースへの特定の要求を満たすかどうかをチェックするためにアプリケーションのフィルターやインターセプターとして機能します。この決定によって付与されるパーミッションに基づいて、保護されるリソースへの特定のリクエストを満たすことができるかどうかを確認します。
パーミッションは、使用しているプロトコルによって異なります。UMA を使用する場合、ポリシーエンフォーサーは、要求を提供できるかどうかを決定するために RPT をベアラートークンとして常に予想します。つまり、クライアントはまず Red Hat Single Sign-On から RPT を取得してからリソースサーバーに送信する必要があります。
ただし、UMA を使用していない場合は、通常のアクセストークンをリソースサーバーに送信することもできます。この場合、ポリシーエンフォーサーはサーバーから直接パーミッションの取得を試みます。
Red Hat Single Sign-On OIDC アダプターのいずれかを使用している場合は、keycloak.json ファイルに以下のプロパティーを追加して、ポリシーの強制機能を簡単に有効にできます。
keycloak.json
{ "policy-enforcer": {} }
{
"policy-enforcer": {}
}
ポリシーを有効にすると、アプリケーションに送信されたリクエストはすべてインターセプトされ、Red Hat Single Sign-On が要求するアイデンティティーに付与されるパーミッションに応じて、保護されるリソースへのアクセスが付与されます。
ポリシー強制は、Red Hat Single Sign-On 管理コンソールを使用して、リソースサーバーに作成したアプリケーションのパスおよび リソース に強くリンクします。デフォルトでは、リソースサーバーを作成すると、Red Hat Single Sign-On はリソースサーバーの デフォルト設定 を作成し、ポリシーの強制を迅速に有効にできるようにします。
9.1. 設定
アプリケーションのポリシーの強制を有効にするには、以下のプロパティーを keycloak.json ファイルに追加します。
keycloak.json
{ "policy-enforcer": {} }
{
"policy-enforcer": {}
}
または、保護されているリソースを手動で定義したい場合は、詳細を若干詳細します。
{ "policy-enforcer": { "user-managed-access" : {}, "enforcement-mode" : "ENFORCING", "paths": [ { "path" : "/someUri/*", "methods" : [ { "method": "GET", "scopes" : ["urn:app.com:scopes:view"] }, { "method": "POST", "scopes" : ["urn:app.com:scopes:create"] } ] }, { "name" : "Some Resource", "path" : "/usingPattern/{id}", "methods" : [ { "method": "DELETE", "scopes" : ["urn:app.com:scopes:delete"] } ] }, { "path" : "/exactMatch" }, { "name" : "Admin Resources", "path" : "/usingWildCards/*" } ] } }
{
"policy-enforcer": {
"user-managed-access" : {},
"enforcement-mode" : "ENFORCING",
"paths": [
{
"path" : "/someUri/*",
"methods" : [
{
"method": "GET",
"scopes" : ["urn:app.com:scopes:view"]
},
{
"method": "POST",
"scopes" : ["urn:app.com:scopes:create"]
}
]
},
{
"name" : "Some Resource",
"path" : "/usingPattern/{id}",
"methods" : [
{
"method": "DELETE",
"scopes" : ["urn:app.com:scopes:delete"]
}
]
},
{
"path" : "/exactMatch"
},
{
"name" : "Admin Resources",
"path" : "/usingWildCards/*"
}
]
}
}
各設定オプションの説明は次のとおりです。
policy-enforcer
ポリシーを実際に実施する方法、およびオプションで保護するパスを定義する設定オプションを指定します。指定しなかった場合には、ポリシーエンフォーサーは、保護されているリソースサーバーに関連するすべてのリソースに対してサーバーをクエリーします。この場合は、保護するパスに一致する URIS プロパティーでリソースが適切に設定されていることを確認する必要があります。
user-managed-access
アダプターが UMA プロトコルを使用することを指定します。指定されている場合、アダプターはサーバーに対してサーバーに対してクエリーを行い、UMA 仕様に従ってクライアントに戻ります。指定しない場合、ポリシーエンフォーサーは、通常のアクセストークンまたは RPTs に基づいてパーミッションを強制できます。この場合、トークンにパーミッションがない場合にリソースへのアクセスを拒否する前に、ポリシーエンフォーサーはサーバーから直接パーミッションの取得を試みます。
enforcement-mode
ポリシーの適用方法を指定します。
ENFORCING
(デフォルトモード) 指定されたリソースに関連付けられたポリシーがない場合でも、要求はデフォルトで拒否されます。
PERMISSIVE
指定のリソースに関連付けられたポリシーがない場合でも、要求は許可されます。
DISABLED
ポリシーの評価を完全に無効にし、すべてのリソースにアクセスできるようにします。
enforcement-mode
がDISABLED
である場合は、認可コンテキスト を介して Red Hat Single Sign-On によって付与されたすべてのパーミッションを取得できます。
on-deny-redirect-to
"access denied" メッセージがサーバーから取得される際に、クライアントリクエストがリダイレクトされる URL を定義します。デフォルトでは、アダプターは 403 HTTP ステータスコードで応答します。
path-cache
ポリシーエンフォーサーが、Red Hat Single Sign-On で定義したアプリケーションとリソース間の関連付けを追跡する方法を定義します。このキャッシュは、パスと保護リソース間の関連付けをキャッシュすることで、Red Hat Single Sign-On サーバーへの不要な要求を回避するために必要です。
lifespan
エントリーの期限が切れる時間 (ミリ秒単位) を定義します。指定しないと、デフォルト値は 30000 になります。0 に等しい値を設定して、キャッシュを完全に無効にすることができます。-1 に等しい値を設定して、キャッシュの有効期限を無効にすることができます。
max-entries
キャッシュに保持される必要があるエントリーの制限を定義します。指定しないと、デフォルト値は 1000 になります。
paths
保護するパスを指定します。この設定はオプションです。定義されていない場合、ポリシーエンフォーサーは Red Hat Single Sign-On でアプリケーションに定義したリソースをフェッチしてすべてのパスを検出します。ここで、これらのリソースがアプリケーションのパスを表す
URIS
で定義されます。name
指定のパスに関連付けられるサーバー上のリソースの名前。path と併用される場合、ポリシーエンフォーサーはリソースの URIS プロパティーを無視し、代わりに指定したパスを使用します。
path
(必須) アプリケーションのコンテキストパスに相対する URI。このオプションが指定されていると、ポリシーは、同じ値を持つ URI でリソースについて、サーバーに対してクエリーを実行します。現在、パス照合に非常に基本的なロジックがサポートされています。有効なパスの例は以下のとおりです。
-
ワイルドカード:
/*
-
接尾辞:
/*.html
-
サブパス:
/path/*
- パスパラメーター: /resource/{id}
- 完全一致: /resource
- パターン: /{version}/resource, /api/{version}/resource, /api/{version}/resource/*
-
ワイルドカード:
methods
HTTP メソッド (GET、POST、PATCH など) は、サーバーの特定リソースのスコープとどのように関連付けされるかを指定します。
method
HTTP メソッドの名前。
scopes
メソッドに関連付けられたスコープを持つ文字列の配列。スコープを特定のメソッドに関連付ける際に、保護されたリソース (またはパス) へのアクセスを試みるクライアントが、リストで指定されたすべてのスコープにパーミッションを付与する RPT を提供する必要があります。たとえば、スコープ 作成 でメソッド POST を定義する場合、パスへの POST を実行する際に、RPT には create スコープへのアクセスを付与するパーミッションが含まれている必要があります。
scopes-enforcement-mode
メソッドに関連付けられたスコープの強制モードを参照する文字列。値は、ALL または ANY にすることができます。ALL の場合は、このメソッドを使用してリソースにアクセスするために定義されたすべてのスコープが付与される必要があります。ANY の場合は、このメソッドを使用してリソースにアクセスするには、少なくとも 1 つのスコープを付与する必要があります。デフォルトでは、強制モードは ALL に設定されます。
enforcement-mode
ポリシーの適用方法を指定します。
ENFORCING
(デフォルトモード) 指定されたリソースに関連付けられたポリシーがない場合でも、要求はデフォルトで拒否されます。
- DISABLED
claim-information-point
これらの要求をポリシーで利用可能にするために解決し、Red Hat Single Sign-On サーバーにプッシュする必要のある 1 つ以上の要求のセットを定義します。詳細は、要求情報ポイント を参照してください。
lazy-load-paths
アプリケーションがパスに関連付けられたリソースのサーバーを取得する方法を指定します。true の場合、ポリシーエンフォーサーは要求されるパスに応じてオンデマンドでリソースをフェッチします。この設定は、デプロイメント中にサーバーからすべてのリソースをフェッチする場合 (
パス
を指定しなかった場合) や、paths
のサブセットのみが定義されていて、他のオンデマンドを取得する場合などに特に便利です。http-method-as-scope
スコープを HTTP メソッドにマッピングする方法を指定します。true に設定すると、ポリシーエンフォーサーは現在のリクエストから HTTP メソッドを使用して、アクセスを付与すべきかどうかを確認します。有効にすると、Red Hat Single Sign-On のリソースが保護している各 HTTP メソッドを表すスコープに関連付けられていることを確認します。
claim-information-point
これらの要求をポリシーに利用可能にするために、解決して Red Hat Single Sign-On サーバーにプッシュする必要のある 1 つ以上の グローバル 要求のセットを定義します。詳細は、要求情報ポイント を参照してください。