第10章 SSO プロトコル
このセクションでは、認証プロトコル、Red Hat build of Keycloak 認証サーバー、および Red Hat build of Keycloak 認証サーバーで保護されたアプリケーションがどのようにこれらのプロトコルと対話するかを説明します。
10.1. OpenID Connect
OpenID Connect (OIDC) は、OAuth 2.0 の拡張機能である認証プロトコルです。
OAuth 2.0 は認可プロトコルを構築するためのフレームワークで、不完全です。一方、OIDC は、Json Web Token (JWT) 標準を使用する完全な認証および認可プロトコルです。JWT 標準は、アイデンティティートークンの JSON 形式を定義し、コンパクトで Web フレンドリーにデータをデジタル署名および暗号化する方法を定義しています。
通常、OIDC は 2 つのユースケースを実装します。最初のケースは、Red Hat build of Keycloak サーバーがユーザーを認証することを要求するアプリケーションです。ログインに成功すると、アプリケーションは ID トークン と アクセストークン を受け取ります。ID トークン には、ユーザー名、電子メール、プロファイル情報などのユーザー情報が含まれています。レルムは、アクセス情報 (ユーザーロールマッピングなど) が含まれるアクセストークン にデジタル署名します。アプリケーションは、この情報を使用してユーザーがアプリケーションでアクセスできるリソースを判断します。
2 つ目のユースケースは、リモートサービスにアクセスするクライアントです。
- クライアントは Red Hat build of Keycloak から アクセストークン を要求し、ユーザーの代わりにリモートサービスを呼び出します。
- Red Hat build of Keycloak はユーザーを認証し、要求元のクライアントへのアクセスを許可するための同意をユーザーに求めます。
- クライアントは、レルムによってデジタル署名される アクセストークン を受け取ります。
- クライアントは、アクセストークン を使用して、リモートサービスで REST 要求を行います。
- リモート REST サービスは アクセストークン を抽出します。
- リモート REST サービスは、トークンの署名を検証します。
- リモート REST サービスは、トークン内のアクセス情報に基づいて、リクエストを処理するか拒否するかを決定します。
10.1.1. OIDC 認証フロー
OIDC には、複数のメソッド (またはフロー) があり、クライアントまたはアプリケーションがユーザーを認証し、アイデンティティー および アクセス トークンを受け取るために使用できます。このメソッドは、アクセスを要求するアプリケーションまたはクライアントのタイプによって異なります。
10.1.1.1. 認可コードフロー
認可コードフローはブラウザーベースのプロトコルで、ブラウザーベースのアプリケーションの認証および認可に適しています。ブラウザーのリダイレクトを使用してアイデンティティーおよびアクセストークンを取得します。
- ユーザーは、ブラウザーを使用してアプリケーションに接続します。アプリケーションは、ユーザーがアプリケーションにログインしていないことを検出します。
- アプリケーションは、認証のためにブラウザーを Red Hat build of Keycloak にリダイレクトします。
- アプリケーションは、コールバック URL をブラウザーリダイレクトのクエリーパラメーターとして渡します。Red Hat build of Keycloak は、認証に成功するとパラメーターを使用します。
- Red Hat build of Keycloak がユーザーを認証し、有効期間が短い 1 回限りの一時コードを作成します。
- Red Hat build of Keycloak はコールバック URL を使用してアプリケーションにリダイレクトし、一時コードをコールバック URL のクエリーパラメーターとして追加します。
- アプリケーションは一時コードを抽出し、Red Hat build of Keycloak にバックグラウンド REST 呼び出しを行い、アイデンティティー、アクセス、更新 トークンのコードを交換します。再生攻撃を防止するため、一時コードは複数回使用できません。
システムは、トークンが有効な間、そのトークンの盗難に対して脆弱です。セキュリティーおよびスケーラビリティーの理由から、アクセストークンは通常すぐに期限切れになるように設定されるため、後続のトークンリクエストは失敗します。トークンの有効期限が切れると、アプリケーションはログインプロトコルによって送信される追加の 更新 トークンを使用して新しいアクセストークンを取得できます。
機密性が要求される クライアントは、トークンの一時コードを交換する際にクライアントシークレットを提供します。パブリッククライアントは、クライアントシークレットの提供を要求されません。パブリック クライアントは、HTTPS が厳格に適用され、クライアントに登録されているリダイレクト URI が厳格に制御される場合に保護されます。HTML5/JavaScript クライアントは、クライアントシークレットを HTML5/JavaScript クライアントへ安全に送信する方法がないため、パブリック クライアントである必要があります。詳細は、クライアントの管理 の章を参照してください。
Red Hat build of Keycloak は、Proof Key for Code Exchange 仕様もサポートします。
10.1.1.2. Implicit Flow
インプリシットフローはブラウザーベースのプロトコルです。これは Authorization Code Flow と似ていますが、要求が少なく、更新トークンはありません。
トークンがリダイレクト URI で送信されると、アクセス トークンがブラウザーの履歴に漏洩する可能性があります (以下を参照)。
また、このフローはクライアントに更新トークンを提供しません。したがって、アクセストークンの有効期限を長くするか、期限切れになったらユーザーを再認証する必要があります。
このフローの使用を推奨していません。このフローは OIDC および OAuth 2.0 仕様にあるためサポートされます。
このプロトコルは以下のように動作します。
- ユーザーは、ブラウザーを使用してアプリケーションに接続します。アプリケーションは、ユーザーがアプリケーションにログインしていないことを検出します。
- アプリケーションは、認証のためにブラウザーを Red Hat build of Keycloak にリダイレクトします。
- アプリケーションは、コールバック URL をブラウザーリダイレクトのクエリーパラメーターとして渡します。認証に成功すると、Red Hat build of Keycloak はクエリーパラメーターを使用します。
- Red Hat build of Keycloak はユーザーを認証し、アイデンティティー および アクセス トークンを作成します。Red Hat build of Keycloak はコールバック URL を使用してアプリケーションにリダイレクトし、さらに アイデンティティー および アクセス トークンをコールバック URL のクエリーパラメーターとして追加します。
- アプリケーションはコールバック URL から identity および access トークンを抽出します。
10.1.1.3. リソースオーナーパスワードクレデンシャルの付与 (直接アクセスグラント)
Direct Access Grants は、ユーザーの代わりにトークンを取得するために REST クライアントによって使用されます。これは、以下の項目を含む HTTP POST リクエストです。
- ユーザーの認証情報。認証情報はフォームパラメーターで送信されます。
- クライアントの ID。
- クライアントシークレット (機密性が要求されるクライアントの場合)。
HTTP 応答には、アイデンティティー、アクセス、および 更新 トークンが含まれます。
10.1.1.4. クライアント認証情報の付与
Client Credentials Grant は、外部ユーザーの代わりに機能するトークンを取得するのではなく、クライアントに関連付けられたサービスアカウントのメタデータおよびパーミッションに基づいてトークンを作成します。Client Credentials Grants は REST クライアントによって使用されます。
詳細は、サービスアカウント の章を参照してください。
10.1.1.5. リフレッシュトークンの付与
デフォルトでは、Red Hat build of Keycloak は、ほとんどのフローからのトークン応答で更新トークンを返します。いくつかの例外としては、上で説明した暗黙的なフローまたはクライアント認証情報の付与があります。
リフレッシュトークンは、SSO ブラウザーセッションのユーザーセッションに関連付けられており、ユーザーセッションの有効期間中有効です。ただし、そのクライアントは指定された間隔ごとに少なくとも 1 回はリフレッシュトークン要求を送信する必要があります。そうでない場合、セッションは "アイドル" とみなされ、期限切れになる可能性があります。詳細は、タイムアウトのセクション を参照してください。
Red Hat build of Keycloak は offline tokens をサポートしています。これは通常、対応するブラウザー SSO セッションがすでに期限切れであっても、クライアントがリフレッシュトークンを使用する必要がある場合に使用できます。
10.1.1.5.1. リフレッシュトークンのローテーション
リフレッシュトークンは、一度使用すると無効とみなされるように指定できます。つまり、すでに使用されている古いリフレッシュトークンは、Red Hat build of Keycloak では有効とは見なされなくなるため、クライアントは常に最後のリフレッシュレスポンスからリフレッシュトークンを保存する必要があります。これは、タイムアウトセクション で指定されているように、Revoke Refresh token オプションを使用して設定できます。
Red Hat build of Keycloak は、リフレッシュトークンのローテーションが存在しない状況もサポートします。この場合、ログイン時にリフレッシュトークンが返されますが、リフレッシュトークン要求からの後続の応答では新しいリフレッシュトークンは返されません。これは、アプリケーションのセキュリティー 保護セクションの FAPI 2 ドラフト仕様 で、たとえば推奨されます。Red Hat build of Keycloak では、クライアントポリシー を使用してリフレッシュトークンのローテーションをスキップできます。一部のクライアントプロファイルに executor の suppress-refresh-token-rotation
を追加し、クライアントポリシーを設定して、どのクライアントに対してプロファイルがトリガーされるかを指定できます。つまり、それらのクライアントでは、更新トークンのローテーションがスキップされます。
10.1.1.6. デバイス認可の付与
これは、入力機能が制限されているか、適切なブラウザーがないインターネット接続デバイスで実行されているクライアントによって使用されます。以下は、プロトコルの概要です。
- アプリケーションは、Red Hat build of Keycloak にデバイスコードとユーザーコードを要求します。Red Hat build of Keycloak が、デバイスコードとユーザーコードを作成します。Red Hat build of Keycloak が、デバイスコードおよびユーザーコードなどの応答をアプリケーションに返します。
- アプリケーションが、ユーザーにユーザーコードと検証 URI を提供します。ユーザーは検証 URI にアクセスし、別のブラウザーを使用して認証されます。プロキシー内の Red Hat build of Keycloak - fe の外部にある Red Hat build of Keycloak 検証 URI (/realms/realm_name/device) にリダイレクトされる短い verify_uri を定義することもできます。
- アプリケーションは Red Hat build of Keycloak に繰り返しポーリングを行い、ユーザーがユーザー認可を完了したか確認します。ユーザー認証が完了すると、アプリケーションは アイデンティティー、アクセス、更新のトークンのデバイスコードを交換します。
10.1.1.7. クライアントが開始したバックチャネル認証の付与
この機能は、OAuth 2.0 の認可コード付与のようなユーザーのブラウザーを介したリダイレクトを行わずに、OpenID プロバイダーと直接通信して認証フローを開始したいクライアントによって使用されます。以下は、プロトコルの概要です。
- クライアントは、クライアントによる認証要求を識別する auth_req_id を Red Hat build of Keycloak に要求します。Red Hat build of Keycloak は auth_req_id を作成します。
- このクライアントは、auth_req_id を受信してからユーザーが認証されるまで、auth_req_id と引き換えに Red Hat build of Keycloak からアクセストークン、更新トークン、および ID トークンを取得するため、Red Hat build of Keycloak を繰り返しポーリングする必要があります。
管理者は、Client Initiated Backchannel Authentication (CIBA) 関連の操作をレルムごとに CIBA ポリシー
として設定できます。
また、アプリのセキュリティー 保護 セクションの backchannel Authentication Endpoint および Client Initiated Backchannel Authentication Grant など、Keycloak ドキュメントの Red Hat ビルドの他の部分も参照してください。
10.1.1.7.1. CIBA ポリシー
管理者は、Admin Console
で以下の操作を実行します。
-
Authentication
タブを開きます。CIBA Policy -
項目を設定し、
Save
をクリックします。
設定可能な項目とその説明を以下に示します。
設定 | 説明 |
---|---|
Backchannel Token Delivery Mode | CD(Consumption Device) が認証結果および関連するトークンを取得する方法を指定します。"poll"、"ping"、および "push" の 3 つのモードがあります。Red Hat build of Keycloak は "poll" のみサポートします。デフォルトの設定は "poll" です。この設定は必須です。詳細は、CIBA 仕様 を参照してください。 |
Expires In | 認証リクエストが受信されてからの "auth_req_id" の有効期限 (秒単位)。デフォルト設定は 120 です。この設定は必須です。詳細は、CIBA 仕様 を参照してください。 |
Interval | CD (Consumption Device) がトークンエンドポイントへのポーリングリクエストを待機する必要がある間隔 (秒単位)。デフォルト設定は 5 です。この設定はオプションです。詳細は、CIBA 仕様 を参照してください。 |
Authentication Requested User Hint | 認証が要求されているエンドユーザーを識別する方法。デフォルト設定は "login_hint" です。"login_hint"、"login_hint_token"、および i"id_token_hint" の 3 つのモードがあります。Red Hat build of Keycloak は "login_hint" のみサポートします。この設定は必須です。詳細は、CIBA 仕様 を参照してください。 |
10.1.1.7.2. プロバイダー設定
CIBA 付与は以下 2 つのプロバイダーを使用します。
- Authentication Channel Provider: Red Hat build of Keycloak と、AD (認証デバイス) 経由でユーザーを実際に認証するエンティティー間の通信を提供します。
-
User Resolver Provider: クライアントが提供する情報から Red Hat build of Keycloak の
UserModel
を取得し、ユーザーを特定します。
Red Hat build of Keycloak には、両方のデフォルトプロバイダーがあります。ただし、管理者は以下のように Authentication Channel Provider を設定する必要があります。
kc.[sh|bat] start --spi-ciba-auth-channel-ciba-http-auth-channel-http-authentication-channel-uri=https://backend.internal.example.com
設定可能な項目とその説明を以下に示します。
設定 | 説明 |
---|---|
http-authentication-channel-uri | AD(認証デバイス) でユーザーを実際に認証するエンティティーの URI を指定します。 |
10.1.1.7.3. Authentication Channel Provider
CIBA 標準ドキュメントでは、AD によるユーザーの認証方法は指定されていません。したがって、製品の判断で実装される可能性があります。Red Hat build of Keycloak は、この認証を外部認証エンティティーに委譲します。Red Hat build of Keycloak は、認証エンティティーと通信するために Authentication Channel Provider を提供しています。
Red Hat build of Keycloak の実装では、認証エンティティーが Red Hat build of Keycloak 管理者の管理下にあることを前提としているため、Red Hat build of Keycloak は認証エンティティーを信頼します。Red Hat build of Keycloak の管理者が制御できない認証エンティティーを使用することは推奨されません。
Authentication Channel Provider は SPI プロバイダーとして提供され、Red Hat build of Keycloak のユーザーは環境を満たすために独自のプロバイダーを実装できます。Red Hat build of Keycloak は、HTTP を使用して認証エンティティーと通信する HTTP Authentication Channel Provider と呼ばれるデフォルトプロバイダーを提供します。
Red Hat build of Keycloak ユーザーのユーザーが HTTP Authentication Channel Provider を使用する場合は、以下の 2 つの部分で構成される Red Hat build of Keycloak と認証エンティティーの契約を把握している必要があります。
- 認証委譲リクエスト/レスポンス
- Red Hat build of Keycloak は、認証リクエストを認証エンティティーに送信します。
- 認証結果通知/ACK
- 認証エンティティーは、認証結果を Red Hat build of Keycloak に通知します。
認証委譲リクエスト/レスポンスは、以下のメッセージングで構成されます。
- 認証委譲リクエスト
- リクエストは、AD によるユーザー認証を要求するために、Red Hat build of Keycloak から認証エンティティーに送信されます。
POST [delegation_reception]
- ヘッダー
Name | 値 | 説明 |
---|---|---|
Content-Type | application/json | メッセージのボディーは json 形式です。 |
承認 | Bearer [token] | [token] は、認証エンティティーが認証結果を Red Hat build of Keycloak に通知する場合に使用されます。 |
- パラメーター
タイプ | 名前 | 説明 |
---|---|---|
パス | delegation_reception | 委譲リクエストを受信するために認証エンティティーによって提供されるエンドポイント |
- Body
Name | 説明 |
---|---|
login_hint |
だれが AD で認証されるかを認証エンティティーに指示します。 |
scope |
これは、認証されたユーザーから認証エンティティーが合意を取得するスコープを示します。 |
is_consent_required |
これは、認証エンティティーがスコープについて認証済みユーザーから合意を取得する必要があるかどうかを示します。 |
binding_message |
この値は、CD と AD 両方の UI に表示され、ユーザーが AD による認証が CD によってトリガーされることを認識できるようにします。 |
acr_values |
これは、CD からの要求元の Authentication Context Class Reference を指示します。 |
- 認証委譲レスポンス
認証エンティティーが Red Hat build of Keycloak から認証リクエストを受け取ったことを通知するために、認証エンティティーから Red Hat build of Keycloak に応答が返されます。
- 応答
HTTP ステータスコード | 説明 |
---|---|
201 | Red Hat build of Keycloak に認証移譲リクエストの受信を通知します。 |
認証結果通知/ACK は以下のメッセージングで構成されます。
- 認証結果通知
- 認証エンティティーは、認証リクエストの結果を Red Hat build of Keycloak に送信します。
POST /realms/[realm]/protocol/openid-connect/ext/ciba/auth/callback
- ヘッダー
Name | 値 | 説明 |
---|---|---|
Content-Type | application/json | メッセージのボディーは json 形式です。 |
承認 | Bearer [token] | [token] は、認証エンティティーが認証移譲リクエストで Red Hat build of Keycloak から受け取ったトークンである必要があります。 |
- パラメーター
タイプ | 名前 | 説明 |
---|---|---|
パス | realm | レルム名 |
- Body
Name | 説明 |
---|---|
status |
これは、AD によるユーザー認証の結果を示します。 |
- 認証結果 ACK
Red Hat build of Keycloak から認証エンティティーにレスポンスが返され、Red Hat build of Keycloak が認証エンティティーから AD によるユーザー認証の結果を受け取ったことが通知されます。
- 応答
HTTP ステータスコード | 説明 |
---|---|
200 | 認証の結果の通知を受信したことを認証エンティティーに通知します。 |
10.1.1.7.4. User Resolver Provider
同じユーザーであっても、その表現は CD、Red Hat build of Keycloak、認証エンティティーごとに異なる場合があります。
CD、Red Hat build of Keycloak、認証エンティティーが同じユーザーを認識するために、この User Resolver Provider は独自のユーザー表現を 3 者の間で変換します。
User Resolver Provider は SPI プロバイダーとして提供され、Red Hat build of Keycloak のユーザーは環境を満たすために独自のプロバイダーを実装できます。Red Hat build of Keycloak は、以下の特性を持つ Default User Resolver Provider と呼ばれるデフォルトプロバイダーを提供します。
-
login_hint
パラメーターのみをサポートし、デフォルトとして使用されます。 -
Red Hat build of Keycloak の UserModel の
username
は、CD、Red Hat build of Keycloak、認証エンティティー上のユーザーを表すために使用されます。
10.1.2. OIDC ログアウト
OIDC には、ログアウトメカニズムに関連する 4 つの仕様があります。
繰り返しになりますが、これらはすべて OIDC 仕様に記載されていますが、ここでは概要のみを説明します。
10.1.2.1. セッション管理
これはブラウザーベースのログアウトです。アプリケーションは、Red Hat build of Keycloak から定期的にセッションステータス情報を取得します。Red Hat build of Keycloak でセッションが終了すると、アプリケーションはそれを認識して自身のログアウトをトリガーします。
10.1.2.2. RP-Initiated Logout
これもブラウザーベースのログアウトで、Red Hat build of Keycloak でユーザーを特定のエンドポイントにリダイレクトすることでログアウトが開始されます。通常、Red Hat build of Keycloak を使用してユーザー認証を行っていたアプリケーションのページで、ユーザーが Log Out
リンクをクリックすると、このリダイレクトが発生します。
ユーザーがログアウトエンドポイントにリダイレクトされると、Red Hat build of Keycloak はクライアントにログアウト要求を送信してローカルユーザーセッションを無効にし、ログアウトプロセスが完了するとユーザーをいずれかの URL にリダイレクトする可能性があります。id_token_hint
パラメーターが使用されない場合に、ユーザーはオプションでログアウトを確認するように要求される場合があります。ログアウト後、指定された post_logout_redirect_uri
がパラメーターとして提供されている限り、ユーザーは自動的にリダイレクトされます。post_logout_redirect_uri
が含まれている場合には、client_id
または id_token_hint
パラメーターのいずれかを含める必要があります。また、post_logout_redirect_uri
パラメーターは、クライアント設定で指定された Valid Post Logout Redirect URI
のいずれかと一致する必要があります。
クライアントの設定に応じて、ログアウト要求はフロントチャネルまたはバックチャネルを介してクライアントに送信できます。前のセクションで説明したセッション管理に依存するフロントエンドブラウザークライアントの場合、Red Hat build of Keycloak はログアウト要求をクライアントに送信する必要はありません。これらのクライアントは、ブラウザーの SSO セッションがログアウトしていることを自動的に検出します。
10.1.2.3. フロントチャンネルログアウト
フロントチャネルを介してログアウト要求を受信するようにクライアントを設定するには、Front-Channel Logout クライアント設定を確認します。この方法を使用するときは、次のことを考慮してください。
-
Red Hat build of Keycloak によってクライアントに送信されるログアウト要求は、ブラウザーと、ログアウトページ用にレンダリングされるビルトイン
iframe
に依存します。 -
iframe
に基づいているため、フロントチャネルのログアウトはコンテンツセキュリティーポリシー (CSP) の影響を受け、ログアウト要求がブロックされる可能性があります。 - ログアウトページを表示する前、またはログアウト要求が実際にクライアントに送信される前にユーザーがブラウザーを閉じた場合、クライアントでのセッションが無効にならない可能性があります。
Back-Channel Logout の使用を検討してください。これは、ユーザーがログアウトしてクライアントでセッションを終了するための、信頼性が高く安全な方法を提供します。
クライアントでフロントチャネルログアウトが有効になっていない場合、Red Hat build of Keycloak はまず バックチャネルログアウト URL を使用して、バックチャネル経由でログアウト要求を送信しようとします。定義されていない場合、サーバーは 管理 URL を使用するようにフォールバックします。
10.1.2.4. Backchannel Logout
これは、Red Hat build of Keycloak とクライアント間の直接バックチャンネル通信を使用する非ブラウザーベースのログアウトです。Red Hat build of Keycloak は、ログアウトトークンが含まれる HTTP POST リクエストを、Keycloak にログインしたすべてのクライアントに送信します。これらのリクエストは、Red Hat build of Keycloak で登録されたバックチャンネルログアウト URL に送信され、クライアント側でのログアウトをトリガーすると想定されています。
10.1.3. Red Hat build of Keycloak サーバーの OIDC URI エンドポイント
以下は、Red Hat build of Keycloak が発行する OIDC エンドポイントのリストです。Red Hat build of Keycloak 以外のクライアントアダプターが OIDC を使用して認証サーバーと通信する場合に、これらのエンドポイントを使用できます。これらはすべて相対 URL です。URL のルートは、HTTP (S) プロトコル、ホスト名、およびオプションでパスで構成されます。以下に例を示します。
https://localhost:8080
- /realms/{realm-name}/protocol/openid-connect/auth
- Authorization Code Flow で一時的なコードを取得する場合、または Implicit Flow、Direct Grants、または Client Grants を使用してトークンを取得する際に使用されます。
- /realms/{realm-name}/protocol/openid-connect/token
- 一時コードをトークンに変換するために認可コードフローによって使用されます。
- /realms/{realm-name}/protocol/openid-connect/logout
- ログアウトの実行に使用されます。
- /realms/{realm-name}/protocol/openid-connect/userinfo
- OIDC 仕様で説明されている User Info サービスに使用されます。
- /realms/{realm-name}/protocol/openid-connect/revoke
- RFC7009 で説明されているように OAuth 2.0 Token Revocation に使用されます。
- /realms/{realm-name}/protocol/openid-connect/certs
- JSON Web Token (jwks_uri) の検証に使用される公開鍵が含まれる JSON Web Key Set (JWKS) に使用されます。
- /realms/{realm-name}/protocol/openid-connect/auth/device
- デバイスコードおよびユーザーコードを取得するために Device Authorization Grant に使用されます。
- /realms/{realm-name}/protocol/openid-connect/ext/ciba/auth
- これは、クライアントによって行われた認証要求を識別する auth_req_id を取得するためのクライアント主導のバックチャネル認証許可の URL エンドポイントです。
- /realms/{realm-name}/protocol/openid-connect/logout/backchannel-logout
- これは、OIDC 仕様で説明されているバックチャネルログアウトを実行するための URL エンドポイントです。
これらすべてで、{realm-name} をレルムの名前に置き換えます。