Keycloak の機能と概念

Keycloak は、Web アプリと RESTful Web サービス用のシングルサインオンソリューションです。 Keycloak の目標は、セキュリティをシンプルにし、アプリケーション開発者が組織にデプロイしたアプリやサービスを簡単に保護できるようにすることです。 開発者が通常自分で記述する必要があるセキュリティ機能は、すぐに利用でき、組織の個々の要件に合わせて簡単に調整できます。 Keycloak は、ログイン、登録、管理、およびアカウント管理用のカスタマイズ可能なユーザーインターフェイスを提供します。 また、Keycloak を統合プラットフォームとして使用して、既存の LDAP および Active Directory サーバーにフックすることもできます。 Facebook や Google などのサードパーティのアイデンティティプロバイダーに認証を委任することもできます。

機能

Keycloakは以下の機能を提供します。

  • ブラウザアプリケーション向けのシングルサインオンおよびシングルサインアウト。

  • OpenID Connectのサポート。

  • OAuth 2.0のサポート。

  • SAMLのサポート。

  • アイデンティティブローカリング - 外部のOpenID ConnectまたはSAMLアイデンティティプロバイダーによる認証。

  • ソーシャルログイン - Google、GitHub、Facebook、Twitter、およびその他のソーシャルネットワークでのログインを有効にします。

  • ユーザーフェデレーション - LDAPおよびActive Directoryサーバーからユーザーを同期します。

  • Kerberosブリッジ - Kerberosサーバーにログインしているユーザーを自動的に認証します。

  • ユーザー、ロール、ロールマッピング、クライアント、および設定を一元管理するための管理コンソール。

  • ユーザーが自分のアカウントを一元管理できるアカウントコンソール。

  • テーマのサポート - すべてのユーザー向けページをカスタマイズして、アプリケーションとブランディングに統合します。

  • 二要素認証 - Google AuthenticatorまたはFreeOTP経由でのTOTP/HOTPのサポート。

  • ログインフロー - オプションのユーザー自己登録、パスワードの回復、メールの確認、パスワードの更新要求など。

  • セッション管理 - 管理者とユーザー自身がユーザーセッションを表示および管理できます。

  • トークンマッパー - ユーザー属性、ロールなどをトークンおよびステートメントにどのようにマッピングするかを定義します。

  • レルム、アプリケーション、およびユーザーごとのNot-before失効ポリシー。

  • CORSサポート - クライアントアダプターにはCORSの組み込みサポートがあります。

  • サービスプロバイダーインターフェース(SPI) - サーバーのさまざまな側面をカスタマイズするための多数のSPI。認証フロー、ユーザーフェデレーションプロバイダー、プロトコルマッパーなど多数。

  • OpenID Connect Relying PartyライブラリまたはSAML 2.0サービスプロバイダーライブラリを持つ任意のプラットフォーム/言語をサポートします。

Keycloakの基本的な操作

Keycloakは、ネットワーク上で管理する独立したサーバーです。アプリケーションは、このサーバーを指し示し、このサーバーによって保護されるように構成されます。Keycloakは、アプリケーションを保護するために、OpenID ConnectSAML 2.0のようなオープンプロトコル標準を使用します。ブラウザアプリケーションは、ユーザーのブラウザをアプリケーションからKeycloak認証サーバーにリダイレクトし、そこでユーザーは自分の認証情報を入力します。このリダイレクトは重要です。なぜなら、ユーザーはアプリケーションから完全に隔離され、アプリケーションはユーザーの認証情報を決して見ることがないからです。代わりにアプリケーションには、暗号化署名されたアイデンティティトークンまたはアサーションが与えられます。これらのトークンには、ユーザー名、住所、メールアドレス、その他のプロファイルデータのようなアイデンティティ情報を含めることができます。また、許可データを含めることができるため、アプリケーションは認可の決定を行うことができます。これらのトークンは、RESTベースのサービスでセキュアな呼び出しを行うためにも使用できます。

コアコンセプトと用語

Keycloakを使用してWebアプリケーションとRESTサービスを保護しようとする前に、これらのコアコンセプトと用語を検討してください。

ユーザー

ユーザーは、システムにログインできるエンティティです。ユーザーは、メールアドレス、ユーザー名、住所、電話番号、誕生日などの属性を関連付けることができます。ユーザーは、グループメンバーシップを割り当てられ、特定のロールを割り当てることができます。

認証

ユーザーを識別および検証するプロセス。

認可

ユーザーへのアクセスを許可するプロセス。

認証情報

認証情報は、KeycloakがユーザーのIDを検証するために使用するデータの一部です。例としては、パスワード、ワンタイムパスワード、デジタル証明書、または指紋などがあります。

ロール

ロールは、ユーザーのタイプまたはカテゴリを識別します。Adminusermanager、およびemployeeはすべて、組織に存在する可能性のある典型的なロールです。アプリケーションは、ユーザーを扱うことが細かすぎて管理が困難になる可能性があるため、多くの場合、個々のユーザーではなく、特定のロールにアクセス許可と権限を割り当てます。

ユーザーロールマッピング

ユーザーロールマッピングは、ロールとユーザー間のマッピングを定義します。ユーザーは、ゼロまたは複数のロールに関連付けることができます。このロールマッピング情報は、トークンとアサーションにカプセル化できるため、アプリケーションは管理するさまざまなリソースへのアクセス許可を決定できます。

コンポジットロール

コンポジットロールは、他のロールに関連付けることができるロールです。たとえば、superuserコンポジットロールは、sales-adminロールとorder-entry-adminロールに関連付けることができます。ユーザーがsuperuserロールにマッピングされている場合、そのユーザーはsales-adminロールとorder-entry-adminロールも継承します。

グループ

グループは、ユーザーのグループを管理します。属性は、グループに対して定義できます。ロールをグループにマッピングすることもできます。グループのメンバーになるユーザーは、そのグループが定義する属性とロールマッピングを継承します。

レルム

レルムは、ユーザー、認証情報、ロール、およびグループのセットを管理します。ユーザーはレルムに属し、レルムにログインします。レルムは互いに隔離されており、制御するユーザーのみを管理および認証できます。

クライアント

クライアントは、Keycloakにユーザーの認証を要求できるエンティティです。ほとんどの場合、クライアントは、Keycloakを使用して自身を保護し、シングルサインオンソリューションを提供したいアプリケーションおよびサービスです。クライアントは、ID情報またはアクセストークンを要求するだけのエンティティである場合もあり、Keycloakによって保護されているネットワーク上の他のサービスを安全に呼び出すことができます。

クライアントアダプター

クライアントアダプターは、アプリケーション環境にインストールして、Keycloakと通信し、Keycloakによって保護できるようにするプラグインです。Keycloakには、ダウンロードできるさまざまなプラットフォーム用のアダプターが多数あります。また、対応していない環境向けにサードパーティのアダプターを入手することもできます。

同意

同意とは、管理者として、クライアントが認証プロセスに参加する前に、ユーザーにクライアントへの許可を与えてもらいたい場合のことです。ユーザーが認証情報を提供すると、Keycloakはログインを要求しているクライアントと、ユーザーに要求されているID情報を識別する画面をポップアップ表示します。ユーザーは、要求を許可するかどうかを決定できます。

クライアントスコープ

クライアントを登録するときは、そのクライアントのプロトコルマッパーとロールスコープマッピングを定義する必要があります。クライアントスコープを保存しておくと、共通の設定を共有することで、新しいクライアントの作成が容易になることがよくあります。これは、scopeパラメーターの値に基づいて、いくつかのクレームまたはロールを条件付きで要求する場合にも役立ちます。Keycloakは、このためのクライアントスコープの概念を提供します。

クライアントロール

クライアントは、クライアントに固有のロールを定義できます。これは基本的に、クライアント専用のロール名前空間です。

アイデンティティトークン

ユーザーに関するアイデンティティ情報を提供するトークン。OpenID Connect仕様の一部です。

アクセストークン

HTTPリクエストの一部として提供できるトークンであり、呼び出されているサービスへのアクセスを許可します。これは、OpenID ConnectおよびOAuth 2.0仕様の一部です。

アサーション

ユーザーに関する情報。これは通常、認証されたユーザーに関するアイデンティティメタデータを提供するSAML認証応答に含まれるXMLブロブに関係します。

サービスアカウント

各クライアントには、アクセストークンを取得できる組み込みのサービスアカウントがあります。

ダイレクトグラント

クライアントがREST呼び出しを介してユーザーに代わってアクセストークンを取得する方法。

プロトコルマッパー

クライアントごとに、OIDCトークンまたはSAMLアサーションに格納されるクレームとアサーションを調整できます。これは、プロトコルマッパーを作成および構成することにより、クライアントごとに行います。

セッション

ユーザーがログインすると、ログインセッションを管理するためにセッションが作成されます。セッションには、ユーザーがログインした時間や、そのセッション中にシングルサインオンに参加したアプリケーションなどの情報が含まれています。管理者とユーザーの両方がセッション情報を表示できます。

ユーザーフェデレーションプロバイダー

Keycloakは、ユーザーを保存および管理できます。多くの場合、企業はすでにユーザーと認証情報を保存するLDAPまたはActive Directoryサービスを持っています。Keycloakに、これらの外部ストアからの認証情報を検証し、ID情報をプルインするように指示できます。

アイデンティティプロバイダー

アイデンティティプロバイダー(IDP)は、ユーザーを認証できるサービスです。KeycloakはIDPです。

アイデンティティプロバイダーフェデレーション

Keycloakは、1つ以上のIDPへの認証委任を構成できます。FacebookまたはGoogle経由のソーシャルログインは、アイデンティティプロバイダーフェデレーションの例です。また、Keycloakをフックして、他のOpenID ConnectまたはSAML 2.0 IDPへの認証を委任することもできます。

アイデンティティプロバイダーマッパー

IDPフェデレーションを行う場合、受信トークンとアサーションをユーザーおよびセッション属性にマッピングできます。これは、認証を要求する外部IDPからクライアントにID情報を伝播するのに役立ちます。

必須アクション

必須アクションは、認証プロセス中にユーザーが実行する必要があるアクションです。ユーザーは、これらのアクションが完了するまで認証プロセスを完了できません。たとえば、管理者は、ユーザーに毎月パスワードをリセットするようにスケジュールできます。パスワードの更新の必須アクションは、これらのすべてのユーザーに設定されます。

認証フロー

認証フローは、ユーザーがシステムの特定のアスペクトと対話するときに実行する必要があるワークフローです。ログインフローは、必要な認証情報のタイプを定義できます。登録フローは、ユーザーが入力する必要があるプロファイル情報と、ボットをフィルタリングするためにreCAPTCHAのようなものを使用する必要があるかどうかを定義します。認証情報リセットフローは、ユーザーがパスワードをリセットする前に実行する必要があるアクションを定義します。

イベント

イベントは、管理者が表示およびフックできる監査ストリームです。

テーマ

Keycloakによって提供されるすべての画面は、テーマによってサポートされています。テーマは、必要に応じてオーバーライドできるHTMLテンプレートとスタイルシートを定義します。

最初の管理者を作成する

Keycloakをインストールした後、Keycloakを管理するための完全な権限を持つスーパー管理者として機能できる管理者アカウントが必要です。このアカウントを使用すると、Keycloak管理コンソールにログインして、レルムとユーザーを作成し、Keycloakによって保護されるアプリケーションを登録できます。

ローカルホストでアカウントを作成する

サーバーがlocalhostからアクセス可能な場合は、次の手順を実行します。

手順
  1. Webブラウザで、https://#:8080 URLに移動します。

  2. 覚えておけるユーザー名とパスワードを入力します。

    ようこそページ

    Welcome page

リモートでアカウントを作成する

localhostアドレスからサーバーにアクセスできない場合、またはコマンドラインからKeycloakを起動したい場合は、KC_BOOTSTRAP_ADMIN_USERNAMEおよびKC_BOOTSTRAP_ADMIN_PASSWORD環境変数を使用して、最初の管理者アカウントを作成します。

例:

export KC_BOOTSTRAP_ADMIN_USERNAME=<username>
export KC_BOOTSTRAP_ADMIN_PASSWORD=<password>

bin/kc.[sh|bat] start

レルムの設定

管理コンソール用の管理者アカウントを取得したら、レルムを設定できます。レルムは、ユーザー、アプリケーション、ロール、グループなどのオブジェクトを管理するスペースです。ユーザーはレルムに属し、レルムにログインします。1つのKeycloakデプロイメントは、データベースに空き容量がある限り、必要な数のレルムを定義、保存、および管理できます。

管理コンソールの使用

レルムの設定とほとんどの管理タスクは、Keycloak 管理コンソールで行います。

前提条件

管理コンソールを使用するには、管理者アカウントが必要です。

  • 管理者が存在しない場合は、最初の管理者作成を参照してください。

  • 他の管理者が存在する場合は、レルムを管理する権限を持つアカウントを管理者に依頼して提供してもらってください。

手順
  1. 管理コンソールの URL にアクセスします。

    たとえば、localhost の場合は、次の URL を使用します: https://#:8080/admin/

  2. ウェルカムページで作成したユーザー名とパスワード、または最初の管理者ユーザーの作成で説明されている環境変数を入力します。

    ログインページ

    Login page

    この操作により、管理コンソールが表示されます。

    管理コンソール

    Admin Console

  3. 使用できるメニューとその他のオプションに注意してください。

    • 現在のレルムをクリックして、管理できる他のレルムがあるかどうかを確認します。

    • 管理できる別のレルムを作成するには、レルムの作成をクリックします。

    • 右上にあるリストをクリックして、アカウントを表示するか、ログアウトします。

  4. メニューのレルム設定をクリックして、このレルムのフィールドとオプションを表示します。

    フロントエンド URLなどのフィールドの定義を表示するには、疑問符 ? アイコンをクリックします。

    レルム設定

    Realm settings

管理コンソールからエクスポートされたファイルは、バックアップやサーバー間のデータ転送には適していません。ブート時のエクスポートのみが、バックアップまたはサーバー間のデータ転送に適しています。

マスターレルム

管理コンソールには、2 種類のレルムが存在します。

  • マスターレルム - このレルムは、Keycloak を最初に起動したときに作成されました。最初のログイン時に作成した管理者アカウントが含まれています。マスターレルムは、システム内のレルムを作成および管理する場合にのみ使用してください。

  • 他のレルム - これらのレルムは、マスターレルムの管理者によって作成されます。これらのレルムでは、管理者は組織内のユーザーと、ユーザーが必要とするアプリケーションを管理します。アプリケーションはユーザーが所有します。

レルムとアプリケーション

Realms and applications

レルムは互いに分離されており、制御するユーザーのみを管理および認証できます。このセキュリティモデルに従うことで、偶発的な変更を防ぎ、ユーザーアカウントが現在のタスクを正常に完了するために必要な特権と権限のみにアクセスできるようにするという伝統に従うのに役立ちます。

追加リソース
  • マスターレルムを無効にして、作成する新しいレルム内に管理者アカウントを定義する場合は、専用レルム管理コンソールを参照してください。各レルムには、ローカルアカウントでログインできる専用の管理コンソールがあります。

レルムの作成

ユーザーを作成し、アプリケーションを使用する権限を付与できる管理スペースを提供するために、レルムを作成します。最初のログイン時には、通常、マスターレルム、つまり他のレルムを作成する最上位レルムにいます。

必要なレルムを決定する際には、ユーザーとアプリケーションに対してどのような分離が必要かを検討してください。たとえば、会社の従業員用のレルムと、顧客用の別のレルムを作成する場合があります。従業員は従業員レルムにログインし、社内アプリケーションのみにアクセスできます。顧客は顧客レルムにログインし、顧客向けアプリのみを操作できます。

手順
  1. 管理コンソールで、現在のレルムの横にあるレルムの作成をクリックします。

  2. レルムの名前を入力します。

  3. 作成をクリックします。

    レルムの作成

    Create realm

    現在のレルムが、作成したばかりのレルムに設定されました。メニューでレルム名をクリックすると、レルムを切り替えることができます。

レルムの SSL の設定

各レルムには、関連付けられた SSL モードがあり、レルムとの対話に必要な SSL/HTTPS 要件を定義します。レルムと対話するブラウザとアプリケーションは、SSL モードで定義された SSL/HTTPS 要件を遵守しないと、サーバーと対話できません。

手順
  1. メニューのレルム設定をクリックします。

  2. 一般タブをクリックします。

    一般タブ

    General Tab

  3. SSL 必須を次の SSL モードのいずれかに設定します。

    • 外部リクエスト ユーザーは、localhost127.0.0.110.x.x.x192.168.x.x172.16.x.x などのプライベート IPv4 アドレス、または IPv6 リンクローカルおよびユニークローカルアドレスを使用している限り、SSL なしで Keycloak と対話できます。非プライベート IP アドレスから SSL なしで Keycloak にアクセスしようとすると、エラーが発生します。

    • なし Keycloak は SSL を必要としません。この選択肢は、実験中で、このデプロイメントをサポートする予定がない開発でのみ適用されます。

    • すべてのリクエスト Keycloak はすべての IP アドレスに SSL を要求します。

レルムのメールの設定

Keycloak は、ユーザーのメールアドレスを確認したり、パスワードを忘れたり、管理者がサーバーイベントに関する通知を受信する必要がある場合に、ユーザーにメールを送信します。Keycloak がメールを送信できるようにするには、SMTP サーバー設定を Keycloak に提供します。

手順
  1. メニューのレルム設定をクリックします。

  2. メールタブをクリックします。

    メールタブ

    Email Tab

  3. 必要に応じてフィールドに入力し、スイッチを切り替えます。

テンプレート
差出人

差出人は、送信されるメールの From SMTP ヘッダーに使用されるアドレスを示します。

差出人表示名

差出人表示名を使用すると、ユーザーフレンドリーなメールアドレスエイリアスを設定できます (オプション)。設定しない場合、メールクライアントにはプレーンな差出人メールアドレスが表示されます。

返信先

返信先は、送信されるメールの Reply-To SMTP ヘッダーに使用されるアドレスを示します (オプション)。設定しない場合、プレーンな差出人メールアドレスが使用されます。

返信先表示名

返信先表示名を使用すると、ユーザーフレンドリーなメールアドレスエイリアスを設定できます (オプション)。設定しない場合、メールクライアントにはプレーンな返信先メールアドレスが表示されます。

エンベロープ From

エンベロープ From は、送信されるメールの Return-Path SMTP ヘッダーに使用されるバウンスアドレスを示します (オプション)。

接続と認証
ホスト

ホストは、メール送信に使用される SMTP サーバーのホスト名を示します。

ポート

ポートは、SMTP サーバーのポートを示します。

暗号化

ユーザー名とパスワードの回復のためにメールを送信することをサポートするには、これらのチェックボックスのいずれかをオンにします。特に SMTP サーバーが外部ネットワーク上にある場合はオンにしてください。ほとんどの場合、ポートを SSL/TLS のデフォルトポートである 465 に変更する必要があります。

認証

SMTP サーバーが認証を必要とする場合は、このスイッチをオンに設定します。

ユーザー名

すべての認証メカニズムにはユーザー名が必要です。

認証タイプ

認証の種類を選択します: 'password' または 'token'。

パスワード

認証タイプ 'password' が選択されている場合にのみ必要です。パスワードを入力します。パスワードフィールドの値は、外部のVaultの値を参照できます。

認証トークン URL

認証タイプ 'token' が選択されている場合にのみ必要です。クライアントクレデンシャルグラントを介してトークンを取得するために使用される認証トークン URLを入力します。

認証トークンスコープ

認証タイプ 'token' が選択されている場合にのみ必要です。認証トークン URLからトークンを取得するために使用される認証トークンスコープを入力します。

認証トークン ClientId

認証タイプ 'token' が選択されている場合にのみ必要です。認証トークン URLからトークンを取得するために使用される認証 ClientId を入力します。

認証トークンクライアントシークレット

認証タイプ 'token' が選択されている場合にのみ必要です。認証トークン URLからトークンを取得するためにクライアントを認証する認証クライアントシークレットを入力します。認証クライアントシークレットフィールドの値は、外部のVaultの値を参照できます。

サードパーティベンダーとの XOAUTH2 メール設定

次のセクションでは、既知のサードパーティソフトウェア SMTP サーバーで XOAUTH2 ベースの認証を使用するように Keycloak メール設定を構成する方法に関するヒントをいくつか示します。

このセクションは、Keycloak コミュニティによって提供されました。Keycloak コアチームはサードパーティプロバイダーをテストする手段を持っていないため、現状有姿で提供されています。このドキュメントが古くなっているか不完全である場合は、改善にご協力ください。
Microsoft Azure および Office365 の構成

Microsoft Azure では、クライアントシークレットを使用して「クライアントクレデンシャルグラント」を実行し、アクセストークンを取得できます。Microsoft Office365 は、取得したトークンで認証するために XOAUTH2 を使用した SMTP をサポートしています。

関連する Microsoft ドキュメントへのリンク

Azure および Office365 でメールを送信するように Keycloak を設定する次の方法は、テストによって検証されています。環境によっては、同じ目的を達成するための他のバリアントがあるかもしれません。

差出人

<some>@<domain>

ホスト

smtp.office365.com

ポート

587

暗号化

STARTTLS をチェック

ユーザー名

<some>@<domain> (送信者の値と同じ場合と異なる場合があります)

認証トークン URL

https://login.microsoftonline.com/<TenantID>/oauth2/v2.0/token

TenantID を Microsoft テナントの ID (通常は UUID) に置き換えるか、Azure コンソールに表示されるエンドポイントのリストからトークン URL をコピーします。

認証トークンスコープ

https://outlook.office.com/.default

認証トークン ClientId

<ApplicationId>

ApplicationId を Azure のアプリケーションの ID (通常は UUID) に置き換えます。

認証トークンクライアントシークレット

<構成されたシークレット>

Google メール の構成

Google はクライアントクレデンシャルグラントのクライアントシークレットを許可していないため、この機能は Keycloak ではまだサポートされていません。

AWS の構成

XOAUTH2 は AWS-SMTP サービスではサポートされていません。AWS サービスではパスワードの使用が必要です。

テーマの設定

特定のレルムに対して、テーマを使用することで Keycloak の任意の UI の外観を変更できます。

手順
  1. メニューのレルム設定をクリックします。

  2. テーマタブをクリックします。

    テーマタブ

    Themes tab

  3. 各 UI カテゴリに必要なテーマを選択し、保存をクリックします。

    ログインテーマ

    ユーザー名とパスワードの入力、OTP 入力、新規ユーザー登録、およびログインに関連するその他の同様の画面。

    アカウントテーマ

    ユーザーが自分のアカウントを管理するために使用するコンソール。

    管理コンソールテーマ

    Keycloak 管理コンソールのスキン。

    メールテーマ

    Keycloak がメールを送信する必要がある場合、このテーマで定義されたテンプレートを使用してメールを作成します。

追加リソース

国際化の有効化

Keycloak では、すべての UI 画面が国際化されています。デフォルトの言語は英語ですが、サポートするロケールとデフォルトのロケールを選択できます。

手順
  1. メニューのレルム設定をクリックします。

  2. ローカライゼーションタブをクリックします。

  3. 国際化を有効にします。

  4. サポートする言語を選択します。

    ローカライゼーションタブ

    Localization tab

    次回ユーザーがログインするとき、ログイン画面、アカウントコンソール、および管理コンソールで使用する言語をログインページで選択できます。

追加リソース
  • サーバー開発者ガイドでは、追加の言語を提供する方法について説明しています。テーマによって提供されるすべての国際化されたテキストは、ローカライゼーションタブでレルム固有のテキストによって上書きできます。

ユーザーロケールの選択

ロケールセレクタープロバイダーは、利用可能な情報に基づいて最適なロケールを提案します。ただし、ユーザーが誰であるかは不明な場合がよくあります。このため、以前に認証されたユーザーのロケールは、永続化された Cookie に記憶されます。

ロケールを選択するロジックは、次のうち最初に利用可能なものを使用します。

  • ユーザー選択 - ユーザーがドロップダウンロケールセレクターを使用してロケールを選択した場合

  • ユーザープロファイル - 認証されたユーザーがいて、ユーザーが優先ロケールを設定している場合

  • クライアント選択 - クライアントによって、たとえば ui_locales パラメーターを使用して渡された場合

  • Cookie - ブラウザで最後に選択されたロケール

  • Accept-Language - Accept-Language ヘッダーからのロケール

  • レルムのデフォルト

  • 上記がすべて該当しない場合は、英語にフォールバック

ユーザーが認証されると、前に述べた永続化された Cookie 内のロケールを更新するアクションがトリガーされます。ユーザーがログインページでロケールセレクターを介してロケールを積極的に切り替えた場合、この時点でユーザーのロケールも更新されます。

ロケールを選択するロジックを変更したい場合は、カスタムの LocaleSelectorProvider を作成するオプションがあります。詳細については、サーバー開発者ガイドを参照してください。

ログインオプションの制御

Keycloak には、いくつかの組み込みログインページ機能が含まれています。

パスワードを忘れた場合の有効化

パスワードを忘れた場合を有効にすると、ユーザーはパスワードを忘れたり、OTP ジェネレーターを紛失した場合に、ログイン資格情報をリセットできます。

手順
  1. メニューのレルム設定をクリックします。

  2. ログインタブをクリックします。

    ログインタブ

    Login Tab

  3. パスワードを忘れた場合オンに切り替えます。

    パスワードを忘れた場合? リンクがログインページに表示されます。

    パスワードを忘れた場合のリンク

    Forgot Password Link

  4. Keycloak がリセットメールを送信できるように、メールタブでホスト差出人を指定します。

  5. このリンクをクリックすると、ユーザーはユーザー名またはメールアドレスを入力して、資格情報をリセットするためのリンクが記載されたメールを受信できる場所に移動します。

    パスワードを忘れた場合のページ

    Forgot Password Page

メールで送信されるテキストは設定可能です。詳細については、サーバー開発者ガイドを参照してください。

ユーザーがメールリンクをクリックすると、Keycloak はパスワードの更新を求め、OTP ジェネレーターを設定している場合は、OTP ジェネレーターの再設定を求めます。セキュリティ上の理由から、このフローはフェデレーションユーザーに資格情報のリセット後に再度ログインするように強制し、同じ認証セッション(同じブラウザ)が使用されている場合は、内部データベースユーザーをログイン状態に保ちます。組織のセキュリティ要件に応じて、デフォルトの動作を変更できます。

この動作を変更するには、次の手順を実行します。

手順
  1. メニューの認証をクリックします。

  2. フロータブをクリックします。

  3. 資格情報のリセットフローを選択します。

    資格情報のリセットフロー

    Reset Credentials Flow

    OTP をリセットしたくない場合は、リセット - 条件付き OTP サブフロー要件を無効に設定します。

    リセットメール設定の送信

    Send Reset Email Configuration

    強制ログインオプションのデフォルトの動作を変更する場合は、フローのリセットメールの送信設定アイコンをクリックし、エイリアスを定義して、最適なリセット後の強制ログインオプション(true、常に再認証を強制、false、同じブラウザが使用された場合はユーザーをログイン状態に保つ、only-federated、フェデレーションユーザーに対してのみ再度ログインを強制するデフォルト値)を選択します。

  4. メニューの認証をクリックします。

  5. 必須アクションタブをクリックします。

  6. パスワードの更新が有効になっていることを確認します。

    必須アクション

    Required Actions

Remember Me の有効化

ログインしたユーザーがブラウザを閉じるとセッションが破棄され、そのユーザーは再度ログインする必要があります。ユーザーがログイン時にRemember Meチェックボックスをオンにした場合、Keycloak がユーザーのログインセッションを開いたままにするように設定できます。このアクションにより、ログイン Cookie がセッションのみの Cookie から永続 Cookie に変わります。

手順
  1. メニューのレルム設定をクリックします。

  2. ログインタブをクリックします。

  3. Remember Meスイッチをオンに切り替えます。

    ログインタブ

    Login Tab Remember Me

    この設定を保存すると、レルムのログインページにRemember meチェックボックスが表示されます。

    Remember Me

    Remember Me

ACR から認証レベル (LoA) へのマッピング

レルムの一般設定では、どの認証コンテキストクラス参照 (ACR) 値をどの認証レベル (LoA) にマッピングするかを定義できます。ACR は任意の値にできますが、LoA は数値である必要があります。acr クレームは、OIDC リクエストで送信される claims または acr_values パラメーターでリクエストでき、アクセストークンと ID トークンにも含まれます。マッピングされた数値は、認証フロー条件で使用されます。

特定のクライアントがレルムとは異なる値を使用する必要がある場合に備えて、マッピングはクライアントレベルでも指定できます。ただし、ベストプラクティスはレルムマッピングに固執することです。

ACR to LoA mapping

詳細については、ステップアップ認証および公式 OIDC 仕様を参照してください。

メール更新ワークフロー (UpdateEmail)

このワークフローでは、ユーザーは自分のメールアドレスを変更するために UPDATE_EMAIL アクションを使用する必要があります。

このアクションは、単一のメール入力フォームに関連付けられています。レルムでメール検証が無効になっている場合、このアクションにより、検証なしでメールを更新できます。レルムでメール検証が有効になっている場合、このアクションはアカウントメールを変更せずに、新しいメールアドレスにメール更新アクショントークンを送信します。アクショントークンのトリガーのみがメールの更新を完了します。

アプリケーションは、AIA (アプリケーション開始アクション) として UPDATE_EMAIL を利用することにより、ユーザーをメール更新フォームに送信できます。

UpdateEmail はプレビューであり、完全にはサポートされていません。この機能はデフォルトで無効になっています。

有効にするには、--features=preview または --features=update-email を指定してサーバーを起動します。

この機能を有効にして、以前のバージョンから移行する場合は、レルムでメールの更新必須アクションを有効にします。そうしないと、ユーザーはメールアドレスを更新できません。

レルムキーの設定

Keycloak で使用される認証プロトコルでは、暗号署名と場合によっては暗号化が必要です。Keycloak は、これを実現するために非対称キーペア(秘密キーと公開キー)を使用します。

Keycloak は、一度に 1 つのアクティブキーペアを持っていますが、複数のパッシブキーも持つことができます。アクティブキーペアは新しい署名の作成に使用され、パッシブキーペアは以前の署名の検証に使用できます。これにより、ユーザーにダウンタイムや中断を与えることなく、キーを定期的にローテーションできます。

レルムが作成されると、キーペアと自己署名証明書が自動的に生成されます。

手順
  1. メニューのレルム設定をクリックします。

  2. キーをクリックします。

  3. フィルタードロップダウンからパッシブキーを選択して、パッシブキーを表示します。

  4. フィルタードロップダウンから無効なキーを選択して、無効なキーを表示します。

キーペアはアクティブステータスを持つことができますが、レルムの現在アクティブなキーペアとして選択されていない可能性があります。署名に使用される選択されたアクティブペアは、アクティブなキーペアを提供できる優先度でソートされた最初のキープロバイダーに基づいて選択されます。

キーのローテーション

キーを定期的にローテーションすることをお勧めします。まず、既存のアクティブキーよりも優先度の高い新しいキーを作成します。代わりに、同じ優先度で新しいキーを作成し、以前のキーをパッシブにすることもできます。

新しいキーが利用可能になると、すべての新しいトークンと Cookie は新しいキーで署名されます。ユーザーがアプリケーションに対して認証を行うと、SSO Cookie が新しい署名で更新されます。OpenID Connect トークンが更新されると、新しいトークンは新しいキーで署名されます。最終的に、すべての Cookie とトークンが新しいキーを使用し、しばらくすると古いキーを削除できます。

古いキーを削除する頻度は、セキュリティと、すべての Cookie とトークンが更新されていることを確認することとのトレードオフです。新しいキーを 3 ~ 6 か月ごとに作成し、新しいキーを作成してから 1 ~ 2 か月後に古いキーを削除することを検討してください。新しいキーが追加されてから古いキーが削除されるまでの期間にユーザーが非アクティブだった場合、そのユーザーは再認証する必要があります。

キーのローテーションは、オフライン トークンにも適用されます。オフライン トークンが更新されるようにするには、アプリケーションは古いキーが削除される前にトークンを更新する必要があります。

生成されたキーペアの追加

自己署名証明書を含むキーペアを生成するには、次の手順を使用します。

手順
  1. 管理コンソールでレルムを選択します。

  2. メニューのレルム設定をクリックします。

  3. キータブをクリックします。

  4. プロバイダータブをクリックします。

  5. プロバイダーを追加をクリックし、rsa-generatedを選択します。

  6. 優先度フィールドに数値を入力します。この数値は、新しいキーペアがアクティブキーペアになるかどうかを決定します。数値が最も大きいほど、キーペアはアクティブになります。

  7. AES キーサイズの値を選択します。

  8. 保存をクリックします。

プロバイダーの優先度を変更しても、キーが再生成されることはありませんが、キーサイズを変更する場合は、プロバイダーを編集すると新しいキーが生成されます。

証明書を抽出してキーをローテーションする

RSA 生成キーペアから証明書を抽出し、その証明書を新しいキーストアで使用することで、キーをローテーションできます。

前提条件
  • 生成されたキーペア

手順
  1. 管理コンソールでレルムを選択します。

  2. レルム設定をクリックします。

  3. キータブをクリックします。

    アクティブキーのリストが表示されます。

  4. RSA キーのある行で、公開キーの下の証明書をクリックします。

    証明書はテキスト形式で表示されます。

  5. 証明書をファイルに保存し、これらの行で囲んでください。

    ----Begin Certificate----
    <Output>
    ----End Certificate----
  6. keytool コマンドを使用して、キーファイルを PEM 形式に変換します。

  7. 現在の RSA 公開鍵証明書をキーストアから削除します。

    keytool -delete -keystore <keystore>.jks -storepass <password> -alias <key>
  8. 新しい証明書をキーストアにインポートします。

    keytool -importcert -file domain.crt -keystore <keystore>.jks -storepass <password>  -alias <key>
  9. アプリケーションをリビルドします。

    mvn clean install wildfly:deploy

既存のキーペアと証明書の追加

別の場所で取得したキーペアと証明書を追加するには、「Providers」を選択し、ドロップダウンから「rsa」を選択します。優先度を変更して、新しいキーペアがアクティブなキーペアになるようにすることができます。

前提条件
  • 秘密鍵ファイル。ファイルは PEM 形式である必要があります。

手順
  1. 管理コンソールでレルムを選択します。

  2. Realm settings (レルム設定)」をクリックします。

  3. キータブをクリックします。

  4. プロバイダータブをクリックします。

  5. Add provider (プロバイダーを追加)」をクリックし、「rsa」を選択します。

  6. Priority (優先度)」フィールドに数値を入力します。この数値によって、新しいキーペアがアクティブなキーペアになるかどうかが決まります。

  7. Private RSA Key (RSA 秘密鍵)」の横にある「Browse…​ (参照…)」をクリックして、秘密鍵ファイルをアップロードします。

  8. 秘密鍵の署名付き証明書がある場合は、「X509 Certificate (X509 証明書)」の横にある「Browse…​ (参照…)」をクリックして、証明書ファイルをアップロードします。証明書をアップロードしない場合、Keycloak は自己署名証明書を自動的に生成します。

  9. 保存をクリックします。

Java キーストアからキーをロードする

ホスト上の Java キーストアファイルに保存されているキーペアと証明書を追加するには、「Providers」を選択し、ドロップダウンから「java-keystore」を選択します。優先度を変更して、新しいキーペアがアクティブなキーペアになるようにすることができます。

関連付けられた証明書チェーンをロードするには、キーペアのロードに使用したのと同じ「Key Alias (キーエイリアス)」を使用して Java キーストアファイルにインポートする必要があります。

手順
  1. 管理コンソールでレルムを選択します。

  2. メニューのレルム設定をクリックします。

  3. キータブをクリックします。

  4. プロバイダータブをクリックします。

  5. Add provider (プロバイダーを追加)」をクリックし、「java-keystore」を選択します。

  6. Priority (優先度)」フィールドに数値を入力します。この数値によって、新しいキーペアがアクティブなキーペアになるかどうかが決まります。

  7. 目的の「Algorithm (アルゴリズム)」を入力します。アルゴリズムはキータイプと一致する必要があることに注意してください(たとえば、RS256 には RSA 秘密鍵、ES256 には EC 秘密鍵、AES には AES 秘密鍵が必要です)。

  8. Keystore (キーストア)」の値を入力します。キーストアファイルへのパス。

  9. Keystore Password (キーストアパスワード)」を入力します。このオプションは、外部ボールトの値を参照できます。

  10. Keystore Type (キーストアタイプ)」(JKSPKCS12、または BCFKS)の値を入力します。

  11. キーストアからロードする「Key Alias (キーエイリアス)」の値を入力します。

  12. Key Password (キーパスワード)」を入力します。このオプションは、外部ボールトの値を参照できます。

  13. Key Use (キーの用途)」(署名の場合は sig、暗号化の場合は enc)の値を入力します。用途はアルゴリズムタイプと一致する必要があることに注意してください(たとえば、RS256sig ですが、RSA-OAEPenc です)。

  14. 保存をクリックします。

すべてのキーストアタイプがすべてのタイプのキーをサポートしているわけではありません。たとえば、すべてのモードの JKS と fips モード (BCFIPS プロバイダー) の PKCS12 は、秘密鍵エントリを保存できません。

キーをパッシブにする

手順
  1. 管理コンソールでレルムを選択します。

  2. メニューのレルム設定をクリックします。

  3. キータブをクリックします。

  4. プロバイダータブをクリックします。

  5. パッシブにするキーのプロバイダーをクリックします。

  6. Active (アクティブ)」を「Off (オフ)」に切り替えます。

  7. 保存をクリックします。

キーを無効にする

手順
  1. 管理コンソールでレルムを選択します。

  2. メニューのレルム設定をクリックします。

  3. キータブをクリックします。

  4. プロバイダータブをクリックします。

  5. パッシブにするキーのプロバイダーをクリックします。

  6. Enabled (有効)」を「Off (オフ)」に切り替えます。

  7. 保存をクリックします。

侵害されたキー

Keycloak は署名キーをローカルにのみ保存しており、クライアントアプリケーション、ユーザー、またはその他のエンティティと共有されることはありません。ただし、レルム署名キーが侵害されたと思われる場合は、まず上記の説明に従って新しいキーペアを生成し、侵害されたキーペアを直ちに削除する必要があります。

または、「Providers (プロバイダー)」テーブルからプロバイダーを削除することもできます。

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. security-admin-console」をクリックします。

  3. Access settings (アクセス設定)」セクションまでスクロールダウンします。

  4. Admin URL (管理 URL)」フィールドに入力します。

  5. Advanced (詳細)」タブをクリックします。

  6. Revocation (失効)」セクションの「Set to now (今すぐ設定)」をクリックします。

  7. Push (プッシュ)」をクリックします。

not-before ポリシーをプッシュすると、クライアントアプリケーションが侵害されたキーによって署名された既存のトークンを受け入れなくなります。クライアントアプリケーションも Keycloak から新しいキーペアをダウンロードする必要があるため、侵害されたキーによって署名されたトークンは無効になります。

REST クライアントおよび機密クライアントは、Keycloak がプッシュされた not-before ポリシーリクエストをクライアントに送信できるように「Admin URL (管理 URL)」を設定する必要があります。

外部ストレージの使用

組織は、情報、パスワード、およびその他の認証情報を格納するデータベースを持つことができます。通常、既存のデータストレージを Keycloak デプロイメントに移行することはできないため、Keycloak は既存の外部ユーザーデータベースをフェデレーションできます。Keycloak は LDAP および Active Directory をサポートしていますが、Keycloak User Storage SPI を使用して、カスタムユーザーデータベースの拡張機能をコーディングすることもできます。

ユーザーがログインを試みると、Keycloak はそのユーザーのストレージを調べてユーザーを見つけます。Keycloak がユーザーを見つけられない場合、Keycloak はレルムの各ユーザーストレージプロバイダーを反復処理して、一致するものを見つけます。次に、外部データストレージからのデータは、Keycloak ランタイムが消費する標準ユーザーモデルにマッピングされます。このユーザーモデルは、OIDC トークンクレームおよび SAML アサーション属性にマッピングされます。

外部ユーザーデータベースには、Keycloak のすべての機能をサポートするために必要なデータがほとんどないため、ユーザーストレージプロバイダーは、Keycloak ユーザーデータストレージにアイテムをローカルに保存することを選択できます。プロバイダーは、ユーザーをローカルにインポートし、外部データストレージと定期的に同期できます。このアプローチは、プロバイダーの機能とプロバイダーの構成によって異なります。たとえば、外部ユーザーデータストレージが OTP をサポートしていない場合があります。OTP は、プロバイダーに応じて、Keycloak によって処理および保存できます。

プロバイダーの追加

ストレージプロバイダーを追加するには、次の手順を実行します。

手順
  1. メニューの「User Federation (ユーザーフェデレーション)」をクリックします。

    ユーザーフェデレーション

    User federation

  2. Kerberos または LDAP プロバイダーを追加することを選択します。

    Keycloak は、そのプロバイダーの構成ページに移動します。

プロバイダーの障害への対処

ユーザーストレージプロバイダーが失敗した場合、ログインして管理コンソールでユーザーを表示できない場合があります。Keycloak は、ストレージプロバイダーを使用してユーザーを検索するときに障害を検出しないため、呼び出しをキャンセルします。ユーザー検索中に優先度の高いストレージプロバイダーが失敗した場合、ログインまたはユーザークエリは例外で失敗し、次に構成されたプロバイダーにフェールオーバーしません。

Keycloak は、LDAP またはカスタムユーザーストレージプロバイダーの前に、ローカルの Keycloak ユーザーデータベースを最初に検索してユーザーを解決します。LDAP およびバックエンドへの接続に問題が発生した場合に備えて、ローカルの Keycloak ユーザーデータベースに保存された管理者アカウントを作成することを検討してください。

各 LDAP およびカスタムユーザーストレージプロバイダーには、管理コンソールページに「enable (有効)」トグルがあります。ユーザーストレージプロバイダーを無効にすると、クエリの実行時にプロバイダーがスキップされるため、優先度の低い別のプロバイダーのユーザーアカウントで表示およびログインできます。プロバイダーが「import (インポート)」戦略を使用し、無効になっている場合でも、インポートされたユーザーは読み取り専用モードで参照できます。

ストレージプロバイダーの検索が失敗した場合、Keycloak はフェールオーバーしません。ユーザーデータベースには、多くの場合、重複するユーザー名または重複するメールアドレスが含まれているためです。重複するユーザー名とメールアドレスは、管理者が別のデータストアからロードすることを期待している場合に、ユーザーが 1 つの外部データストアからロードされるため、問題を引き起こす可能性があります。

ライトウェイトディレクトリアクセスプロトコル (LDAP) および Active Directory

Keycloak には、LDAP/AD プロバイダーが含まれています。1 つの Keycloak レルムで複数の異なる LDAP サーバーをフェデレーションし、LDAP ユーザー属性を Keycloak 共通ユーザーモデルにマッピングできます。

デフォルトでは、Keycloak はユーザーアカウントのユーザー名、メールアドレス、名、および姓をマッピングしますが、追加のマッピングを構成することもできます。Keycloak の LDAP/AD プロバイダーは、LDAP/AD プロトコルとストレージ、編集、および同期モードを使用したパスワード検証をサポートしています。

フェデレーション LDAP ストレージの構成

手順
  1. メニューの「User Federation (ユーザーフェデレーション)」をクリックします。

    ユーザーフェデレーション

    User federation

  2. Add LDAP providers (LDAP プロバイダーを追加)」をクリックします。

    Keycloak は、LDAP 構成ページに移動します。

    LDAP プロバイダーを追加

    User federation

ストレージモード

Keycloak は、LDAP からローカルの Keycloak ユーザーデータベースにユーザーをインポートします。ユーザーデータベースのこのコピーは、オンデマンドまたは定期的なバックグラウンドタスクを通じて同期されます。パスワードの同期には例外があります。Keycloak はパスワードをインポートしません。パスワード検証は常に LDAP サーバーで実行されます。

同期の利点は、必要な追加のユーザーごとのデータがローカルに保存されるため、すべての Keycloak 機能が効率的に動作することです。欠点は、Keycloak が特定のユーザーを初めてクエリするたびに、対応するデータベース挿入を実行することです。また、インポートされたユーザーが検索操作の一部として返される場合、ユーザーが LDAP にまだ存在するかどうかを確認し、基本的な検証を行うために、それぞれに対応する LDAP 検索が実行されます。

LDAP マッパーが常にデータベースではなく LDAP から特定の属性を読み取る場合、インポートの同期は不要です。

Keycloak ユーザーデータベースにユーザーをインポートせずに、Keycloak で LDAP を使用できます。LDAP サーバーは、Keycloak ランタイムが使用する共通ユーザーモデルをバックアップします。LDAP が Keycloak 機能に必要なデータをサポートしていない場合、その機能は動作しません。このアプローチの利点は、LDAP ユーザーのコピーを Keycloak ユーザーデータベースにインポートおよび同期するリソースを使用しないことです。

LDAP 構成ページの「Import Users (ユーザーをインポート)」スイッチは、このストレージモードを制御します。ユーザーをインポートするには、このスイッチを「ON (オン)」に切り替えます。

Import Users (ユーザーをインポート)」を無効にすると、ユーザープロファイル属性を Keycloak データベースに保存できません。また、LDAP にマッピングされたユーザープロファイルメタデータを除き、メタデータを保存できません。このメタデータには、ロールマッピング、グループマッピング、および LDAP マッパーの構成に基づくその他のメタデータを含めることができます。

LDAP にマッピングされていないユーザーデータを変更しようとすると、ユーザーの更新はできません。たとえば、ユーザーの「enabled (有効)」フラグが LDAP 属性にマッピングされていない限り、LDAP にマッピングされたユーザーを無効にすることはできません。

インポートされたユーザーを操作する場合、ユーザーがクエリされると Keycloak は LDAP 検索を実行して、ユーザーを検証および装飾し、構成されたマッパーが適切に機能するようにします。これは、多数のユーザーを取得する可能性のあるフィルター処理されていないユーザー検索を実行する場合は、特に注意する必要があることを意味します。LDAP 検索は、見つかったインポートされたすべてのユーザーに対して発行されるため、パフォーマンスに悪影響を与える可能性があります。

単一のユーザーを取得する操作 (たとえば、ログイン中) は通常キャッシュされ、ユーザーが初めて取得されたときに実行されるこの追加の LDAP 検索の影響を受けないはずです。

編集モード

ユーザーと管理者は、ユーザーメタデータを変更できます。ユーザーはアカウントコンソールを通じて、管理者は管理コンソールを通じて変更できます。LDAP 構成ページの「Edit Mode (編集モード)」構成は、ユーザーの LDAP 更新権限を定義します。

READONLY (読み取り専用)

ユーザー名、メールアドレス、名、姓、およびその他のマッピングされた属性を変更することはできません。ユーザーがこれらのフィールドを更新しようとすると、Keycloak は常にエラーを表示します。パスワードの更新はサポートされていません。

WRITABLE (書き込み可能)

ユーザー名、メールアドレス、名、姓、およびその他のマッピングされた属性とパスワードを変更し、LDAP ストアと自動的に同期できます。

UNSYNCED (非同期)

Keycloak は、ユーザー名、メールアドレス、名、姓、およびパスワードへの変更を Keycloak ローカルストレージに保存するため、管理者はこのデータを LDAP に同期する必要があります。このモードでは、Keycloak デプロイメントは読み取り専用 LDAP サーバーでユーザーメタデータを更新できます。このオプションは、LDAP からローカルの Keycloak ユーザーデータベースにユーザーをインポートする場合にも適用されます。

Keycloak が LDAP プロバイダーを作成すると、Keycloak は初期LDAP マッパーのセットも作成します。Keycloak は、「Vendor (ベンダー)」、「Edit Mode (編集モード)」、および「Import Users (ユーザーをインポート)」スイッチの組み合わせに基づいて、これらのマッパーを構成します。たとえば、編集モードが UNSYNCED の場合、Keycloak はデータベースから特定のユーザー属性を読み取るようにマッパーを構成し、LDAP サーバーからは読み取りません。ただし、後で編集モードを変更した場合、構成が UNSYNCED モードで変更されたかどうかを検出することは不可能であるため、マッパーの構成は変更されません。「Edit Mode (編集モード)」は、LDAP プロバイダーを作成するときに決定してください。この注意書きは、「Import Users (ユーザーをインポート)」スイッチにも適用されます。

その他の構成オプション

Console Display Name (コンソール表示名)

管理コンソールに表示するプロバイダーの名前。

Priority (優先度)

ユーザーの検索時またはユーザーの追加時のプロバイダーの優先度。

Sync Registrations (登録の同期)

Keycloak によって作成された新しいユーザーを LDAP に追加する場合は、このスイッチを「ON (オン)」に切り替えます。

Allow Kerberos authentication (Kerberos 認証を許可する)

LDAP からプロビジョニングされたユーザーデータを使用して、レルムで Kerberos/SPNEGO 認証を有効にします。詳細については、Kerberos セクションを参照してください。

Remove invalid users during searches (検索中に無効なユーザーを削除する)

検索の実行時にユーザーストレージからユーザーが利用できない場合、ローカルデータベースからユーザーを削除します。これが true の場合、対応するユーザーストレージから利用できなくなったユーザーは、ユーザーを検索しようとするたびにローカルデータベースから削除されます。false の場合、ユーザーストレージから以前にインポートされたユーザーは、読み取り専用および無効としてローカルデータベースに保持されます。たとえそのユーザーがユーザーストレージから利用できなくなったとしてもです。たとえば、ユーザーが LDAP から直接削除されたり、「Users DN (ユーザー DN)」が無効になったりした場合などです。この動作は、ユーザーがまだキャッシュされていない場合にのみ発生することに注意してください。

Relative User Creation DN (相対ユーザー作成 DN)

新しいユーザーが作成される「Users DN (ユーザー DN)」からの相対 DN。これにより、subtree 検索スコープを使用する場合に、親「Users DN (ユーザー DN)」のサブ DN にユーザーを作成できます。たとえば、「Users DN (ユーザー DN)」が ou=people,dc=myorg,dc=com に設定され、「Relative User Creation DN (相対ユーザー作成 DN)」が ou=engineering に設定されている場合、ユーザーは「Users DN (ユーザー DN)」とすべてのサブ DN からフェッチされますが、新しいユーザーは ou=engineering,ou=people,dc=myorg,dc=com に保存されます。言い換えれば、Keycloak は「Relative User Creation DN (相対ユーザー作成 DN)」を「Users DN (ユーザー DN)」と連結し (DN を連結するときにコンマが自動的に追加されます)、この結果の DN を使用してユーザーを保存します。

同様のプロパティは、グループおよびロールマッパーでも使用でき、グループとロールをグループ/ロールの検索に使用されるベース DN のサブ DN に追加できます。

その他のオプション

管理コンソールのツールチップにマウスカーソルを合わせると、これらのオプションの詳細が表示されます。

SSL 経由での LDAP への接続

LDAP ストアへのセキュア接続 URL (たとえば、ldaps://myhost.com:636) を構成すると、Keycloak は SSL を使用して LDAP サーバーと通信します。Keycloak が LDAP への SSL 接続を信頼できるように、Keycloak サーバー側でトラストストアを構成します。詳細については、トラストストアの構成ガイドを参照してください。

Use Truststore SPI (トラストストア SPI を使用)」構成プロパティは非推奨です。通常は「Always (常に)」のままにする必要があります。

LDAP ユーザーを Keycloak に同期する

インポートユーザーオプションを設定すると、LDAPプロバイダーはLDAPユーザーをKeycloakローカルデータベースにインポート処理します。ユーザーが初めてログインするか、ユーザークエリの一部として返される(例えば、管理コンソールの検索フィールドを使用)と、LDAPプロバイダーはLDAPユーザーをKeycloakデータベースにインポートします。認証中、LDAPパスワードが検証されます。

すべてのLDAPユーザーをKeycloakデータベースに同期したい場合は、LDAPプロバイダー設定ページで同期設定を構成して有効にします。

同期には2つのタイプがあります。

定期的フル同期

このタイプは、すべてのLDAPユーザーをKeycloakデータベースに同期します。Keycloakに既に存在し、LDAPと異なるLDAPユーザーは、Keycloakデータベースで直接更新されます。

定期的変更ユーザー同期

同期時、Keycloakは最後の同期以降に作成または更新されたユーザーのみを作成または更新します。

同期の最良の方法は、LDAPプロバイダーを最初に作成するときにすべてのユーザーを同期をクリックし、その後、変更されたユーザーの定期的同期を設定することです。

LDAPマッパー

LDAPマッパーは、LDAPプロバイダーによってトリガーされるリスナーです。これらは、LDAP統合への別の拡張ポイントを提供します。LDAPマッパーは、以下の場合にトリガーされます。

  • ユーザーがLDAPを使用してログインする場合。

  • ユーザーが最初に登録する場合。

  • 管理コンソールがユーザーをクエリする場合。

LDAPフェデレーションプロバイダーを作成すると、Keycloakは自動的にこのプロバイダー用のマッパーのセットを提供します。このセットはユーザーが変更可能であり、ユーザーはマッパーを開発したり、既存のマッパーを更新/削除したりすることもできます。

ユーザー属性マッパー

このマッパーは、どのLDAP属性をKeycloakユーザーの属性にマップするかを指定します。例えば、mail LDAP属性をKeycloakデータベースのemail属性に構成できます。このマッパーの実装では、常に一対一のマッピングが存在します。

フルネームマッパー

このマッパーは、ユーザーのフルネームを指定します。Keycloakは、名前をLDAP属性(通常はcn)に保存し、その名前をKeycloakデータベースのfirstName属性とlastname属性にマップします。cnにユーザーのフルネームを含めることは、LDAPデプロイメントでは一般的です。

Keycloakで新しいユーザーを登録し、LDAPプロバイダーで登録の同期がオンになっている場合、フルネームマッパーはユーザー名へのフォールバックを許可します。このフォールバックは、Microsoft Active Directory(MSAD)を使用する場合に役立ちます。MSADの一般的な設定は、cn LDAP属性をfullNameとして構成し、同時に、LDAPプロバイダー構成でRDN LDAP属性としてcn LDAP属性を使用することです。この設定では、Keycloakはユーザー名にフォールバックします。例えば、Keycloakユーザー「john123」を作成し、firstNameとlastNameを空のままにすると、フルネームマッパーは「john123」をLDAPのcnの値として保存します。後でfirstNameとlastNameに「John Doe」と入力すると、フルネームマッパーはLDAP cnを「John Doe」値に更新します。ユーザー名へのフォールバックは不要になるためです。

ハードコードされた属性マッパー

このマッパーは、LDAPにリンクされた各Keycloakユーザーにハードコードされた属性値を追加します。このマッパーは、enabledまたはemailVerifiedユーザープロパティの値を強制することもできます。

ロールマッパー

このマッパーは、LDAPからKeycloakロールマッピングへのロールマッピングを構成します。単一のロールマッパーは、LDAPロール(通常はLDAPツリーの特定のブランチからのグループ)を、指定されたクライアントのレルムロールまたはクライアントロールに対応するロールにマップできます。同じLDAPプロバイダーに対して複数のロールマッパーを構成できます。例えば、ou=main,dc=example,dc=orgの下のグループからのロールマッピングをレルムロールマッピングにマップし、ou=finance,dc=example,dc=orgの下のグループからのロールマッピングをクライアントfinanceのクライアントロールマッピングにマップするように指定できます。

ハードコードされたロールマッパー

このマッパーは、指定されたKeycloakロールをLDAPプロバイダーからの各Keycloakユーザーに付与します。

グループマッパー

このマッパーは、LDAPツリーのブランチからのLDAPグループをKeycloak内のグループにマップします。このマッパーは、LDAPからKeycloakへのユーザーグループマッピングも伝播します。

MSADユーザーアカウントマッパー

このマッパーは、Microsoft Active Directory(MSAD)に固有です。有効なアカウントや期限切れのパスワードなど、MSADユーザーアカウントの状態をKeycloakアカウントの状態に統合できます。このマッパーは、MSADに固有であり、LDAP標準ではないuserAccountControlおよびpwdLastSet LDAP属性を使用します。例えば、pwdLastSetの値が0の場合、Keycloakユーザーはパスワードを更新する必要があります。結果として、ユーザーにUPDATE_PASSWORD必須アクションが追加されます。userAccountControlの値が514(無効なアカウント)の場合、Keycloakユーザーは無効になります。

証明書マッパー

このマッパーは、X.509証明書をマップします。Keycloakは、X.509認証およびIDソースとしてPEM形式の完全な証明書と組み合わせて使用します。このマッパーはユーザー属性マッパーと同様に動作しますが、KeycloakはPEMまたはDER形式の証明書を格納するLDAP属性をフィルタリングできます。このマッパーで常にLDAPから値を読み取るを有効にします。

ユーザー名、firstName、lastName、emailなどの基本的なKeycloakユーザー属性を、対応するLDAP属性にマップするユーザー属性マッパー。これらを拡張して、独自の追加属性マッピングを提供できます。管理コンソールには、対応するマッパーの構成に役立つツールチップが用意されています。

パスワードハッシュ化

Keycloakがパスワードを更新するとき、Keycloakはプレーンテキスト形式でパスワードを送信します。このアクションは、組み込みのKeycloakデータベースでパスワードを更新する場合とは異なります。組み込みのKeycloakデータベースでは、Keycloakはパスワードをハッシュ化およびソルト化してからデータベースに送信します。LDAPの場合、KeycloakはLDAPサーバーにパスワードのハッシュ化とソルト化を依存します。

デフォルトでは、MSAD、RHDS、FreeIPAなどのLDAPサーバーはパスワードをハッシュ化およびソルト化します。OpenLDAPやApacheDSなどの他のLDAPサーバーは、RFC3062で説明されているLDAPv3パスワード変更拡張操作を使用しない限り、パスワードをプレーンテキストで保存します。LDAP構成ページでLDAPv3パスワード変更拡張操作を有効にします。詳細については、LDAPサーバーのドキュメントを参照してください。

ldapsearchを使用して変更されたディレクトリエントリを検査し、userPassword属性値をbase64デコードすることで、ユーザーパスワードが適切にハッシュ化され、プレーンテキストとして保存されていないことを常に確認してください。

接続プールの構成

LDAP接続を管理する際の効率を高め、複数の接続を処理する際のパフォーマンスを向上させるために、接続プーリングを有効にすることができます。これにより、接続が閉じられると、将来の使用のためにプールに戻され、常に新しい接続を作成するコストが削減されます。

LDAP接続プール構成は、次のシステムプロパティを使用して構成されます。

名前 説明

com.sun.jndi.ldap.connect.pool.authentication

プールできる接続の、スペースで区切られた認証タイプのリスト。有効なタイプは、「none」、「simple」、および「DIGEST-MD5」です。

com.sun.jndi.ldap.connect.pool.initsize

IDの接続を最初に作成するときに作成する、接続IDごとの接続数を表す整数の文字列表現。

com.sun.jndi.ldap.connect.pool.maxsize

同時に維持できる接続IDごとの最大接続数を表す整数の文字列表現。

com.sun.jndi.ldap.connect.pool.prefsize

同時に維持する必要がある接続IDごとの推奨接続数を表す整数の文字列表現。

com.sun.jndi.ldap.connect.pool.timeout

アイドル状態の接続が、閉じられてプールから削除されずにプール内に留まることができるミリ秒数を表す整数の文字列表現。

com.sun.jndi.ldap.connect.pool.protocol

プールできる接続の、スペースで区切られたプロトコルタイプのリスト。有効なタイプは、「plain」および「ssl」です。

com.sun.jndi.ldap.connect.pool.debug

生成するデバッグ出力のレベルを示す文字列。「fine」(接続の作成と削除のトレース)および「all」(すべてのデバッグ情報)が有効な値です。

デフォルトでは、接続プーリングはplainプロトコルとsslプロトコルの両方で有効になっています。

詳細については、Java LDAP接続プーリング構成ドキュメントを参照してください。

これらのプロパティを設定するには、JAVA_OPTS_APPEND環境変数を設定できます。

export JAVA_OPTS_APPEND=-Dcom.sun.jndi.ldap.connect.pool.initsize=10 -Dcom.sun.jndi.ldap.connect.pool.maxsize=50

トラブルシューティング

カテゴリorg.keycloak.storage.ldapのロギングレベルをTRACEに上げることは有用です。この設定では、LDAPサーバーへのすべてのクエリと、クエリの送信に使用されたパラメーターを含む、多くのロギングメッセージがTRACEレベルでサーバーログに送信されます。ユーザーフォーラムまたはJIRAでLDAPに関する質問を作成する場合は、TRACEロギングを有効にしたサーバーログを添付することを検討してください。大きすぎる場合は、問題を引き起こしている操作中にログに追加されたメッセージを含むサーバーログからのスニペットのみを含めることが適切な代替手段です。

  • LDAPプロバイダーを作成すると、次のINFOレベルのメッセージがサーバーログに表示されます。

Creating new LDAP Store for the LDAP storage provider: ...

これは、LDAPプロバイダーの構成を示しています。質問をしたり、バグを報告する前に、このメッセージを含めてLDAP構成を示すと良いでしょう。最終的には、含めたくない構成の変更をプレースホルダー値に置き換えても構いません。1つの例はbindDn=some-placeholderです。connectionUrlについても、同様に置き換えても構いませんが、使用されたプロトコル(ldapldaps)を少なくとも含めることが一般的に役立ちます。同様に、DEBUGレベルで次のようなメッセージで表示されるLDAPマッパーの構成の詳細を含めることも役立ちます。

Mapper for provider: XXX, Mapper name: YYY, Provider: ZZZ ...

これらのメッセージは、DEBUGロギングが有効になっている場合にのみ表示されることに注意してください。

  • パフォーマンスまたは接続プーリングの問題を追跡するには、プロパティcom.sun.jndi.ldap.connect.pool.debugの値をallに設定することを検討してください。この変更により、LDAP接続プーリングのロギングを含む、多くの追加メッセージがサーバーログに追加されます。その結果、接続プーリングまたはパフォーマンスに関連する問題を追跡できます。詳細については、接続プールの構成を参照してください。

接続プーリングの構成を変更した後、LDAPプロバイダー接続の再初期化を強制するためにKeycloakサーバーを再起動する必要がある場合があります。

サーバーを再起動しても接続プーリングに関するメッセージが表示されない場合は、接続プーリングがLDAPサーバーで動作していないことを示している可能性があります。

  • LDAPの問題を報告する場合、環境で問題を引き起こしているターゲットデータを含むLDAPツリーの一部を添付することを検討してもよいでしょう。例えば、一部のユーザーのログインに時間がかかる場合は、さまざまな「group」エントリのmember属性の数を示す彼のLDAPエントリを添付することを検討できます。この場合、これらのグループエントリがKeycloakの一部のグループLDAPマッパー(またはロールLDAPマッパー)にマップされているかどうかなどを追加すると役立つ場合があります。

SSSDおよびFreeIPAアイデンティティ管理統合

Keycloakには、System Security Services Daemon(SSSD)プラグインが含まれています。SSSDは、FedoraおよびRed Hat Enterprise Linux(RHEL)の一部であり、複数のIDおよび認証プロバイダーへのアクセスを提供します。SSSDは、フェイルオーバーやオフラインサポートなどの利点も提供します。詳細については、Red Hat Enterprise Linuxアイデンティティ管理ドキュメントを参照してください。

SSSDはFreeIPAアイデンティティ管理(IdM)サーバーと統合されており、認証とアクセス制御を提供します。この統合により、Keycloakは特権アクセス管理(PAM)サービスに対して認証を行い、SSSDからユーザーデータを取得できます。Linux環境でのRed Hat Identity Managementの使用に関する詳細については、Red Hat Enterprise Linuxアイデンティティ管理ドキュメントを参照してください。

keycloak sssd freeipa integration overview

KeycloakとSSSDは、読み取り専用のD-Busインターフェースを介して通信します。このため、ユーザーをプロビジョニングおよび更新する方法は、FreeIPA/IdM管理インターフェースを使用することです。デフォルトでは、インターフェースはユーザー名、メールアドレス、名、姓をインポートします。

Keycloakはグループとロールを自動的に登録しますが、同期はしません。グループは、ユーザーが最初にアクセスしたときにSSSDからインポートされ、その後Keycloak内で完全に管理されます。Keycloakの管理者が行った変更は、SSSDまたはその逆と同期しません。

FreeIPA/IdMサーバー

FreeIPAコンテナイメージは、Quay.ioで入手できます。FreeIPAサーバーをセットアップするには、FreeIPAドキュメントを参照してください。

手順
  1. 次のコマンドを使用してFreeIPAサーバーを実行します。

     docker run --name freeipa-server-container -it \
     -h server.freeipa.local -e PASSWORD=YOUR_PASSWORD \
     -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
     -v /var/lib/ipa-data:/data:Z freeipa/freeipa-server

    -hパラメーターとserver.freeipa.localは、FreeIPA/IdMサーバーのホスト名を表します。YOUR_PASSWORDを独自のパスワードに変更します。

  2. コンテナが起動したら、/etc/hostsファイルを次のように変更します。

    x.x.x.x     server.freeipa.local

    この変更を行わない場合は、DNSサーバーをセットアップする必要があります。

  3. 次のコマンドを使用して、LinuxサーバーをIPAドメインに登録し、SSSDフェデレーションプロバイダーがKeycloakで開始および実行されるようにします。

     ipa-client-install --mkhomedir -p admin -w password
  4. クライアントで次のコマンドを実行して、インストールが機能していることを確認します。

     kinit admin
  5. パスワードを入力します。

  6. 次のコマンドを使用して、ユーザーをIPAサーバーに追加します。

    $ ipa user-add <username> --first=<first name> --last=<surname> --email=<email address> --phone=<telephoneNumber> --street=<street> --city=<city> --state=<state> --postalcode=<postal code> --password
  7. kinitを使用してユーザーのパスワードを強制的に設定します。

     kinit <username>
  8. 以下を入力して、通常のIPA操作を復元します。

    kdestroy -A
    kinit admin

SSSDとD-Bus

フェデレーションプロバイダーは、D-BUSを使用してSSSDからデータを取得します。PAMを使用してデータを認証します。

手順
  1. sssd-dbus RPMをインストールします。

    $ sudo yum install sssd-dbus
  2. 次のプロビジョニングスクリプトを実行します。

    $ bin/federation-sssd-setup.sh

    スクリプトは、Keycloak用のSSSDおよびPAMを構成するためのガイドとしても使用できます。次の変更を/etc/sssd/sssd.confに加えます。

      [domain/your-hostname.local]
      ...
      ldap_user_extra_attrs = mail:mail, sn:sn, givenname:givenname, telephoneNumber:telephoneNumber
      ...
      [sssd]
      services = nss, sudo, pam, ssh, ifp
      ...
      [ifp]
      allowed_uids = root, yourOSUsername
      user_attributes = +mail, +telephoneNumber, +givenname, +sn

    ifpサービスがSSSDに追加され、OSユーザーがこのインターフェースを介してIPAサーバーを照会できるように構成されています。

    スクリプトは、SSSD経由でユーザーを認証するための新しいPAMサービス/etc/pam.d/keycloakも作成します。

    auth    required   pam_sss.so
    account required   pam_sss.so
  3. dbus-sendを実行して、セットアップが成功したことを確認します。

    dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe /org/freedesktop/sssd/infopipe org.freedesktop.sssd.infopipe.GetUserAttr string:<username> array:string:mail,givenname,sn,telephoneNumber
    
    dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe /org/freedesktop/sssd/infopipe org.freedesktop.sssd.infopipe.GetUserGroups string:<username>

    設定が成功すると、それぞれのコマンドはユーザーの属性とグループをそれぞれ表示します。タイムアウトまたはエラーが発生した場合、Keycloak上で実行されているフェデレーションプロバイダーはデータを取得できません。このエラーは通常、サーバーがFreeIPA IdMサーバーに登録されていないか、SSSDサービスにアクセスする権限がないために発生します。

    SSSDサービスへのアクセス権限がない場合は、Keycloakサーバーを実行しているユーザーが/etc/sssd/sssd.confファイルの次のセクションに存在することを確認してください。

    [ifp]
    allowed_uids = root, yourOSUsername

    そして、ipaapiシステムユーザーがホスト内に作成されていることを確認してください。このユーザーはifpサービスに必要です。ユーザーがシステム内に作成されているか確認してください。

    grep ipaapi /etc/passwd
    ipaapi:x:992:988:IPA Framework User:/:/sbin/nologin

SSSDフェデレーションプロバイダーの有効化

Keycloakは、D-Busと低レベルで通信するためにDBus-Javaプロジェクトを使用し、オペレーティングシステムのPluggable Authentication Modules(PAM)を介して認証するためにJNAを使用します。

現在、KeycloakはSSSDプロバイダーを実行するために必要なすべてのライブラリを含んでいますが、JDKバージョン21が必要です。したがって、SSSDプロバイダーは、ホスト構成が正しく、JDK 21がKeycloakの実行に使用されている場合にのみ表示されます。

フェデレーションSSSDストアの設定

インストール後、フェデレーションSSSDストアを設定します。

手順
  1. メニューの「User Federation (ユーザーフェデレーション)」をクリックします。

  2. すべてが正常に設定されている場合、Sssdプロバイダーを追加ボタンがページに表示されます。それをクリックしてください。

  3. 新しいプロバイダーに名前を割り当てます。

  4. 保存をクリックします。

これで、FreeIPA/IdMユーザーと認証情報を使用してKeycloakに対して認証できます。

カスタムプロバイダー

Keycloakには、カスタムプロバイダーを開発するためのユーザー・ストレージ・フェデレーション用のサービス・プロバイダー・インターフェース(SPI)があります。カスタムプロバイダーの開発に関するドキュメントは、サーバー開発者ガイドにあります。

ユーザーの管理

管理コンソールから、ユーザーを管理するために実行できる幅広いアクションがあります。

ユーザーの作成

ユーザーを作成するレルムは、それらのユーザーが必要とするアプリケーションを持つことを意図しているレルムです。他のレルムを作成するためだけに使用されるマスターレルムでユーザーを作成することは避けてください。

前提条件
  • マスターレルム以外のレルムにいること。

手順
  1. メニューのユーザーをクリックします。

  2. ユーザーを追加をクリックします。

  3. 新しいユーザーの詳細を入力します。

    ユーザー名は唯一の必須フィールドです。
  4. 保存をクリックします。詳細を保存すると、新しいユーザーの管理ページが表示されます。

ユーザー属性の管理

Keycloakでは、ユーザーは一連の属性に関連付けられています。これらの属性は、Keycloak内でユーザーをより適切に記述および識別するため、およびユーザーに関する追加情報をアプリケーションに渡すために使用されます。

ユーザープロファイルは、ユーザー属性を表すための明確に定義されたスキーマと、レルム内でそれらを管理する方法を定義します。ユーザー情報の一貫したビューを提供することにより、管理者は属性の管理方法に関するさまざまな側面を制御できるだけでなく、Keycloakを拡張して追加の属性をサポートすることをはるかに容易にすることができます。

ユーザープロファイルは主にエンドユーザーが管理できる属性(例:姓と名、電話番号など)を対象としていますが、ユーザーに関連付けるメタデータを管理するためにも役立ちます。

他の機能の中でも、ユーザープロファイルを使用すると、管理者は次のことが可能になります。

  • ユーザー属性のスキーマを定義する

  • 属性がコンテキスト情報に基づいて必須かどうかを定義する(例:ユーザー、管理者、または両方の場合のみ必須か、または要求されているスコープに依存するかなど)。

  • ユーザー属性の表示と編集に関する特定の権限を定義し、一部の属性が第三者(管理者を含む)によって表示または変更されないようにする必要がある厳格なプライバシー要件に準拠できるようにする。

  • ユーザー情報が常に最新であり、属性に関連付けられたメタデータとルールに準拠しているように、ユーザープロファイルのコンプライアンスを動的に強制する

  • 組み込みのバリデーターを活用するか、カスタムバリデーターを作成することにより、属性ごとに検証ルールを定義する

  • 属性定義に従って、登録、プロファイルの更新、ブローカリング、アカウントコンソールでの個人情報など、ユーザーが対話するフォームを動的にレンダリングし、テーマを手動で変更する必要がないようにする。

  • 管理コンソールでユーザー管理インターフェイスをカスタマイズして、属性がユーザープロファイルスキーマに基づいて動的にレンダリングされるようにする

ユーザープロファイルスキーマまたは構成は、属性とそのメタデータを表すためにJSON形式を使用します。管理コンソールから、左側のメニューのレルム設定をクリックし、そのページのユーザープロファイルタブをクリックして構成を管理できます。

次のセクションでは、独自のユーザープロファイルスキーマまたは構成を作成する方法と、属性を管理する方法について説明します。

デフォルト構成の理解

デフォルトでは、Keycloakは最も一般的なユーザー属性の一部をカバーする基本的なユーザープロファイル構成を提供します。

名前 説明

ユーザー名

ユーザー名

メール

エンドユーザーの優先メールアドレス。

firstName

エンドユーザーの名

lastName

エンドユーザーの姓

Keycloakでは、username属性とemail属性の両方が、ユーザーアカウントを識別、認証、およびリンクするためによく使用されるため、特別な処理が施されています。これらの属性については、設定の変更に制限されており、削除することはできません。

username属性とemail属性の両方の動作は、レルムのログイン設定に応じて変化します。たとえば、メールをユーザー名として使用またはユーザー名の編集を許可設定を変更すると、ユーザープロファイル構成で設定した構成が上書きされます。

次のセクションで説明するように、独自の属性を取り込んだり、利用可能な属性の設定を変更したりして、ニーズに合わせてデフォルト構成を自由に変更できます。

ユーザープロファイルコンテキストの理解

Keycloakでは、ユーザーはさまざまなコンテキストを通じて管理されます。

  • 登録

  • プロファイルの更新

  • ブローカーまたはソーシャルプロバイダーを介して認証する際のプロファイルの確認

  • アカウントコンソール

  • 管理(例:管理コンソールとAdmin REST API)

管理コンテキストを除き、他のすべてのコンテキストは、ユーザーのセルフサービスフローに関連するため、エンドユーザーコンテキストと見なされます。

これらのコンテキストを知ることは、ユーザーを管理する際にユーザープロファイル構成がどこで有効になるかを理解するために重要です。ユーザーが管理されているコンテキストに関係なく、同じユーザープロファイル構成がUIのレンダリングと属性値の検証に使用されます。

次のセクションで説明するように、特定の属性を管理コンテキストからのみ利用可能にし、エンドユーザーに対して完全に無効にすることができます。管理者に特定のユーザー属性へのアクセスを許可せず、エンドユーザーのみに許可する場合も同様です。

管理対象および非管理対象属性の理解

デフォルトでは、Keycloakはユーザープロファイル構成で定義された属性のみを認識します。サーバーは、そこで明示的に定義されていない他の属性をすべて無視します。

ユーザーに設定できるユーザー属性と、それらの値がどのように検証されるかについて厳密にすることで、Keycloakはレルムに別の防御壁を追加し、ユーザーに関連付けられた予期しない属性と値を防ぐのに役立ちます。

そうは言っても、ユーザー属性は次のように分類できます。

  • 管理対象。これらはユーザープロファイルによって制御される属性であり、エンドユーザーと管理者が任意のユーザープロファイルコンテキストから管理できるようにする属性です。これらの属性については、いつ、どのように管理するかを完全に制御したいと考えています。

  • 非管理対象。これらはユーザープロファイルで明示的に定義していない属性であり、デフォルトではKeycloakによって完全に無視されます。

非管理対象属性はデフォルトで無効になっていますが、さまざまなポリシーを使用してレルムを構成し、サーバーによる処理方法を定義できます。そのためには、左側のメニューのレルム設定をクリックし、一般タブをクリックして、非管理対象属性設定から次のいずれかのオプションを選択します。

  • 無効。これはデフォルトのポリシーであり、非管理対象属性はすべてのユーザープロファイルコンテキストから無効になります。

  • 有効。このポリシーは、すべてのユーザープロファイルコンテキストに対して非管理対象属性を有効にします。

  • 管理者は表示可能。このポリシーは、管理コンテキストからのみ非管理対象属性を読み取り専用として有効にします。

  • 管理者は編集可能。このポリシーは、管理コンテキストからのみ非管理対象属性を読み取りおよび書き込み可能として有効にします。

これらのポリシーにより、サーバーが非管理対象属性をどのように処理するかをきめ細かく制御できます。管理コンテキストを介してユーザーを管理する場合、非管理対象属性を完全に無効にするか、またはサポートのみにすることを選択できます。

非管理対象属性が(部分的であっても)有効になっている場合、管理コンソールのユーザー詳細UIの属性タブから管理できます。ポリシーが無効に設定されている場合、このタブは使用できません。

セキュリティに関する推奨事項として、可能な限り最も厳格なポリシー(例:無効または管理者は編集可能)に準拠して、エンドユーザーコンテキストを通じてプロファイルを管理する際に、予期しない属性(および値)がユーザーに設定されるのを防ぐようにしてください。有効ポリシーを設定することは避け、エンドユーザーが管理できるすべての属性をユーザープロファイル構成で制御下に定義することを推奨します。

有効ポリシーは、以前のバージョンのKeycloakから移行するレルム、およびカスタムテーマを使用してサーバーを拡張し、独自のカスタムユーザー属性を使用する場合に、動作の破損を回避することを目的としています。

次のセクションで説明するように、属性の対象者を制限して、ユーザーおよび/または管理者が表示または書き込み可能にするかどうかを選択することもできます。

非管理対象属性の場合、最大長は2048文字です。異なる最小長または最大長を指定するには、非管理対象属性を管理対象属性に変更し、lengthバリデーターを追加します。

Keycloakは、ユーザー関連のオブジェクトを内部キャッシュにキャッシュします。属性が長ければ長いほど、キャッシュが消費するメモリが多くなります。したがって、長さ属性のサイズを制限することをお勧めします。大きなオブジェクトをKeycloakの外部に保存し、IDまたはURLで参照することを検討してください。

ユーザープロファイルの管理

ユーザープロファイル構成は、レルムごとに管理されます。そのためには、左側のメニューのレルム設定リンクをクリックし、ユーザープロファイルタブをクリックします。

ユーザープロファイルタブ

user profile tab

属性サブタブには、すべての管理対象属性のリストがあります。

属性グループサブタブでは、属性グループを管理できます。属性グループを使用すると、ユーザー向けのフォームをレンダリングするときに属性をまとめて表示するように関連付けることができます。

JSONエディターサブタブでは、JSON構成を表示および編集できます。このタブを使用して、現在の構成を取得したり、手動で管理したりできます。このタブで行った変更は、他のタブにも反映され、逆もまた同様です。

次のセクションでは、属性の管理方法について学習します。

属性の管理

属性 サブタブでは、管理対象の属性を作成、編集、および削除できます。

新しい属性を定義し、ユーザープロファイルに関連付けるには、属性リストの上部にある 属性の作成 ボタンをクリックします。

属性設定

user profile create attribute

属性を設定する際には、以下の設定を定義できます

名前

属性の名前。属性を一意に識別するために使用されます。

表示名

属性のユーザーフレンドリーな名前。主にユーザー向けフォームのレンダリング時に使用されます。 国際化されたメッセージの使用 もサポートしています。

複数値

有効にすると、属性は複数の値をサポートし、UIは複数の値を設定できるようにレンダリングされます。この設定を有効にする場合は、値の数にハードリミットを設定するためのバリデーターを追加してください。

属性グループ

属性が属する属性グループ(存在する場合)。

有効にする条件

属性を有効または無効にします。 常に に設定すると、属性はすべてのユーザープロファイルコンテキストから利用可能になります。 スコープがリクエストされた場合 に設定すると、属性はユーザーに代わって動作するクライアントが1つ以上のスコープのセットをリクエストしている場合にのみ利用可能になります。このオプションを使用すると、リクエストされているクライアントスコープに応じて、特定の属性を動的に強制できます。管理コンソールの場合、スコープは評価されず、属性は常に有効になります。これは、スコープによる属性のフィルタリングが、エンドユーザー認証フローの実行時にのみ機能するためです。

必須

属性を必須としてマークする条件を設定します。無効にすると、属性はオプションになります。有効にすると、 必須条件 設定を構成して、ユーザープロファイルコンテキストに応じて属性を必須としてマークし、属性がエンドユーザー(エンドユーザーコンテキスト経由)または管理者(管理コンテキスト経由)、またはその両方に対して必須となるようにできます。 必須条件 設定を構成して、1つ以上のクライアントスコープのセットがリクエストされた場合にのみ属性を必須としてマークすることもできます。 常に に設定すると、属性はすべてのユーザープロファイルコンテキストから必須になります。 スコープがリクエストされた場合 に設定すると、属性はユーザーに代わって動作するクライアントが1つ以上のスコープのセットをリクエストしている場合にのみ必須になります。アカウントコンソールと管理コンソールの場合、スコープは評価されず、属性は必須ではありません。これは、スコープによる属性のフィルタリングが、認証フローの実行時にのみ機能するためです。

パーミッション

このセクションでは、属性がエンドユーザーまたは管理コンテキストから管理されている場合に、読み取りおよび書き込みパーミッションを定義できます。 編集可能なユーザー 設定は、エンドユーザーおよび管理コンテキストから、それぞれ ユーザー および/または 管理者 による書き込み可能として属性をマークします。 閲覧可能なユーザー 設定は、エンドユーザーおよび管理コンテキストから、それぞれ ユーザー および/または 管理者 による読み取り専用として属性をマークします。

検証

このセクションでは、属性値を管理する際に実行される検証を定義できます。 Keycloakは、独自のバリデーターを追加できる可能性のある組み込みバリデーターのセットを提供します。詳細については、属性の検証 セクションを参照してください。

注釈

このセクションでは、注釈を属性に関連付けることができます。注釈は、主にレンダリングの目的で追加のメタデータをフロントエンドに渡すのに役立ちます。詳細については、UI注釈の定義 セクションを参照してください。

属性を作成すると、属性がエンドユーザーに予期せず公開されるのを防ぐために、属性は管理コンテキストからのみ利用可能になります。実際には、エンドユーザーがエンドユーザーコンテキストを介してプロファイルを管理している場合、属性はエンドユーザーにアクセスできなくなります。 パーミッション 設定は、必要に応じていつでも変更できます。

属性の検証

管理対象の属性に対して検証を有効にして、属性値が特定のルールに準拠していることを確認できます。そのためには、属性を管理する際に 検証 設定からバリデーターを追加または削除できます。

属性の検証

user profile validation

検証は、属性への書き込み時にいつでも行われ、値が検証に失敗した場合にUIに表示されるエラーをスローする可能性があります。

セキュリティ上の理由から、ユーザーが編集可能なすべての属性には、ユーザーが入力する値のサイズを制限するための検証が必要です。 length バリデーターが指定されていない場合、Keycloakはデフォルトで最大長を2048文字に設定します。

組み込みバリデーター

Keycloakは、選択できる組み込みバリデーターをいくつか提供しており、Validator SPI を拡張して独自のバリデーターを提供することもできます。

以下のリストは、すべての組み込みバリデーターのリストを示しています

名前 説明 構成

length

最小長と最大長に基づいて、文字列値の長さを確認します。

min: 許容される最小長を定義する整数。

max: 許容される最大長を定義する整数。

trim-disabled: 検証前に値をトリムするかどうかを定義するブール値。

integer

値が整数であり、下限および/または上限範囲内にあるかどうかを確認します。範囲が定義されていない場合、バリデーターは値が有効な数値であるかどうかのみを確認します。

min: 下限範囲を定義する整数。

max: 上限範囲を定義する整数。

double

値がdoubleであり、下限および/または上限範囲内にあるかどうかを確認します。範囲が定義されていない場合、バリデーターは値が有効な数値であるかどうかのみを確認します。

min: 下限範囲を定義する整数。

max: 上限範囲を定義する整数。

uri

値が有効なURIであるかどうかを確認します。

なし

pattern

値が特定のRegExパターンに一致するかどうかを確認します。

pattern: 値を検証するときに使用するRegExパターン。

error-message: i18nバンドルのエラーメッセージのキー。設定されていない場合は、一般的なメッセージが使用されます。

メール

値が有効な電子メール形式であるかどうかを確認します。

max-local-length: メールローカルパートの最大長を定義する整数。仕様ごとにデフォルトは64です。

local-date

値がレルムおよび/またはユーザーロケールに基づいて有効な形式であるかどうかを確認します。

なし

iso-date

値がISO 8601に基づいて有効な形式であるかどうかを確認します。このバリデーターは、html5-date入力タイプを使用する入力で使用できます。

なし

person-name-prohibited-characters

スクリプトインジェクションなどの攻撃に対する追加の障壁として、値が有効な人名であるかどうかを確認します。検証は、人名では一般的でない文字をブロックするデフォルトのRegExパターンに基づいています。

error-message: i18nバンドルのエラーメッセージのキー。設定されていない場合は、一般的なメッセージが使用されます。

username-prohibited-characters

スクリプトインジェクションなどの攻撃に対する追加の障壁として、値が有効なユーザー名であるかどうかを確認します。検証は、ユーザー名では一般的でない文字をブロックするデフォルトのRegExパターンに基づいています。レルム設定 メールをユーザー名として使用 が有効になっている場合、このバリデーターはスキップされてメール値を許可します。

error-message: i18nバンドルのエラーメッセージのキー。設定されていない場合は、一般的なメッセージが使用されます。

options

値が定義された許可値のセットからのものであるかどうかを確認します。 selectフィールドおよびmultiselectフィールドを介して入力された値を検証するのに役立ちます。

options: 許可された値を含む文字列の配列。

up-username-not-idn-homograph

フィールドには、ラテン文字と一般的なUnicode文字のみを含めることができます。 IDNホモグラフ攻撃の対象となる可能性のあるフィールド(通常はユーザー名)に役立ちます。

error-message: i18nバンドルのエラーメッセージのキー。設定されていない場合は、一般的なメッセージが使用されます。

multivalued

複数値属性のサイズを検証します。

min: 属性値の許容される最小数を定義する整数。

max: 属性値の許容される最大数を定義する整数。

UI注釈の定義

追加情報をフロントエンドに渡すために、属性を注釈で装飾して、属性のレンダリング方法を指示できます。この機能は、主にKeycloakテーマを拡張して、属性に関連付けられた注釈に基づいてページを動的にレンダリングする場合に役立ちます。

注釈は、たとえば、属性のHTML type の変更 および 属性のDOM表現の変更 に使用されます。これについては、次のセクションで説明します。

属性注釈

user profile annotation

注釈は、UIと共有されるキー/値ペアであり、属性に対応するHTML要素のレンダリング方法を変更できます。レルムが使用しているテーマで注釈がサポートされている限り、任意の注釈を属性に設定できます。

唯一の制限は、キーに kc プレフィックスを使用する注釈の使用を避けることです。これは、このプレフィックスを使用する注釈はKeycloak用に予約されているためです。

組み込み注釈

次の注釈は、Keycloak組み込みテーマでサポートされています

名前 説明

inputType

フォーム入力フィールドのタイプ。使用可能なタイプは、以下の表で説明されています。

inputHelperTextBefore

入力フィールドの前(上)にレンダリングされるヘルパーテキスト。直接テキストまたは国際化パターン(${i18n.key} など)をここで使用できます。テキストはページにレンダリングされるときにHTMLエスケープされないため、ここでHTMLタグを使用してテキストをフォーマットできますが、HTML制御文字を正しくエスケープする必要もあります。

inputHelperTextAfter

入力フィールドの後(下)にレンダリングされるヘルパーテキスト。直接テキストまたは国際化パターン(${i18n.key} など)をここで使用できます。テキストはページにレンダリングされるときにHTMLエスケープされないため、ここでHTMLタグを使用してテキストをフォーマットできますが、HTML制御文字を正しくエスケープする必要もあります。

inputOptionsFromValidation

selectタイプおよびmultiselectタイプの注釈。入力オプションを取得するためのカスタム属性検証のオプション名。以下の 詳細な説明 を参照してください。

inputOptionLabelsI18nPrefix

selectタイプおよびmultiselectタイプの注釈。 UIでオプションをレンダリングするための国際化キープレフィックス。以下の 詳細な説明 を参照してください。

inputOptionLabels

selectタイプおよびmultiselectタイプの注釈。オプションのUIラベルを定義するためのオプションマップ(直接または国際化を使用)。以下の 詳細な説明 を参照してください。

inputTypePlaceholder

フィールドに適用されるHTML入力 placeholder 属性 - 入力フィールドの予期される値を記述する短いヒント(例:サンプル値または予期される形式の簡単な説明)を指定します。短いヒントは、ユーザーが値を入力する前に入力フィールドに表示されます。

inputTypeSize

フィールドに適用されるHTML入力 size 属性 - 単一行入力フィールドの幅を文字数で指定します。 HTML select タイプに基づくフィールドの場合、表示されるオプションの行数を指定します。使用されているテーマのCSSによっては機能しない場合があります!

inputTypeCols

フィールドに適用されるHTML入力 cols 属性 - textarea タイプの幅を文字数で指定します。使用されているテーマのCSSによっては機能しない場合があります!

inputTypeRows

フィールドに適用されるHTML入力 rows 属性 - textarea タイプの高さを文字数で指定します。 selectフィールドの場合、表示されるオプションの行数を指定します。使用されているテーマのCSSによっては機能しない場合があります!

inputTypePattern

クライアント側の検証を提供するフィールドに適用されるHTML入力 pattern 属性 - 入力フィールドの値が照合される正規表現を指定します。単一行入力に役立ちます。

inputTypeMaxLength

クライアント側の検証を提供するフィールドに適用されるHTML入力 maxlength 属性 - 入力フィールドに入力できるテキストの最大長。テキストフィールドに役立ちます。

inputTypeMinLength

クライアント側の検証を提供するフィールドに適用されるHTML入力 minlength 属性 - 入力フィールドに入力できるテキストの最小長。テキストフィールドに役立ちます。

inputTypeMax

クライアント側の検証を提供するフィールドに適用されるHTML入力 max 属性 - 入力フィールドに入力できる最大値。数値フィールドに役立ちます。

inputTypeMin

クライアント側の検証を提供するフィールドに適用されるHTML入力 min 属性 - 入力フィールドに入力できる最小値。数値フィールドに役立ちます。

inputTypeStep

フィールドに適用されるHTML入力 step 属性 - 入力フィールドの有効な数値間の間隔を指定します。数値フィールドに役立ちます。

数値形式

設定されている場合、data-kcNumberFormat 属性がフィールドに追加され、指定された形式に基づいて値をフォーマットします。この注釈は、形式が決定された位置に予期される桁数に基づいている数値が対象です。たとえば、形式 ({2}) {5}-{4} は、フィールド値を (00) 00000-0000 にフォーマットします。

数値形式解除

設定されている場合、data-kcNumberUnFormat 属性がフィールドに追加され、フォームを送信する前に指定された形式に基づいて値をフォーマットします。この注釈は、特定の属性の形式を保存したくないが、クライアント側でのみ値をフォーマットしたい場合に役立ちます。たとえば、現在の値が (00) 00000-0000 の場合、この注釈に値 {11} または1つ以上の桁グループのセットを指定することで必要なその他の形式を設定すると、値は 00000000000 に変わります。値を保存する前に、サーバー側の検証を実行するためのバリデーターを追加してください。

フィールドタイプは、HTMLフォームフィールドタグとそれらに適用される属性を使用します。これらは、HTML仕様とブラウザーのサポートに基づいて動作します。

視覚的なレンダリングは、使用されているテーマで適用されるCSSスタイルにも依存します。

属性のHTML type の変更

inputType 注釈を設定することで、HTML5入力要素の type を変更できます。使用可能なタイプは次のとおりです

名前 説明 使用されるHTMLタグ

text

単一行テキスト入力。

input

textarea

複数行テキスト入力。

textarea

select

一般的な単一選択入力。以下の オプションの構成方法の説明 を参照してください。

select

select-radiobuttons

ラジオボタンのグループを介した単一選択入力。以下の オプションの構成方法の説明 を参照してください。

入力グループ

multiselect

一般的な複数選択入力。以下の オプションの構成方法の説明 を参照してください。

select

multiselect-checkboxes

チェックボックスのグループを介した複数選択入力。以下の オプションの構成方法の説明 を参照してください。

入力グループ

html5-email

HTML 5仕様に基づく電子メールアドレス用の単一行テキスト入力。

input

html5-tel

HTML 5仕様に基づく電話番号用の単一行テキスト入力。

input

html5-url

HTML 5仕様に基づくURL用の単一行テキスト入力。

input

html5-number

HTML 5仕様に基づく数値(step に応じて整数または浮動小数点数)用の単一行入力。

input

html5-range

HTML 5仕様に基づく数値入力用のスライダー。

input

html5-datetime-local

HTML 5仕様に基づく日付時刻入力。

input

html5-date

HTML 5仕様に基づく日付入力。

input

html5-month

HTML 5 仕様に基づく月入力。

input

html5-week

HTML 5 仕様に基づく週入力。

input

html5-time

HTML 5 仕様に基づく時間入力。

input

セレクトフィールドとマルチセレクトフィールドのオプションの定義

セレクトフィールドとマルチセレクトフィールドのオプションは、UI に表示されるバリデーションとフィールドオプションが常に一貫していることを保証するために、属性に適用されるバリデーションから取得されます。デフォルトでは、オプションは組み込みの options バリデーションから取得されます。

セレクトおよびマルチセレクトオプションに、わかりやすい人間が読めるラベルを提供するには、さまざまな方法を使用できます。最も簡単なケースは、属性値が UI ラベルと同じ場合です。この場合、追加の構成は必要ありません。

UI ラベルと同じオプション値

user profile select options simple

属性値が UI に適さない ID のようなものである場合は、inputOptionLabelsI18nPrefix アノテーションによって提供される簡単な国際化サポートを使用できます。これは国際化キーのプレフィックスを定義し、オプション値はこのプレフィックスにドットで追加されます。

i18n キープレフィックスを使用した UI ラベルの簡単な国際化

user profile select options simple i18n

オプション値のローカライズされた UI ラベルテキストは、共通のローカライズメカニズムを使用して、userprofile.jobtitle.sweng および userprofile.jobtitle.swarch キーによって提供される必要があります。

inputOptionLabels アノテーションを使用して、個々のオプションのラベルを提供することもできます。これには、オプションのラベルのマップが含まれています。マップ内のキーはオプション値(バリデーションで定義)であり、マップ内の値は UI ラベルテキスト自体、またはそのオプションの国際化パターン(${i18n.key} など)です。

inputOptionLabels アノテーション値としてマップを入力するには、ユーザープロファイル JSON Editor を使用する必要があります。

国際化なしで個々のオプションに直接入力されたラベルの例

"attributes": [
<...
{
  "name": "jobTitle",
  "validations": {
    "options": {
      "options":[
        "sweng",
        "swarch"
      ]
    }
  },
  "annotations": {
    "inputType": "select",
    "inputOptionLabels": {
      "sweng": "Software Engineer",
      "swarch": "Software Architect"
    }
  }
}
...
]

国際化された個々のオプションのラベルの例

"attributes": [
...
{
  "name": "jobTitle",
  "validations": {
    "options": {
      "options":[
        "sweng",
        "swarch"
      ]
    }
  },
  "annotations": {
    "inputType": "select-radiobuttons",
    "inputOptionLabels": {
      "sweng": "${jobtitle.swengineer}",
      "swarch": "${jobtitle.swarchitect}"
    }
  }
}
...
]

ローカライズされたテキストは、共通のローカライズメカニズムを使用して、jobtitle.swengineer および jobtitle.swarchitect キーによって提供される必要があります。

カスタムバリデーターは、inputOptionsFromValidation 属性アノテーションのおかげでオプションを提供するために使用できます。このバリデーションには、オプションの配列を提供する options 設定が必要です。国際化は、組み込みの options バリデーションによって提供されるオプションと同じように機能します。

カスタムバリデーターによって提供されるオプション

user profile select options custom validator

属性の DOM 表現の変更

kc プレフィックスを持つアノテーションを設定することで、追加のクライアント側動作を有効にできます。これらのアノテーションは、属性の対応する要素の HTML 属性に変換され、data- がプレフィックスとして付加され、同じ名前のスクリプトが動的ページにロードされ、カスタム data- 属性に基づいて DOM から要素を選択し、DOM 表現を変更することでそれらを適切に装飾できます。

たとえば、属性に kcMyCustomValidation アノテーションを追加すると、HTML 属性 data-kcMyCustomValidation が属性の対応する HTML 要素に追加され、JavaScript モジュールがカスタムテーマの <THEME TYPE>/resources/js/kcMyCustomValidation.js からロードされます。カスタム JavaScript モジュールをテーマにデプロイする方法の詳細については、サーバー開発者ガイドを参照してください。

JavaScript モジュールは、DOM および各属性に対してレンダリングされた要素をカスタマイズするために任意のコードを実行できます。そのためには、userProfile.js モジュールを使用して、次のようにカスタムアノテーションのアノテーション記述子を登録できます。

import { registerElementAnnotatedBy } from "./userProfile.js";

registerElementAnnotatedBy({
  name: 'kcMyCustomValidation',
  onAdd(element) {
    var listener = function (event) {
        // do something on keyup
    };

    element.addEventListener("keyup", listener);

    // returns a cleanup function to remove the event listener
    return () => element.removeEventListener("keyup", listener);
  }
});

registerElementAnnotatedBy は、アノテーション記述子を登録するためのメソッドです。記述子は、アノテーション名を参照する name と、onAdd 関数を持つオブジェクトです。ページがレンダリングされるか、アノテーション付きの属性が DOM に追加されるたびに、onAdd 関数が呼び出され、要素の動作をカスタマイズできます。

onAdd 関数は、クリーンアップを実行する関数を返すこともできます。たとえば、要素にイベントリスナーを追加する場合、要素が DOM から削除された場合にそれらを削除する必要がある場合があります。

または、userProfile.js がニーズに十分でない場合は、必要な JavaScript コードを使用することもできます。

document.querySelectorAll(`[data-kcMyCustomValidation]`).forEach((element) => {
    var listener = function (evt) {
        // do something on keyup
    };

    element.addEventListener("keyup", listener);
  });

属性グループの管理

属性グループ サブタブでは、属性グループの作成、編集、および削除を行うことができます。属性グループを使用すると、関連する属性のコンテナを定義して、ユーザー向けフォームで一緒にレンダリングされるようにすることができます。

属性グループリスト

user profile attribute group list

属性にバインドされている属性グループは削除できません。そのためには、最初に属性を更新してバインディングを削除する必要があります。

新しいグループを作成するには、属性グループリストの上部にある 属性グループを作成 ボタンをクリックします。

属性グループ構成

user profile create attribute group

グループを構成するときは、次の設定を定義できます。

名前

属性の名前。属性を一意に識別するために使用されます。

表示名

属性のユーザーフレンドリーな名前。主にユーザー向けフォームのレンダリング時に使用されます。 国際化されたメッセージの使用 もサポートしています。

説明を表示

ユーザー向けフォームをレンダリングするときにツールチップとして表示されるユーザーフレンドリーなテキスト。 国際化されたメッセージの使用 もサポートしています。

注釈

このセクションでは、アノテーションを属性に関連付けることができます。アノテーションは、主にレンダリング目的で追加のメタデータをフロントエンドに渡すのに役立ちます。

JSON 構成の使用

ユーザープロファイル構成は、適切に定義された JSON スキーマを使用して保存されます。JSON エディター サブタブをクリックして、ユーザープロファイル構成を直接編集することを選択できます。

JSON 構成

user profile json config

JSON スキーマは次のように定義されています。

{
  "unmanagedAttributePolicy": "DISABLED",
  "attributes": [
    {
      "name": "myattribute",
      "multivalued": false,
      "displayName": "My Attribute",
      "group": "personalInfo",
      "required": {
        "roles": [ "user", "admin" ],
        "scopes": [ "foo", "bar" ]
      },
      "permissions": {
        "view": [ "admin", "user" ],
        "edit": [ "admin", "user" ]
      },
      "validations": {
        "email": {
          "max-local-length": 64
        },
        "length": {
          "max": 255
        }
      },
      "annotations": {
        "myannotation": "myannotation-value"
      }
    }
  ],
  "groups": [
    {
      "name": "personalInfo",
      "displayHeader": "Personal Information",
      "annotations": {
        "foo": ["foo-value"],
        "bar": ["bar-value"]
      }
    }
  ]
}

スキーマは、必要な数の属性とグループをサポートします。

unmanagedAttributePolicy プロパティは、次のいずれかの値を設定することにより、アンマネージド属性ポリシーを定義します。詳細については、マネージド属性とアンマネージド属性の理解 を参照してください。

  • DISABLED

  • ENABLED

  • ADMIN_VIEW

  • ADMIN_EDIT

属性スキーマ

各属性について、name と、オプションで requiredpermission、および annotations 設定を定義する必要があります。

required プロパティは、属性が必須かどうかを定義します。Keycloak では、さまざまな条件に基づいて属性を必須として設定できます。

required プロパティが空のオブジェクトとして定義されている場合、属性は常に必須です。

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {}
  ]
}

一方、ユーザー、管理者、またはその両方に対してのみ属性を必須にすることを選択できます。また、ユーザーが Keycloak で認証するときに特定のスコープが要求された場合にのみ、属性を必須としてマークすることもできます。

ユーザーおよび/または管理者に対して属性を必須としてマークするには、次のように roles プロパティを設定します。

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {
        "roles": ["user"]
      }
  ]
}

roles プロパティは、属性がユーザーまたは管理者によって必須であるかによって、値が user または admin のいずれかになる可能性がある配列を予期します。

同様に、クライアントがユーザーを認証するときに 1 つ以上のスコープのセットが要求された場合に、属性を必須にすることを選択できます。そのためには、次のように scopes プロパティを使用できます。

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {
        "scopes": ["foo"]
      }
  ]
}

scopes プロパティは、クライアントスコープを表す任意の文字列にすることができる値の配列です。

属性レベルの permissions プロパティを使用して、属性に対する読み取りおよび書き込み権限を定義できます。権限は、ユーザー、管理者、またはその両方によって属性に対してこれらの操作を実行できるかどうかに基づいて設定されます。

{
  "attributes": [
    {
      "name": "myattribute",
      "permissions": {
        "view": ["admin"],
        "edit": ["user"]
      }
  ]
}

view プロパティと edit プロパティの両方は、属性がユーザーまたは管理者によって表示可能または編集可能であるかによって、値が user または admin のいずれかになる可能性がある配列を予期します。

edit 権限が付与されると、view 権限が暗黙的に付与されます。

属性レベルの annotation プロパティを使用して、追加のメタデータを属性に関連付けることができます。アノテーションは、主にユーザープロファイル構成に基づいてユーザー属性をレンダリングするフロントエンドに属性に関する追加情報を渡すのに役立ちます。各アノテーションはキー/バリューペアです。

{
  "attributes": [
    {
      "name": "myattribute",
      "annotations": {
        "foo": ["foo-value"],
        "bar": ["bar-value"]
      }
  ]
}
属性グループスキーマ

各属性グループについて、name と、オプションで annotations 設定を定義する必要があります。

属性レベルの annotation プロパティを使用して、追加のメタデータを属性に関連付けることができます。アノテーションは、主にユーザープロファイル構成に基づいてユーザー属性をレンダリングするフロントエンドに属性に関する追加情報を渡すのに役立ちます。各アノテーションはキー/バリューペアです。

UI のレンダリング方法のカスタマイズ

すべてのユーザープロファイルコンテキスト(管理コンソールを含む)からの UI は、ユーザープロファイル構成に従って動的にレンダリングされます。

デフォルトのレンダリングメカニズムは、次の機能を提供します。

  • 属性に設定された権限に基づいてフィールドを表示または非表示にします。

  • 属性に設定された制約に基づいて、必須フィールドのマーカーをレンダリングします。

  • 属性に設定されたフィールド入力タイプ(テキスト、日付、数値、セレクト、マルチセレクト)を変更します。

  • 属性に設定された権限に応じて、フィールドを読み取り専用としてマークします。

  • 属性に設定された順序に応じてフィールドを並べ替えます。

  • 同じ属性グループに属するフィールドをグループ化します。

  • 同じ属性グループに属するフィールドを動的にグループ化します。

属性の順序付け

属性の順序は、属性リストページで属性行をドラッグアンドドロップして設定します。

属性の順序付け

user profile attribute list order

このページで設定した順序は、動的フォームでフィールドがレンダリングされるときに尊重されます。

属性のグループ化

動的フォームがレンダリングされると、同じ属性グループに属する属性をグループ化しようとします。

動的プロファイル更新フォーム

user profile update profile

属性が属性グループにリンクされている場合、同じグループ内の属性が同じグループヘッダー内で互いに近くになるように、属性の順序も重要です。そうしないと、グループ内の属性が連続した順序になっていない場合、動的フォームで同じグループヘッダーが複数回レンダリングされる可能性があります。

プログレッシブプロファイリングの有効化

エンドユーザープロファイルが構成に準拠していることを確認するために、管理者は VerifyProfile 必須アクションを使用して、Keycloak に認証するときにユーザーにプロファイルを更新させる場合があります。

VerifyProfile アクションは、UpdateProfile アクションに似ています。ただし、ユーザープロファイルによって提供されるすべての機能を活用して、ユーザープロファイル構成への準拠を自動的に強制します。

有効にすると、VerifyProfile アクションは、ユーザーが認証するときに次の手順を実行します。

  • ユーザープロファイルが、レルムに設定されたユーザープロファイル構成に完全に準拠しているかどうかを確認します。つまり、バリデーションを実行し、それらがすべて成功していることを確認します。

  • そうでない場合は、認証中に追加の手順を実行して、ユーザーが不足している属性または無効な属性を更新できるようにします。

  • ユーザープロファイルが構成に準拠している場合、追加の手順は実行されず、ユーザーは認証プロセスを続行します。

VerifyProfile アクションはデフォルトで有効になっています。無効にするには、左側のメニューの 認証 リンクをクリックし、次に 必須アクション タブをクリックします。このタブで、VerifyProfile アクションの 有効 スイッチを使用して無効にします。

VerifyProfile 必須アクションの登録

user profile register verify profile action

国際化されたメッセージの使用

属性、属性グループ、およびアノテーションを構成するときに国際化されたメッセージを使用する場合は、メッセージバンドルからのメッセージに変換されるプレースホルダーを使用して、表示名、説明、および値を設定できます。

そのためには、メッセージキーを解決するために、${myAttributeName} などのプレースホルダーを使用できます。ここで、myAttributeName はメッセージバンドル内のメッセージのキーです。詳細については、カスタムテーマにメッセージバンドルを追加する方法に関する サーバー開発者ガイド を参照してください。

ユーザー資格情報の定義

ユーザーの資格情報は、資格情報 タブで管理できます。

資格情報管理

user credentials

行をドラッグアンドドロップして、資格情報の優先度を変更します。新しい順序は、そのユーザーの資格情報の優先度を決定します。最上位の資格情報が最も優先度が高くなります。優先度によって、ユーザーがログインした後に最初に表示される資格情報が決まります。

タイプ

この列には、資格情報のタイプが表示されます。たとえば、password または OTP です。

ユーザーラベル

これは、ログイン中に選択オプションとして表示されたときに資格情報を認識するための割り当て可能なラベルです。資格情報を説明するために任意の値に設定できます。

データ

これは、資格情報に関する非機密の技術情報です。デフォルトでは非表示になっています。データを表示…​ をクリックすると、資格情報のデータが表示されます。

アクション

パスワードをリセット をクリックしてユーザーのパスワードを変更し、削除 をクリックして資格情報を削除します。

管理者コンソールでは、特定のユーザーに対して他のタイプの資格情報を構成することはできません。そのタスクはユーザーの責任です。

ユーザーが OTP デバイスを紛失した場合、または資格情報が侵害された場合に、ユーザーの資格情報を削除できます。資格情報 タブでのみユーザーの資格情報を削除できます。

ユーザーのパスワードの設定

ユーザーがパスワードを持っていない場合、またはパスワードが削除された場合、パスワード設定セクションが表示されます。

ユーザーがすでにパスワードを持っている場合は、パスワードリセットセクションでリセットできます。

手順
  1. メニューのUsersをクリックします。Usersページが表示されます。

  2. ユーザーを選択します。

  3. Credentialsタブをクリックします。

  4. パスワード設定セクションに新しいパスワードを入力します。

  5. パスワード設定をクリックします。

    TemporaryONの場合、ユーザーは最初のログイン時にパスワードを変更する必要があります。ユーザーが指定されたパスワードを保持できるようにするには、TemporaryOFFに設定します。ユーザーはパスワードを変更するためにパスワード設定をクリックする必要があります。

ユーザーにパスワードのリセットを要求する

ユーザーにパスワードのリセットを要求することもできます。

手順
  1. メニューのUsersをクリックします。Usersページが表示されます。

  2. ユーザーを選択します。

  3. Credentialsタブをクリックします。

  4. Credential Resetをクリックします。

  5. リストからUpdate Passwordを選択します。

  6. Send Emailをクリックします。送信されたメールには、Update Passwordウィンドウにユーザーを誘導するリンクが含まれています。

  7. オプションで、メールリンクの有効期間を設定できます。これは、Realm SettingsTokensタブでデフォルトプリセットに設定されています。

OTPの作成

レルムでOTPが条件付きである場合、ユーザーは新しいOTPジェネレーターを再設定するためにKeycloakアカウントコンソールに移動する必要があります。OTPが必須の場合、ユーザーはログイン時に新しいOTPジェネレーターを再設定する必要があります。

または、ユーザーにOTPジェネレーターのリセットを要求するメールを送信できます。以下の手順は、ユーザーがすでにOTPクレデンシャルを持っている場合にも適用されます。

前提条件
  • 適切なレルムにログインしていることを確認してください。

手順
  1. メインメニューのUsersをクリックします。Usersページが表示されます。

  2. ユーザーを選択します。

  3. Credentialsタブをクリックします。

  4. Credential Resetをクリックします。

  5. Reset ActionsConfigure OTPに設定します。

  6. Send Emailをクリックします。送信されたメールには、OTP setup pageにユーザーを誘導するリンクが含まれています。

ユーザーによるセルフ登録の許可

Keycloakをサードパーティの認証サーバーとして使用して、セルフ登録ユーザーを含むアプリケーションユーザーを管理できます。セルフ登録を有効にすると、ログインページに登録リンクが表示され、ユーザーはアカウントを作成できます。

登録リンク

registration link

ユーザーは登録を完了するために、登録フォームにプロファイル情報を追加する必要があります。登録フォームは、ユーザーが完了する必要があるフィールドを削除または追加することでカスタマイズできます。

アイデンティティブローカリングと管理者APIに関する明確化

セルフ登録が無効になっている場合でも、新しいユーザーは次のいずれかの方法でKeycloakに追加できます。

  • 管理者は、管理コンソール(または管理REST API)を使用して新しいユーザーを追加できます。

  • アイデンティティブローカリングが有効になっている場合、アイデンティティプロバイダーによって認証された新しいユーザーは、Keycloakストレージに自動的に追加/登録される場合があります。詳細については、アイデンティティブローカリングの章の最初のログインフローセクションを参照してください。

また、サードパーティのユーザーストレージ(LDAPなど)からのユーザーも、特定のユーザーストレージが有効になっている場合、Keycloakで自動的に利用可能になります。

追加リソース

ユーザー登録の有効化

ユーザーがセルフ登録できるようにします。

手順
  1. メインメニューのRealm Settingsをクリックします。

  2. ログインタブをクリックします。

  3. User RegistrationONに切り替えます。

この設定を有効にすると、Admin ConsoleのログインページにRegisterリンクが表示されます。

新規ユーザーとして登録する

新規ユーザーとして、初回ログイン時に登録フォームに記入する必要があります。プロファイル情報とパスワードを追加して登録します。

登録フォーム

registration form

前提条件
  • ユーザー登録が有効になっています。

手順
  1. ログインページのRegisterリンクをクリックします。登録ページが表示されます。

  2. ユーザープロファイル情報を入力します。

  3. 新しいパスワードを入力します。

  4. Registerをクリックします。

登録時に利用規約への同意を必須にする

ユーザーが登録するには、利用規約への同意を必須にすることができます。

利用規約への同意が必須の登録フォーム

registration form with required tac

前提条件
  • ユーザー登録が有効になっています。

  • 利用規約必須アクションが有効になっています。

手順
  1. メニューのAuthenticationをクリックします。Flowsタブをクリックします。

  2. registrationフローをクリックします。

  3. Terms and Conditions行のRequiredを選択します。

    登録時に利用規約への同意を必須にする

    require tac agreement at registration

ログイン時に必須のアクションの定義

ユーザーが最初のログイン時に実行する必要があるアクションを設定できます。これらのアクションは、ユーザーがクレデンシャルを提供した後に必須となります。最初のログイン後、これらのアクションは不要になります。ユーザーのDetailsタブで必須アクションを追加します。

管理者によって明示的にユーザーに追加されていなくても、ログイン中にユーザーに対して自動的にトリガーされる必須アクションがいくつかあります。たとえば、パスワードポリシーがユーザーパスワードをX日ごとに変更する必要があるように構成されている場合、Update passwordアクションをトリガーできます。または、ユーザープロファイルに従って一部のユーザー属性が要件を満たさない限り、verify profileアクションはユーザーにユーザープロファイルを更新するように要求できます。

必須アクションタイプの例を以下に示します。

パスワードの更新

ユーザーはパスワードを変更する必要があります。

OTPの設定

ユーザーはFree OTPまたはGoogle Authenticatorアプリケーションのいずれかを使用して、モバイルデバイスでワンタイムパスワードジェネレーターを設定する必要があります。

メールアドレスの確認

ユーザーはメールアカウントを確認する必要があります。メールが検証リンクとともにユーザーに送信され、ユーザーはそれをクリックする必要があります。このワークフローが正常に完了すると、ユーザーはログインできるようになります。

プロファイルの更新

ユーザーは、名前、住所、メールアドレス、電話番号などのプロファイル情報を更新する必要があります。

一部のアクションは、ユーザーアカウントに直接追加することは意味がありません。たとえば、Update User Localeは、ローカリゼーション関連のパラメーターを処理するためのヘルパーアクションです。もう1つの例はDelete Credentialアクションであり、パラメーター化されたAIAとしてトリガーされることを想定しています。これに関して、管理者が一部のユーザーのクレデンシャルを削除したい場合、その管理者は管理コンソールで直接それを行うことができます。Delete Credentialアクションは、たとえばKeycloakアカウントコンソールで使用するために専用です。

1人のユーザーに必須アクションを設定する

すべてのユーザーに必須のアクションを設定できます。

手順
  1. メニューのユーザーをクリックします。

  2. リストからユーザーを選択します。

  3. Required User Actionsリストに移動します。

    user required action

  4. アカウントに追加するすべてのアクションを選択します。

  5. アクション名の横にあるXをクリックして削除します。

  6. 追加するアクションを選択した後、Saveをクリックします。

すべてのユーザーに必須アクションを設定する

すべての新規ユーザーの初回ログイン前に必須となるアクションを指定できます。要件は、UsersページのAdd UserボタンまたはログインページのRegisterリンクによって作成されたユーザーに適用されます。

手順
  1. メニューの認証をクリックします。

  2. Required Actionsタブをクリックします。

  3. 1つまたは複数の必須アクションについて、Set as default action列のチェックボックスをクリックします。新しいユーザーが初めてログインすると、選択したアクションが実行される必要があります。

Application initiated actions

Application initiated actions (AIA) allow client applications to request a user to perform an action on the Keycloak side. Usually, when an OIDC client application wants a user to log in, it redirects that user to the login URL as described in the OIDC section. After login, the user is redirected back to the client application. The user performs the actions that were required by the administrator as described in the previous section and then is immediately redirected back to the application. However, AIA allows the client application to request some required actions from the user during login. This can be done even if the user is already authenticated on the client and has an active SSO session. It is triggered by adding the kc_action parameter to the OIDC login URL with the value containing the requested action. For instance kc_action=UPDATE_PASSWORD parameter.

A user may cancel an application initiated action. In this case the user is redirected back to the client application. The redirect URI will contain the query parameters kc_action_status=cancelled and kc_action with the name of the cancelled action.

The kc_action and kc_action_status parameters are a Keycloak proprietary mechanism unsupported by the OIDC specification.
Application initiated actions are supported only for OIDC clients.

So if AIA is used, an example flow is similar to the following

  • A client application redirects the user to the OIDC login URL with the additional parameter such as kc_action=UPDATE_PASSWORD

  • 認証フローのセクションで説明されているように、常にトリガーされるbrowserフローがあります。ユーザーが認証されていない場合、通常のログイン時と同様に認証する必要があります。ユーザーがすでに認証されている場合、SSO Cookieによって自動的に再認証される可能性があり、積極的に再認証して再度クレデンシャルを入力する必要はありません。この場合、ユーザーは特定のアクション(この場合はパスワードの更新)を実行する画面に直接リダイレクトされます。ただし、ユーザーがSSO Cookieを持っている場合でも、アクティブな再認証が必要になる場合があります(詳細は下記を参照してください)。

  • 特定のアクション(この場合はパスワードの更新)を実行する画面がユーザーに表示されるため、ユーザーは特定のアクションを実行する必要があります。

  • その後、ユーザーはクライアントアプリケーションにリダイレクトバックされます。

AIAは、パスワードの更新や、OTPやWebAuthnなどの他のクレデンシャルのリセットを要求するために、Keycloakのアカウントコンソールで使用されることに注意してください。

kc_actionパラメータが使用された場合でも、ユーザーが常にアクションを実行するとは限りません。たとえば、ユーザーはブラウザのURLからkc_actionパラメータを手動で削除した可能性があります。したがって、クライアントがkc_action=CONFIGURE_TOTPを要求した後でも、ユーザーがアカウントのOTPを持っているという保証はありません。ユーザーが2要素認証を設定したことを確認したい場合は、クライアントアプリケーションで設定されているかどうかを確認する必要がある場合があります。たとえば、トークンのacrのようなクレームを確認するなどです。

AIA中の再認証

ユーザーがアクティブなSSOセッションによってすでに認証されている場合、通常、ユーザーは積極的に再認証する必要はありません。ただし、ユーザーがアクティブに認証してから5分以上経過している場合でも、クライアントはAIAが要求されたときに再認証を要求できます。このガイドラインには、次の例外があります。

  • アクションdelete_accountは、常にユーザーにアクティブな再認証を要求します。

  • アクションUPDATE_PASSWORDは、設定された最大認証年齢パスワードポリシーに従って、ユーザーにアクティブな再認証を要求する場合があります。ポリシーが設定されていない場合、特定のリクワイアードアクションを設定する際のリクワイアードアクションタブで、必須アクション自体にポリシーを設定することも可能です。ポリシーがこれらの場所のいずれにも設定されていない場合、デフォルトで5分になります。

  • より短い再認証を使用したい場合は、max_ageなどのパラメータクエリパラメータを指定された短い値で使用するか、最終的にはprompt=loginを使用できます。これにより、OIDC仕様で説明されているように、常にユーザーにアクティブな再認証を要求します。デフォルトの5分(またはパスワードポリシーで規定されている時間)よりも長い値をmax_ageに使用することはサポートされていないことに注意してください。max_ageは現在、デフォルトの5分よりも短い値にする場合にのみ使用できます。

  • ステップアップ認証が有効になっており、アクションがクレデンシャルを追加または削除することである場合、認証は指定されたクレデンシャルに対応するレベルで必要になります。この要件は、ユーザーがすでに特定のレベルのクレデンシャルを持っている場合に存在します。たとえば、認証フローでotpwebauthnが2要素認証(認証フローの両方がレベル2)として設定されており、ユーザーがすでに2要素クレデンシャル(この場合はotpまたはwebauthn)を持っている場合、別の2レベルクレデンシャルを追加するには、既存の2レベルクレデンシャルで認証する必要があります。同様に、既存の2要素クレデンシャル(この場合はotpまたはwebauthn)を削除する場合、既存の2要素レベルクレデンシャルでの認証が必要です。この要件はセキュリティ上の理由から存在します。

パラメータ化されたAIA

一部のAIAでは、アクション名とともにパラメータを送信する必要がある場合があります。たとえば、Delete CredentialアクションはAIAによってのみトリガーでき、アクションの名前とともにパラメータを送信する必要があります。これは、削除されたクレデンシャルのIDを指します。したがって、この例のURLはkc_action=delete_credential:ce1008ac-f811-427f-825a-c0b878d1c24bになります。この場合、コロン文字(ce1008ac-f811-427f-825a-c0b878d1c24b)以降の部分には、削除される特定のユーザーのクレデンシャルのIDが含まれています。Delete Credentialアクションは、ユーザーがクレデンシャルの削除に同意するかどうかを確認できる確認画面を表示します。

Keycloakアカウントコンソールは、通常、2要素クレデンシャルを削除するときにDelete Credentialアクションを使用します。独自アプリケーションからこのアクションを直接使用したい場合は、アカウントコンソールで例を確認できます。ただし、独自のアプリケーションからクレデンシャルを管理するのではなく、アカウントコンソールに依存するのが最適です。

利用可能なアクション

利用可能なすべてのアクションを確認するには、Admin Consoleにログインし、右上隅のレルム情報 → タブプロバイダー情報 → プロバイダーrequired-actionを見つけてクリックします。ただし、これはリクワイアードアクションタブでレルムに対して有効になっているアクションに基づいてさらに制限される可能性があることに注意してください。

ユーザーの検索

ユーザーを検索して、ユーザーのグループやロールなど、ユーザーに関する詳細情報を表示します。

前提条件
  • ユーザーが存在するレルムにいます。

手順
  1. メインメニューでユーザーをクリックします。ユーザーページが表示されます。

  2. 検索するユーザーのフルネーム、姓、名、またはメールアドレスを検索ボックスに入力します。検索は、条件に一致するすべてのユーザーを返します。

    ユーザーを照合するために使用される条件は、検索ボックスで使用される構文によって異なります。

    1. "somevalue" → 文字列"somevalue"の完全一致検索を実行します。

    2. *somevalue*LIKE '%somevalue%' DBクエリと同様の中間一致検索を実行します。

    3. somevalue* または somevalueLIKE 'somevalue%' DBクエリと同様の前方一致検索を実行します。

手順
  1. メインメニューでユーザーをクリックします。ユーザーページが表示されます。

  2. デフォルト検索ボタンをクリックして、属性検索に切り替えます。

  3. 属性を選択ボタンをクリックして、検索する属性を指定します。

  4. 完全一致検索チェックボックスをオンにして完全一致を実行するか、オフのままにして属性値の中間一致検索を使用します。

  5. 検索ボタンをクリックして検索を実行します。条件に一致するすべてのユーザーが返されます。

ユーザーページで実行される検索は、Keycloakのデータベースと、LDAPなどの設定されたユーザーフェデレーションバックエンドの両方を対象としています。フェデレーションバックエンドで見つかったユーザーは、まだKeycloakのデータベースに存在しない場合、Keycloakのデータベースにインポートされます。

追加リソース

ユーザーの削除

アプリケーションへのアクセスが不要になったユーザーを削除できます。ユーザーが削除されると、ユーザープロファイルとデータも削除されます。

手順
  1. メニューのUsersをクリックします。Usersページが表示されます。

  2. すべてのユーザーを表示をクリックして、削除するユーザーを見つけます。

    または、検索バーを使用してユーザーを見つけることもできます。
  3. 削除するユーザーの横にあるアクションメニューから削除をクリックし、削除を確認します。

ユーザーによるアカウント削除の有効化

Admin Consoleでこの機能を有効にすると、エンドユーザーとアプリケーションはアカウントコンソールで自分のアカウントを削除できます。この機能を有効にすると、特定のユーザーにその機能を与えることができます。

アカウント削除機能の有効化

この機能は、リクワイアードアクションタブで有効にします。

手順
  1. メニューの認証をクリックします。

  2. Required Actionsタブをクリックします。

  3. アカウント削除行で有効を選択します。

    リクワイアードアクションタブのアカウント削除

    enable delete account action

ユーザーにdelete-accountロールを付与する

特定ユーザーに、アカウント削除を許可するロールを付与できます。

手順
  1. メニューのユーザーをクリックします。

  2. ユーザーを選択します。

  3. ロールマッピングタブをクリックします。

  4. ロールを割り当てるボタンをクリックします。

  5. account delete-accountをクリックします。

  6. 割り当てるをクリックします。

    delete-accountロール

    delete-account role

自分のアカウントの削除

delete-accountロールを持っている場合、自分のアカウントを削除できます。

  1. アカウントコンソールにログインします。

  2. 個人情報ページの最下部にあるアカウント削除をクリックします。

    アカウント削除ページ

    Delete account page

  3. クレデンシャルを入力し、削除を確定します。

    削除確認

    delete account confirm

    このアクションは元に戻せません。Keycloakのすべてのデータが削除されます。

ユーザーの偽装

適切な権限を持つ管理者は、ユーザーを偽装できます。たとえば、ユーザーがアプリケーションでバグを経験した場合、管理者はユーザーを偽装して問題を調査または再現できます。

レルムでimpersonationロールを持つユーザーは、ユーザーを偽装できます。

手順
  1. メニューのユーザーをクリックします。

  2. 偽装するユーザーをクリックします。

  3. アクションリストから偽装を選択します。

    user impersonate action

    • 管理者とユーザーが同じレルムにいる場合、管理者はログアウトし、偽装されているユーザーとして自動的にログインします。

    • 管理者とユーザーが異なるレルムにいる場合、管理者はログインしたままになり、さらにそのユーザーのレルムのユーザーとしてログインします。

どちらの場合も、偽装されたユーザーのアカウントコンソールが表示されます。

追加リソース

reCAPTCHAの有効化

ボットに対する登録を保護するために、KeycloakはGoogle reCAPTCHA(Google reCAPTCHAの設定を参照)およびreCAPTCHA Enterprise(Google reCAPTCHA Enterpriseの設定を参照)と統合されています。デフォルトテーマ(register.ftl)は、v2(表示、チェックボックスベース)とv3(スコアベース、非表示)の両方のreCAPTCHAをサポートしています(適切なreCAPTCHAキータイプを選択を参照)。

Google reCAPTCHAの設定

  1. ブラウザに次のURLを入力します。

    https://www.google.com/recaptcha/admin/create
  2. reCAPTCHAを作成し、チャレンジ v2(表示チェックボックス)またはスコアベース、v3(非表示)のいずれかを選択して、reCAPTCHAサイトキーとシークレットを取得します。この手順で後で使用するためにメモしておいてください。

    localhostドメインはデフォルトではサポートされていません。開発のために引き続きサポートする場合は、サイトキーのサポート対象ドメインのリストに追加できます。
  3. Keycloak管理コンソールに移動します。

  4. メニューの認証をクリックします。

  5. フロータブをクリックします。

  6. リストから登録を選択します。

  7. reCAPTCHA要件を必須に設定します。これにより、reCAPTCHAが有効になります。

  8. reCAPTCHA行の歯車アイコン⚙️をクリックします。

    reCAPTCHA設定

    recaptcha config

    1. Google reCAPTCHA Webサイトから生成されたreCAPTCHAサイトキーを入力します。

    2. Google reCAPTCHA Webサイトから生成されたreCAPTCHAシークレットを入力します。

    3. サイトキータイプに応じてreCAPTCHA v3を切り替えます。スコアベースのreCAPTCHA(v3)の場合はオン、チャレンジreCAPTCHA(v2)の場合はオフにします。

    4. (オプション)recaptcha.netを使用するを切り替えて、Cookieにwww.google.comドメインの代わりにwww.recaptcha.netを使用します。詳細については、reCAPTCHA FAQを参照してください。

  9. 登録ページをiframeとして使用することをGoogleに承認します。

    Keycloakでは、Webサイトはiframeにログインページダイアログを含めることはできません。この制限は、クリックジャッキング攻撃を防ぐためのものです。Keycloakで設定されているデフォルトのHTTPレスポンスヘッダーを変更する必要があります。
    1. メニューのレルム設定をクリックします。

    2. セキュリティ防御タブをクリックします。

    3. X-Frame-Optionsヘッダーのフィールドにhttps://www.google.comを入力します(または、recaptcha.netを使用するを有効にした場合はhttps//www.recaptcha.net)。

    4. Content-Security-Policyヘッダーのフィールドにhttps://www.google.comを入力します(または、recaptcha.netを使用するを有効にした場合はhttps//www.recaptcha.net)。

Google reCAPTCHA Enterpriseの設定

  1. ブラウザに次のURLを入力します。

    https://developers.google.com/recaptcha/
  2. 「ウェブサイト」プラットフォームのキーを作成し、目的のキータイプを選択します。v3 reCAPTCHA(非表示)の場合はデフォルトのままにするか、v2 reCAPTCHA(表示)の場合はチェックボックスチャレンジを使用を切り替えます。この手順で後で使用するためにサイトキーをメモしておいてください。

    localhostはデフォルトで動作します。ドメインを指定する必要はありません。
  3. Google Cloudプロジェクトで、認証情報に移動し、APIキーを作成します。

    セキュリティを強化するために、APIキーを編集をクリックし、API制限を追加して、キーをreCAPTCHA Enterprise APIのみに制限します。
  4. Keycloak管理コンソールに移動します。

  5. メニューの認証をクリックします。

  6. フロータブをクリックします。

  7. 「登録」フローを複製します。

  8. 新しいフローを登録フローにバインドします。

  9. 新しいフローを編集します。

    1. reCAPTCHAステップを削除します。

    2. ステップreCAPTCHA Enterpriseを「登録フォーム」(フローの最初のステップ)のサブステップとして追加します。

  10. reCAPTCHA Enterprise要件を必須に設定します。

  11. reCAPTCHA Enterprise行の歯車アイコン⚙️をクリックします。

    reCAPTCHA Enterprise設定

    recaptcha enterprise config

    1. Google CloudコンソールプロジェクトのRecaptchaプロジェクトIDを入力します。

    2. 手順の最初に生成されたRecaptchaサイトキーを入力します。

    3. 手順の最初に生成されたRecaptcha APIキーを入力します。

    4. サイトキータイプに応じてreCAPTCHA v3を切り替えます。スコアベースのreCAPTCHA(v3)の場合はオン、チャレンジreCAPTCHA(v2)の場合はオフにします。

    5. (任意) 必要に応じて最小スコア閾値をカスタマイズしてください。ユーザーが登録を許可されるために reCAPTCHA で達成する必要がある最小スコア(0.0 から 1.0 の間)を設定してください。詳細はスコアの解釈を参照してください。

    6. (オプション)recaptcha.netを使用するを切り替えて、Cookieにwww.google.comドメインの代わりにwww.recaptcha.netを使用します。詳細については、reCAPTCHA FAQを参照してください。

  12. Google が登録ページを iframe として使用することを承認します。詳細な手順については、Google reCAPTCHA の設定の最後のステップを参照してください。

追加リソース

Keycloak によって収集される個人データ

デフォルトでは、Keycloak は次のデータを収集します。

  • ユーザーのメールアドレス、氏名などの基本的なユーザープロファイルデータ。

  • ソーシャルアカウントに使用される基本的なユーザープロファイルデータ、およびソーシャルログインを使用する際のソーシャルアカウントへの参照。

  • 監査およびセキュリティ目的で収集されるデバイス情報(IP アドレス、オペレーティングシステム名、ブラウザ名など)。

Keycloak で収集される情報は高度にカスタマイズ可能です。カスタマイズを行う際には、次のガイドラインが適用されます。

  • 登録フォームとアカウントフォームには、誕生日、性別、国籍などのカスタムフィールドを含めることができます。管理者は、ソーシャルプロバイダーまたは LDAP などのユーザー ストレージプロバイダーからデータを取得するように Keycloak を構成できます。

  • Keycloak は、パスワード、OTP コード、WebAuthn 公開鍵などのユーザー資格情報を収集します。この情報は暗号化され、データベースに保存されるため、Keycloak 管理者には表示されません。各タイプの資格情報には、パスワードのハッシュに使用されるアルゴリズムやパスワードのハッシュに使用されるハッシュ反復回数など、管理者に表示される非機密メタデータを含めることができます。

  • 認可サービスと UMA サポートが有効になっている場合、Keycloak は特定のユーザーが所有者である一部のオブジェクトに関する情報を保持できます。

ユーザーセッションの管理

ユーザーがレルムにログインすると、Keycloak はユーザーごとにユーザーセッションを維持し、セッション内でユーザーがアクセスした各クライアントを記憶します。レルム管理者は、各ユーザーセッションに対して複数のアクションを実行できます。

  • レルムのログイン統計を表示します。

  • アクティブなユーザーとログイン場所を表示します。

  • ユーザーをセッションからログアウトさせます。

  • トークンを失効させます。

  • トークンタイムアウトを設定します。

  • セッションタイムアウトを設定します。

セッションの管理

Keycloak のアクティブなクライアントとセッションのトップレベルのビューを表示するには、メニューからセッションをクリックします。

セッション

Sessions tab

すべてのアクティブなセッションからサインアウトする

レルム内のすべてのユーザーをサインアウトできます。アクションリストから、すべてのアクティブなセッションからサインアウトを選択します。すべての SSO Cookie が無効になります。Keycloak は、Keycloak OIDC クライアントアダプターを使用してログアウトイベントをクライアントに通知します。アクティブなブラウザセッション内で認証を要求するクライアントは、再度ログインする必要があります。SAML などのクライアントタイプは、バックチャネルログアウト要求を受信しません。

すべてのアクティブなセッションからサインアウトをクリックしても、未処理のアクセストークンは失効しません。未処理のトークンは自然に期限切れになる必要があります。Keycloak OIDC クライアントアダプターを使用しているクライアントの場合、失効ポリシーをプッシュしてトークンを失効させることができますが、これは他のアダプターでは機能しません。

クライアントセッションの表示

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. クライアントをクリックして、そのクライアントのセッションを表示します。

  3. セッションタブをクリックします。

    クライアントセッション

    Client sessions

ユーザーセッションの表示

手順
  1. メニューのユーザーをクリックします。

  2. ユーザーをクリックして、そのユーザーのセッションを表示します。

  3. セッションタブをクリックします。

    ユーザーセッション

    User sessions

アクティブなセッションの失効

システムが侵害された場合は、すべてのアクティブなセッションとアクセストークンを失効させることができます。

手順
  1. メニューのセッションをクリックします。

  2. アクションリストから、失効を選択します。

    失効

    Revocation

  3. このコンソールを使用して、その日時より前に発行されたセッションまたはトークンを無効にする日時を指定します。

    • 現在時刻に設定をクリックして、ポリシーを現在の日時に設定します。

    • プッシュをクリックして、この失効ポリシーを Keycloak OIDC クライアントアダプターを備えた登録済み OIDC クライアントにプッシュします。

セッションとトークンのタイムアウト

Keycloak には、レルム設定メニューのセッションタブとトークンタブを使用して、セッション、Cookie、およびトークンのタイムアウトを制御する機能が含まれています。

セッションタブ

Sessions Tab

構成 説明

SSO セッションアイドル

この設定は OIDC クライアント専用です。ユーザーがこのタイムアウトよりも長く非アクティブな場合、ユーザーセッションは無効になります。クライアントが認証を要求するか、リフレッシュトークン要求を送信すると、このタイムアウト値はリセットされます。Keycloak は、セッションの無効化が有効になる前に、アイドルタイムアウトに猶予期間を追加します。このセクションの後半にあるを参照してください。

SSO セッション最大

ユーザーセッションが期限切れになるまでの最大時間。

SSO セッションアイドル (Remember Me)

この設定は標準の SSO セッションアイドル構成と似ていますが、Remember Me を有効にしたログインに固有です。ユーザーは、ログイン時にRemember Meをクリックすると、より長いセッションアイドルタイムアウトを指定できます。この設定はオプションの構成であり、値がゼロより大きくない場合は、SSO セッションアイドル構成と同じアイドルタイムアウトを使用します。

SSO セッション最大 (Remember Me)

この設定は標準の SSO セッション最大と似ていますが、Remember Me ログインに固有です。ユーザーは、ログイン時にRemember Meをクリックすると、より長いセッションを指定できます。この設定はオプションの構成であり、値がゼロより大きくない場合は、SSO セッション最大構成と同じセッション有効期間を使用します。

クライアントセッションアイドル

クライアントセッションのアイドルタイムアウト。ユーザーがこのタイムアウトよりも長く非アクティブな場合、クライアントセッションは無効になり、リフレッシュトークン要求はアイドルタイムアウトを延長します。この設定は、一意である一般的な SSO ユーザーセッションには影響しません。SSO ユーザーセッションはゼロ以上のクライアントセッションの親であることに注意してください。ユーザーがログインするクライアントアプリごとに 1 つのクライアントセッションが作成されます。この値は、SSO セッションアイドルよりも短いアイドルタイムアウトを指定する必要があります。ユーザーは、詳細設定クライアントタブで個々のクライアントに対してこれをオーバーライドできます。この設定はオプションの構成であり、ゼロに設定すると、SSO セッションアイドル構成と同じアイドルタイムアウトを使用します。

クライアントセッション最大

クライアントセッションの最大時間、およびリフレッシュトークンが期限切れになり無効になるまでの最大時間。前のオプションと同様に、この設定は SSO ユーザーセッションには影響せず、SSO セッション最大よりも短い値を指定する必要があります。ユーザーは、詳細設定クライアントタブで個々のクライアントに対してこれをオーバーライドできます。この設定はオプションの構成であり、ゼロに設定すると、SSO セッション最大構成と同じ最大タイムアウトを使用します。

オフラインセッションアイドル

この設定はオフラインアクセス用です。セッションがアイドル状態のままになる時間。この時間を過ぎると、Keycloak はオフライン トークンを取り消します。Keycloak は、セッションの無効化が有効になる前に、アイドルタイムアウトに猶予期間を追加します。このセクションの後半にあるを参照してください。

オフラインセッション最大 (制限あり)

この設定はオフラインアクセス用です。このフラグが有効の場合、オフラインセッション最大は、ユーザーアクティビティに関係なく、オフライン トークンがアクティブなままになる最大時間を制御できます。フラグが無効の場合、オフラインセッションは有効期間によって期限切れになることはなく、アイドル状態でのみ期限切れになります。このオプションが有効になると、オフラインセッション最大 (レルムレベルのグローバルオプション) と クライアントオフラインセッション最大 (詳細設定タブの特定のクライアントレベルオプション) を構成できます。

オフラインセッション最大

この設定はオフラインアクセス用であり、Keycloak が対応するオフライン トークンを取り消すまでの最大時間です。このオプションは、ユーザーアクティビティに関係なく、オフライン トークンがアクティブなままになる最大時間を制御します。

ログインタイムアウト

ログインにかかる合計時間。認証にこの時間より長くかかる場合、ユーザーは認証プロセスを再度開始する必要があります。

ログインアクショントークン

認証プロセス中にユーザーが 1 つのページに費やすことができる最大時間。

トークンタブ

Tokens Tab

構成 説明

デフォルト署名アルゴリズム

レルムのトークンを割り当てるために使用されるデフォルトのアルゴリズム。

リフレッシュトークンの取り消し

有効にすると、Keycloak はリフレッシュトークンを取り消し、クライアントが使用する必要のある別のトークンを発行します。このアクションは、リフレッシュトークンフローを実行する OIDC クライアントに適用されます。

アクセストークンの有効期間

Keycloak が OIDC アクセストークンを作成するとき、この値はトークンの有効期間を制御します。

暗黙的フローのアクセストークンの有効期間

暗黙的フローでは、Keycloak はリフレッシュトークンを提供しません。暗黙的フローによって作成されたアクセストークンには、別のタイムアウトが存在します。

クライアントログインタイムアウト

クライアントが OIDC で Authorization Code Flow を完了する必要がある最大時間。

ユーザー開始アクションの有効期間

ユーザーのアクション許可が期限切れになるまでの最大時間。ユーザーは通常、自分で作成したアクションに迅速に対応するため、この値は短くしてください。

管理者開始アクションのデフォルトの有効期間

管理者によってユーザーに送信されたアクション許可が期限切れになるまでの最大時間。管理者がオフラインユーザーにメールを送信できるように、この値は長くしてください。管理者は、トークンを発行する前にデフォルトのタイムアウトをオーバーライドできます。

メール検証

メール検証の独立したタイムアウトを指定します。

IdP アカウントのメール検証

IdP アカウントのメール検証の独立したタイムアウトを指定します。

パスワードを忘れました

パスワード忘れの独立したタイムアウトを指定します。

アクションの実行

アクション実行の独立したタイムアウトを指定します。

永続的なユーザーセッションがアクティブでない場合にのみ、次のロジックが適用されます。

アイドルタイムアウトの場合、セッションがアクティブな 2 分間の猶予期間が存在します。たとえば、タイムアウトを 30 分に設定した場合、セッションが期限切れになるのは 32 分後になります。

このアクションは、トークンが期限切れになる直前に 1 つのクラスターノードで更新され、他のクラスターノードが、更新ノードからの更新成功に関するメッセージをまだ受信していないため、セッションが期限切れになったと誤って見なすクラスター環境およびクロスデータセンター環境の一部のシナリオで必要です。

オフラインアクセス

オフラインアクセスログイン中、クライアントアプリケーションはリフレッシュトークンの代わりにオフライン トークンを要求します。クライアントアプリケーションは、このオフライン トークンを保存し、ユーザーがログアウトした場合、将来のログインに使用できます。このアクションは、ユーザーがオンラインでなくても、アプリケーションがユーザーに代わってオフラインアクションを実行する必要がある場合に役立ちます。たとえば、定期的なデータバックアップなどです。

クライアントアプリケーションは、オフライン トークンをストレージに永続化し、それを使用して Keycloak サーバーから新しいアクセストークンを取得する責任があります。

リフレッシュトークンとオフライン トークンの違いは、オフライン トークンは期限切れにならず、SSO セッションアイドルタイムアウトと SSO セッション最大有効期間の影響を受けないことです。オフライン トークンは、ユーザーがログアウトした後も有効です。オフラインセッションアイドルの値に対して、または 30 日に 1 回以上、リフレッシュトークンアクションにオフライン トークンを使用する必要があります。

オフラインセッション最大 (制限あり)を有効にすると、オフライン トークンをリフレッシュトークンアクションに使用した場合でも、オフライン トークンは 60 日後に期限切れになります。この値であるオフラインセッション最大は、管理コンソールで変更できます。

オフラインアクセスを使用する場合、クライアントのアイドルタイムアウトと最大タイムアウトはクライアントレベルでオーバーライドできます。クライアントの詳細設定タブにあるクライアントオフラインセッションアイドルオプションとクライアントオフラインセッション最大オプションを使用すると、特定のアプリケーションに対してより短いオフラインタイムアウトを設定できます。クライアントセッションの値はリフレッシュトークンの有効期限も制御しますが、グローバルオフラインユーザー SSO セッションには影響しません。クライアントオフラインセッション最大オプションは、レルムレベルでオフラインセッション最大 (制限あり)有効になっている場合にのみクライアントで評価されます。

リフレッシュトークンの取り消しオプションを有効にすると、各オフライン トークンを 1 回だけ使用できます。更新後、以前のオフライン トークンの代わりに、更新応答からの新しいオフライン トークンを保存する必要があります。

ユーザーは、Keycloak が付与したオフライン トークンをユーザーアカウントコンソールで表示および取り消すことができます。管理者は、管理コンソールの同意タブで、個々のユーザーのオフライン トークンを取り消すことができます。管理者は、各クライアントのオフラインアクセスタブで発行されたすべてのオフライン トークンを表示できます。管理者は、失効ポリシーを設定することで、オフライン トークンを取り消すことができます。

オフライン トークンを発行するには、ユーザーはレルムレベルの offline_access ロールのロールマッピングを持っている必要があります。クライアントもスコープにそのロールを持っている必要があります。クライアントは、offline_access クライアントスコープをオプションのクライアントスコープとしてロールに追加する必要があります。これはデフォルトで実行されます。

クライアントは、認証リクエストを Keycloak に送信するときにパラメータ scope=offline_access を追加することで、オフライン トークンを要求できます。Keycloak OIDC クライアントアダプターは、アプリケーションの保護された URL (例: https://#:8080/customer-portal/secured?scope=offline_access) にアクセスするために使用すると、このパラメータを自動的に追加します。ダイレクトアクセスグラントとサービスアカウントは、認証リクエストボディに scope=offline_access を含める場合、オフライン トークンをサポートします。

Keycloakは、オフラインユーザーおよびオフラインクライアントセッションの内部キャッシュをデフォルトで10000エントリに制限し、オフラインセッションの全体的なメモリ使用量を削減します。メモリから削除されたアイテムは、必要に応じてデータベースからオンデマンドでロードされます。キャッシュのサイズを変更するには、Keycloakのキャッシュ設定ファイルを編集して、これらのキャッシュに<memory max-count="..."/>を設定します。

persistent-user-sessions機能を無効にした場合、インポートされたオフラインセッションのライフスパンを短縮する構成オプションを使用することで、メモリ要件を削減できます。そのようなセッションは、指定されたライフスパン後にInfinispanキャッシュから削除されますが、データベースでは引き続き利用可能です。これにより、特に多数のオフラインセッションを持つデプロイメントにおいて、メモリ消費量が削減されます。

オフラインユーザーセッションのライフスパンオーバーライドを指定するには、次のパラメータを指定してKeycloakサーバーを起動します。

--spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override=<lifespan-in-seconds>

オフラインクライアントセッションについても同様です。

--spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override=<lifespan-in-seconds>

一時セッション

Keycloakでは、一時セッションを実行できます。一時セッションを使用する場合、Keycloakは認証に成功した後、ユーザーセッションを作成しません。Keycloakは、ユーザーを正常に認証する現在のリクエストのスコープに対して、一時的な一時セッションを作成します。Keycloakは、認証後に一時セッションを使用してプロトコルマッパーを実行できます。

トークンが一時セッションで発行される場合、トークンのsidsession_stateは通常空です。そのため、一時セッション中、クライアントアプリケーションはトークンを更新したり、特定のセッションを検証したりできません。場合によっては、これらのアクションは不要なため、ユーザーセッションを永続化するための追加のリソース使用を回避できます。このセッションは、パフォーマンス、メモリ、およびネットワーク通信(クラスターおよびクロスデータセンター環境)リソースを節約します。

現時点では、一時セッションは、トークン更新が無効になっているサービスアカウント認証中にのみ自動的に使用されます。クライアントスイッチUse refresh tokens for client credentials grantによって明示的に有効にされない限り、サービスアカウント認証中はトークン更新が自動的に無効になることに注意してください。

ロールとグループを使用した権限の割り当て

ロールとグループは、ユーザーにアプリケーションを使用するためのアクセス権と権限を付与するという点で同様の目的を持っています。グループは、ロールと属性を適用するユーザーの集まりです。ロールは、特定のアプリケーション権限とアクセス制御を定義します。

ロールは通常、1種類のユーザーに適用されます。たとえば、組織にはadminusermanager、およびemployeeロールが含まれる場合があります。アプリケーションは、ロールにアクセス権と権限を割り当ててから、複数のユーザーをそのロールに割り当てることで、ユーザーが同じアクセス権と権限を持つようにすることができます。たとえば、管理コンソールには、ユーザーに管理コンソールのさまざまな部分へのアクセス権を付与するロールがあります。

ロールにはグローバルな名前空間があり、各クライアントにはロールを定義できる専用の名前空間もあります。

レルムロールの作成

レルムレベルのロールは、ロールを定義するための名前空間です。ロールのリストを表示するには、メニューのレルムロールをクリックします。

roles

手順
  1. ロールを作成をクリックします。

  2. ロール名を入力します。

  3. 説明を入力します。

  4. 保存をクリックします。

説明フィールドは、${var-name}文字列で置換変数を指定することにより、ローカライズできます。ローカライズされた値は、テーマプロパティファイル内のテーマに構成されます。詳細については、サーバー開発者ガイドを参照してください。

クライアントロール

クライアントロールは、クライアント専用の名前空間です。各クライアントには、独自の名前空間が与えられます。クライアントロールは、各クライアントのロールタブで管理されます。このUIの操作方法は、レルムレベルのロールの場合と同じです。

コンポジットロールへの変換

レルムまたはクライアントレベルのロールは、コンポジットロールにすることができます。コンポジットロールとは、1つ以上の追加のロールが関連付けられているロールです。コンポジットロールがユーザーにマッピングされると、ユーザーはコンポジットロールに関連付けられたロールを取得します。この継承は再帰的であるため、ユーザーはコンポジットのコンポジットも継承します。ただし、コンポジットロールは過度に使用しないことをお勧めします。

手順
  1. メニューのレルムロールをクリックします。

  2. 変換するロールをクリックします。

  3. アクションリストから、関連付けられたロールを追加を選択します。

コンポジットロール

Composite role

ロール選択UIがページに表示され、作成中のコンポジットロールにレルムレベルおよびクライアントレベルのロールを関連付けることができます。

この例では、employeeレルムレベルロールがdeveloperコンポジットロールに関連付けられています。developerロールを持つユーザーは、employeeロールも継承します。

トークンとSAMLアサーションを作成する場合、すべてのコンポジットは、クライアントに送り返される認証応答のクレームとアサーションに追加された関連ロールも持ちます。

ロールマッピングの割り当て

ユーザーのロールマッピングタブから、ユーザーにロールマッピングを割り当てることができます。

手順
  1. メニューのユーザーをクリックします。

  2. ロールマッピングを実行するユーザーをクリックします。

  3. ロールマッピングタブをクリックします。

  4. ロールを割り当てるをクリックします。

  5. ダイアログからユーザーに割り当てるロールを選択します。

  6. 割り当てるをクリックします。

ロールマッピング

Role mappings

前の例では、コンポジットロールdeveloperをユーザーに割り当てています。このロールは、コンポジットロールのトピックで作成されました。

有効なロールマッピング

Effective role mappings

developerロールが割り当てられると、developerコンポジットに関連付けられたemployeeロールが継承「真」で表示されます。継承されたロールは、ユーザーに明示的に割り当てられたロールと、コンポジットから継承されたロールです。

デフォルトロールの使用

ユーザーが作成されたとき、またはアイデンティティブローカリングを介してインポートされたときに、ユーザーロールマッピングを自動的に割り当てるには、デフォルトロールを使用します。

手順
  1. メニューのレルム設定をクリックします。

  2. ユーザー登録タブをクリックします。

    デフォルトロール

    Default roles

このスクリーンショットは、いくつかのデフォルトロールが既に存在することを示しています。

ロールスコープマッピング

OIDCアクセストークンまたはSAMLアサーションの作成時に、ユーザーロールマッピングはトークンまたはアサーション内のクレームになります。アプリケーションはこれらのクレームを使用して、アプリケーションによって制御されるリソースへのアクセス決定を行います。Keycloakはアクセストークンにデジタル署名し、アプリケーションはそれらを再利用して、リモートで保護されたRESTサービスを呼び出します。ただし、これらのトークンには関連するリスクがあります。攻撃者はこれらのトークンを取得し、その権限を使用してネットワークを侵害する可能性があります。この状況を防ぐために、ロールスコープマッピングを使用します。

ロールスコープマッピングは、アクセストークン内で宣言されるロールを制限します。クライアントがユーザー認証を要求すると、受信するアクセストークンには、クライアントのスコープに明示的に指定されたロールマッピングのみが含まれます。その結果、個々のアクセストークンの権限は、ユーザーのすべての権限へのクライアントアクセスを許可するのではなく、制限されます。

デフォルトでは、各クライアントはユーザーのすべてのロールマッピングを取得します。クライアントのロールマッピングを表示できます。

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. 詳細を表示するには、クライアントをクリックします。

  3. クライアントスコープタブをクリックします。

  4. このクライアント専用のスコープとマッパーを持つ行のリンクをクリックします。

  5. スコープタブをクリックします。

フルスコープ

Full scope

デフォルトでは、スコープの有効なロールは、レルムで宣言されたすべてのロールです。このデフォルトの動作を変更するには、フルスコープを許可オフに切り替え、各クライアントに必要な特定のロールを宣言します。クライアントスコープを使用して、クライアントのセットに対して同じロールスコープマッピングを定義することもできます。

部分スコープ

Partial scope

トークンにロールを追加するアルゴリズムの詳細については、トークンロールマッピングセクションを参照してください。

グループ

Keycloakのグループは、各ユーザーの共通の属性とロールマッピングを管理します。ユーザーは任意の数のグループのメンバーになることができ、各グループに割り当てられた属性とロールマッピングを継承します。

グループを管理するには、メニューのグループをクリックします。

グループ

groups

グループは階層構造になっています。グループには複数のサブグループを含めることができますが、グループが持つことができる親は1つだけです。サブグループは、親から属性とロールマッピングを継承します。ユーザーも親から属性とロールマッピングを継承します。

親グループと子グループがあり、子グループにのみ属するユーザーがいる場合、子グループのユーザーは親グループと子グループの両方の属性とロールマッピングを継承します。

グループの階層は、グループパスを使用して表されることがあります。パスは、特定のグループの階層を表す名前の完全なリストであり、上から下へスラッシュ/で区切られています(ファイルシステムのファイルと同様)。たとえば、パスは/top/level1/level2のようになります。これは、topがトップレベルグループであり、level1の親であり、level1level2の親であることを意味します。このパスは、グループlevel2の階層を一意に表します。

Keycloakは歴史的な理由から、グループ名自体のスラッシュをエスケープしません。したがって、topの下のlevel1/groupという名前のグループは、パス/top/level1/groupを使用しますが、これは誤解を招く可能性があります。Keycloakは、オプション--spi-group-jpa-escape-slashes-in-group-pathtrueにして起動でき、その場合、名前のスラッシュは文字~でエスケープされます。エスケープ文字は、スラッシュが名前の一部であり、階層的な意味を持たないことを示します。前のパスの例は、エスケープされると/top/level1~/groupになります。

bin/kc.[sh|bat] start --spi-group-jpa-escape-slashes-in-group-path=true

次の例には、トップレベルのSalesグループと子North Americaサブグループが含まれています。

グループを追加するには

  1. グループをクリックします。

  2. グループを作成をクリックします。

  3. グループ名を入力します。

  4. 作成をクリックします。

  5. グループ名をクリックします。

    グループ管理ページが表示されます。

    グループ

    group

定義した属性とロールマッピングは、グループのメンバーであるグループとユーザーによって継承されます。

ユーザーをグループに追加するには

  1. メニューのユーザーをクリックします。

  2. ロールマッピングを実行するユーザーをクリックします。ユーザーが表示されない場合は、すべてのユーザーを表示をクリックします。

  3. グループをクリックします。

  4. グループに参加をクリックします。

  5. ダイアログからグループを選択します。

  6. 利用可能なグループツリーからグループを選択します。

  7. 参加をクリックします。

    グループに参加

    user groups

ユーザーからグループを削除するには

  1. メニューのユーザーをクリックします。

  2. グループから削除するユーザーをクリックします。

  3. グループテーブル行の脱退をクリックします。

この例では、ユーザーjimlincolnNorth Americaグループにいます。jimlincolnがグループのメンバータブの下に表示されていることがわかります。

グループメンバーシップ

group membership

グループとロールの比較

グループとロールにはいくつかの類似点と相違点があります。Keycloakにおいて、グループはロールと属性を適用するユーザーの集まりです。ロールはユーザーのタイプを定義し、アプリケーションはロールに許可とアクセス制御を割り当てます。

コンポジットロールは、グループと同様の機能を提供するため、グループに似ています。それらの違いは概念的なものです。コンポジットロールは、許可モデルをサービスとアプリケーションのセットに適用します。アプリケーションとサービスを管理するには、コンポジットロールを使用します。

グループは、組織内のユーザーの集まりとロールに焦点を当てています。ユーザーを管理するには、グループを使用します。

デフォルトグループの使用

Identity Brokering を介して作成またはインポートされたすべてのユーザーに自動的にグループメンバーシップを割り当てるには、デフォルトグループを使用します。

  1. メニューのレルム設定をクリックします。

  2. ユーザー登録タブをクリックします。

  3. デフォルトグループ」タブをクリックします。

    デフォルトグループ

    Default groups

このスクリーンショットは、いくつかのデフォルトグループがすでに存在することを示しています。

認証の設定

この章では、いくつかの認証トピックについて説明します。これらのトピックには以下が含まれます。

  • 厳格なパスワードおよびワンタイムパスワード(OTP)ポリシーの適用。

  • さまざまな認証情報タイプの管理。

  • Kerberosを使用したログイン。

  • 組み込みの認証情報タイプの無効化と有効化。

パスワードポリシー

Keycloakがレルムを作成するとき、パスワードポリシーをレルムに関連付けません。長さ、セキュリティ、または複雑さの制限なしに単純なパスワードを設定できます。単純なパスワードは、本番環境では受け入れられません。Keycloakには、Admin Console を介して利用可能な一連のパスワードポリシーがあります。

手順
  1. メニューの認証をクリックします。

  2. ポリシー」タブをクリックします。

  3. ポリシーを追加」ドロップダウンボックスで追加するポリシーを選択します。

  4. 選択したポリシーに適用される値を入力します。

  5. 保存をクリックします。

    パスワードポリシー

    Password Policy

ポリシーを保存すると、Keycloak は新しいユーザーにポリシーを適用します。

新しいポリシーは既存のユーザーには有効になりません。したがって、レルムの作成の開始時からパスワードポリシーを設定するか、既存のユーザーに「パスワードの更新」を追加するか、「パスワードの有効期限」を使用して、ユーザーが次の「N」日以内にパスワードを更新するようにして、新しいパスワードポリシーに実際に適応するようにしてください。

パスワードポリシータイプ

HashAlgorithm

パスワードはクリアテキストで保存されません。保存または検証の前に、Keycloakは標準のハッシュアルゴリズムを使用してパスワードをハッシュします。

サポートされているパスワードハッシュアルゴリズムを次の表に示します。

ハッシュアルゴリズム 説明

argon2

Argon2 (非FIPS環境でのデフォルト)

pbkdf2-sha512

PBKDF2 with SHA512 (FIPS環境でのデフォルト)

pbkdf2-sha256

PBKDF2 with SHA256

pbkdf2

PBKDF2 with SHA1 (非推奨)

可能であれば Argon2 を使用することを強くお勧めします。Argon2 は PBKDF2 と比較して CPU 要件が大幅に低く、同時にセキュリティも高いためです。

サーバーのデフォルトのパスワードハッシュアルゴリズムは、--spi-password-hashing-provider-default=<algorithm> で構成できます。

過剰なメモリと CPU 使用率を防ぐため、Argon2 によるハッシュの並列計算は、デフォルトで JVM で使用可能なコア数に制限されています。 Argon2 ハッシュプロバイダーを構成するには、そのプロバイダーオプションを使用します。

独自のハッシュアルゴリズムを追加する方法については、Server Developer Guide を参照してください。

ハッシュアルゴリズムを変更した場合、ストレージ内のパスワードハッシュはユーザーがログインするまで変更されません。

ハッシュ反復回数

Keycloak がパスワードを保存または検証する前にハッシュする回数を指定します。デフォルト値は -1 で、次の表に示すように、選択されたハッシュアルゴリズムのデフォルトのハッシュ反復回数を使用します。

ハッシュアルゴリズム デフォルトのハッシュ反復回数

argon2

5

pbkdf2-sha512

210,000

pbkdf2-sha256

600,000

pbkdf2

1,300,000

ほとんどの場合、ハッシュ反復回数は推奨されるデフォルト値から変更しないでください。反復回数の値を小さくするとセキュリティが不十分になり、値を大きくすると CPU 電力要件が高くなります。

数字

パスワード文字列に必要な数字の数。

小文字

パスワード文字列に必要な小文字の数。

大文字

パスワード文字列に必要な大文字の数。

特殊文字

パスワード文字列に必要な特殊文字の数。

ユーザー名と異なる

パスワードはユーザー名と同じにすることはできません。

メールアドレスと異なる

パスワードはユーザーのメールアドレスと同じにすることはできません。

正規表現

パスワードは、定義された 1 つ以上の Java 正規表現パターンに一致する必要があります。これらの式の構文については、Java の正規表現ドキュメントを参照してください。

パスワードの有効期限

パスワードが有効な日数。日数が経過すると、ユーザーはパスワードを変更する必要があります。

最近使用したパスワードと異なる

パスワードは、ユーザーが既に使用したものであってはなりません。Keycloak は、使用済みパスワードの履歴を保存します。保存される古いパスワードの数は、Keycloak で構成可能です。

最近使用したパスワードと異なる(日数)

パスワードは、構成された期間(日数)内に再利用できません。新しいパスワードがこの期間内に最後に設定された場合、ユーザーは別のパスワードを提供する必要があります。

パスワードブラックリスト

パスワードはブラックリストファイルに含まれていてはなりません。

  • ブラックリストファイルは、Unix の改行コードを持つ UTF-8 プレーンテキストファイルです。各行は、ブラックリストに登録されたパスワードを表します。

  • Keycloak は、大文字と小文字を区別しない方法でパスワードを比較します。

  • ブラックリストファイルの値は、ブラックリストファイルの名前である必要があります。たとえば、100k_passwords.txt などです。

  • ブラックリストファイルは、デフォルトで ${kc.home.dir}/data/password-blacklists/ に対して解決されます。このパスをカスタマイズするには、次を使用します。

    • keycloak.password.blacklists.path システムプロパティ。

    • passwordBlacklist ポリシー SPI 構成の blacklistsPath プロパティ。 CLI を使用してブラックリストフォルダーを構成するには、--spi-password-policy-password-blacklist-blacklists-path=/path/to/blacklistsFolder を使用します。

偽陽性に関する注意

現在の実装では、特定のパスワードがブラックリストに含まれているかどうかなど、高速かつメモリ効率の高い包含チェックのために BloomFilter を使用しています。偽陽性の可能性があります。

  • デフォルトでは、0.01% の偽陽性確率が使用されます。

  • CLI 構成によって偽陽性確率を変更するには、--spi-password-policy-password-blacklist-false-positive-probability=0.00001 を使用します。

最大認証経過時間

ユーザーが再認証なしにパスワードを更新できるユーザー認証の最大経過時間(秒単位)を指定します。値 0 は、ユーザーがパスワードを更新する前に、常に現在のパスワードで再認証する必要があることを示しています。このポリシーの詳細については、AIA セクションを参照してください。

最大認証経過時間は、Admin Console の「必須アクション」タブで必須アクション「パスワードの更新」を構成するときにも構成できます。最大認証経過時間のパスワードポリシーは将来的に非推奨/削除される可能性があるため、構成には必須アクションを使用することをお勧めします。

ワンタイムパスワード(OTP)ポリシー

Keycloak には、FreeOTP または Google Authenticator ワンタイムパスワードジェネレーターを設定するためのいくつかのポリシーがあります。

手順
  1. メニューの認証をクリックします。

  2. ポリシー」タブをクリックします。

  3. OTPポリシー」タブをクリックします。

OTPポリシー

OTP Policy

Keycloak は、「OTPポリシー」タブで構成された情報に基づいて、OTP 設定ページに QR コードを生成します。FreeOTP および Google Authenticator は、OTP を構成するときに QR コードをスキャンします。

時間ベースまたはカウンターベースのワンタイムパスワード

Keycloak で OTP ジェネレーターに利用できるアルゴリズムは、時間ベースとカウンターベースです。

時間ベースのワンタイムパスワード(TOTP)では、トークンジェネレーターは現在の時刻と共有シークレットをハッシュします。サーバーは、時間枠内のハッシュを送信された値と比較することにより、OTP を検証します。TOTP は、短い時間枠でのみ有効です。

カウンターベースのワンタイムパスワード(HOTP)では、Keycloak は現在の時刻ではなく共有カウンターを使用します。Keycloak サーバーは、OTP ログインが成功するたびにカウンターをインクリメントします。有効な OTP は、ログインが成功すると変更されます。

TOTP は、一致する OTP が短い時間枠でのみ有効であるのに対し、HOTP の OTP は不特定期間有効であるため、HOTP よりも安全です。HOTP は、OTP を入力する時間制限がないため、TOTP よりもユーザーフレンドリーです。

HOTP では、サーバーがカウンターをインクリメントするたびにデータベースの更新が必要です。この更新は、高負荷時の認証サーバーのパフォーマンス低下につながります。効率を上げるために、TOTP は使用されたパスワードを記憶しないため、データベースの更新を実行する必要はありません。欠点は、有効期間内に TOTP を再利用できる可能性があることです。

TOTP構成オプション

OTPハッシュアルゴリズム

デフォルトのアルゴリズムは SHA1 です。他の、より安全なオプションは SHA256 と SHA512 です。

桁数

OTP の長さ。短い OTP はユーザーフレンドリーで、入力しやすく、覚えやすいです。長い OTP は、短い OTP よりも安全です。

ルックアラウンドウィンドウ

サーバーがハッシュを一致させようとする間隔の数。このオプションは、TOTP ジェネレーターまたは認証サーバーのクロックが同期しなくなった場合に Keycloak に存在します。デフォルト値の 1 で十分です。たとえば、トークンの時間間隔が 30 秒の場合、デフォルト値の 1 は、90 秒のウィンドウ(時間間隔 30 秒 + 先読み 30 秒 + 後読み 30 秒)で有効なトークンを受け入れることを意味します。この値を 1 ずつ増やすたびに、有効なウィンドウが 60 秒(先読み 30 秒 + 後読み 30 秒)ずつ増加します。

OTPトークン期間

サーバーがハッシュを一致させる時間間隔(秒単位)。間隔が経過するたびに、トークンジェネレーターは TOTP を生成します。

再利用可能なコード

OTP トークンを認証プロセスで再利用できるか、またはユーザーが次のトークンを待つ必要があるかを決定します。ユーザーはデフォルトではこれらのトークンを再利用できません。管理者は、これらのトークンを再利用できることを明示的に指定する必要があります。

HOTP構成オプション

OTPハッシュアルゴリズム

デフォルトのアルゴリズムは SHA1 です。他の、より安全なオプションは SHA256 と SHA512 です。

桁数

OTP の長さ。短い OTP はユーザーフレンドリーで、入力しやすく、覚えやすいです。長い OTP は、短い OTP よりも安全です。

ルックアラウンドウィンドウ

サーバーがハッシュを一致させようとする、前後の間隔の数。このオプションは、TOTP ジェネレーターまたは認証サーバーのクロックが同期しなくなった場合に Keycloak に存在します。デフォルト値の 1 で十分です。このオプションは、ユーザーのカウンターがサーバーよりも進んでいる場合に対応するために Keycloak に存在します。

初期カウンター

初期カウンターの値。

認証フロー

認証フローとは、ログイン、登録、およびその他の Keycloak ワークフローにおける認証、画面、およびアクションのコンテナです。

組み込みフロー

Keycloak には、いくつかの組み込みフローがあります。これらのフローを修正することはできませんが、ニーズに合わせてフローの要件を変更できます。

手順
  1. メニューの認証をクリックします。

  2. リスト内のブラウザ項目をクリックして、詳細を確認してください。

ブラウザフロー

Browser Flow

認証タイプ

実行する認証またはアクションの名前。認証がインデントされている場合、サブフロー内にあります。親の動作によっては、実行される場合と実行されない場合があります。

  1. Cookie

    ユーザーが初めて正常にログインすると、Keycloak はセッション Cookie を設定します。Cookie がすでに設定されている場合、この認証タイプは成功します。Cookie プロバイダーが成功を返し、このフローレベルでの各実行が代替であるため、Keycloak は他の実行を実行しません。これにより、ログインが成功します。

  2. Kerberos

    この認証機能はデフォルトで無効になっており、ブラウザフロー中はスキップされます。

  3. ID プロバイダーリダイレクト

    このアクションは、アクション > 設定リンクから設定します。アイデンティティブローカリングのために別の IdP にリダイレクトします。

  4. フォーム

    このサブフローは代替としてマークされているため、Cookie 認証タイプが成功した場合、実行されません。このサブフローには、実行する必要がある追加の認証タイプが含まれています。Keycloak は、このサブフローの実行をロードし、それらを処理します。

最初の実行はユーザー名パスワードフォームです。これはユーザー名とパスワードのページをレンダリングする認証タイプです。必須としてマークされているため、ユーザーは有効なユーザー名とパスワードを入力する必要があります。

2 番目の実行はブラウザ - 条件付き OTP サブフローです。このサブフローは条件付きであり、条件 - ユーザー設定済みの実行の結果に応じて実行されます。結果が true の場合、Keycloak はこのサブフローの実行をロードし、それらを処理します。

次の実行は条件 - ユーザー設定済み認証です。この認証は、Keycloak がフロー内の他の実行をユーザーに対して設定しているかどうかを確認します。ブラウザ - 条件付き OTP サブフローは、ユーザーが設定済みの OTP 資格情報を持っている場合にのみ実行されます。

最後の実行はOTP フォームです。Keycloak はこの実行を必須としてマークしますが、条件付きサブフローの設定により、ユーザーが OTP 資格情報を設定している場合にのみ実行されます。そうでない場合、ユーザーには OTP フォームは表示されません。

要件

アクションの実行を制御するラジオボタンのセット。

必須

フロー内のすべての必須要素は、順番に正常に実行される必要があります。必須要素が失敗した場合、フローは終了します。

代替

フローが成功として評価されるためには、単一の要素のみが正常に実行される必要があります。必須フロー要素がフローを成功としてマークするのに十分であるため、必須フロー要素を含むフロー内の代替フロー要素は実行されません。

無効

要素は、フローを成功としてマークするのにカウントされません。

条件付き

この要件タイプは、サブフローでのみ設定されます。

  • 条件付きサブフローには実行が含まれています。これらの実行は、論理ステートメントとして評価される必要があります。

  • すべての実行がtrueとして評価される場合、条件付きサブフローは必須として機能します。

  • いずれかの実行がfalseとして評価される場合、条件付きサブフローは無効として機能します。

  • 実行を設定しない場合、条件付きサブフローは無効として機能します。

  • フローに実行が含まれており、フローが条件付きに設定されていない場合、Keycloak は実行を評価せず、実行は機能的に無効と見なされます。

フローの作成

フローを設計する際には、重要な機能とセキュリティに関する考慮事項が適用されます。

フローを作成するには、次の手順を実行します

手順
  1. メニューの認証をクリックします。

  2. フローを作成をクリックします。

既存のフローをコピーして変更できます。「アクションリスト」(行末の 3 つのドット)をクリックし、複製をクリックして、新しいフローの名前を入力します。

新しいフローを作成する場合は、最初に次のオプションを使用してトップレベルフローを作成する必要があります

名前

フローの名前。

説明

フローに設定できる説明。

トップレベルフロータイプ

フローのタイプ。タイプクライアントは、クライアント(アプリケーション)の認証にのみ使用されます。他のすべてのケースでは、基本を選択してください。

トップレベルフローを作成する

Top Level Flow

Keycloak がフローを作成すると、Keycloak はステップを追加ボタンとサブフローを追加ボタンを表示します。

空の新しいフロー

New Flow

3 つの要素が、フローとサブフローの動作を決定します。

  • フローとサブフローの構造。

  • フロー内の実行

  • サブフローと実行内で設定された要件。

実行には、リセットメールの送信から OTP の検証まで、幅広いアクションがあります。ステップを追加ボタンを使用して実行を追加します。

認証実行の追加

Adding an Authentication Execution

認証実行には、オプションで参照値を設定できます。これは、認証方法参照 (AMR) プロトコルマッパーによって利用され、OIDC アクセスおよび ID トークンの amr クレームを設定できます (AMR クレームの詳細については、RFC-8176 を参照してください)。認証方法参照 (AMR) プロトコルマッパーがクライアントに対して設定されている場合、ユーザーが認証フロー中に正常に完了した認証機能実行の参照値で amr クレームが設定されます。

認証機能参照値の追加

Configuring an Authenticator Reference Value

自動実行インタラクティブ実行の 2 種類の実行が存在します。自動実行Cookie 実行に似ており、フロー内でアクションを自動的に実行します。インタラクティブ実行は、入力を取得するためにフローを一時停止します。実行が正常に実行されると、ステータスが成功に設定されます。フローが完了するには、ステータスが成功の実行が少なくとも 1 つ必要です。

サブフローを追加ボタンを使用して、サブフローをトップレベルフローに追加できます。サブフローを追加ボタンをクリックすると、実行フローの作成ページが表示されます。このページは、トップレベルフォームの作成ページに似ています。違いは、フロータイプ基本(デフォルト)またはフォームにできることです。フォームタイプは、組み込みの登録フローと同様に、ユーザーのフォームを生成するサブフローを構築します。サブフローの成功は、含まれるサブフローを含む、実行の評価方法によって異なります。サブフローの仕組みの詳細な説明については、実行要件セクションを参照してください。

実行を追加した後、要件が正しい値になっているか確認してください。

フロー内のすべての要素には、要素の横に削除オプションがあります。一部の実行には、実行を設定するための⚙️メニュー項目(歯車アイコン)があります。ステップを追加リンクとサブフローを追加リンクを使用して、サブフローに実行とサブフローを追加することもできます。

実行順序が重要であるため、実行とサブフローの名前をドラッグして上下に移動できます。

認証フローを設定するときは、構成を適切にテストして、セットアップにセキュリティホールが存在しないことを確認してください。さまざまなコーナーケースをテストすることをお勧めします。たとえば、認証前にユーザーのアカウントからさまざまな資格情報を削除した場合のユーザーの認証動作を検討してください。

例として、OTP フォームや WebAuthn 認証機能などの 2 要素認証機能がフロー内で必須として設定されており、ユーザーが特定のタイプの資格情報を持っていない場合、ユーザーは認証自体中に特定の資格情報を設定できます。この状況は、ユーザーが認証中に資格情報を設定したため、この資格情報で認証しないことを意味します。したがって、ブラウザ認証の場合は、パスワードまたは WebAuthn パスワードレス認証機能などの 1 要素資格情報で認証フローを設定してください。

パスワードレスブラウザログインフローの作成

フローの作成を説明するために、このセクションでは高度なブラウザログインフローの作成について説明します。このフローの目的は、ユーザーがWebAuthn を使用したパスワードレス方式でのログインと、パスワードと OTP による 2 要素認証のどちらかを選択できるようにすることです。

手順
  1. メニューの認証をクリックします。

  2. フロータブをクリックします。

  3. フローを作成をクリックします。

  4. 名前として Browser Password-less と入力します。

  5. 作成をクリックします。

  6. 実行を追加をクリックします。

  7. リストからCookieを選択します。

  8. 追加をクリックします。

  9. Cookie認証タイプの代替を選択して、要件を代替に設定します。

  10. ステップを追加をクリックします。

  11. リストからKerberosを選択します。

  12. 追加をクリックします。

  13. ステップを追加をクリックします。

  14. リストからID プロバイダーリダイレクトを選択します。

  15. 追加をクリックします。

  16. ID プロバイダーリダイレクト認証タイプの代替を選択して、要件を代替に設定します。

  17. サブフローを追加をクリックします。

  18. 名前として フォーム と入力します。

  19. 追加をクリックします。

  20. フォーム認証タイプの代替を選択して、要件を代替に設定します。

    ブラウザフローとの共通部分

    Passwordless browser login

  21. フォーム実行の + メニューをクリックします。

  22. ステップを追加を選択します。

  23. リストからユーザー名フォームを選択します。

  24. 追加をクリックします。

この段階では、フォームはユーザー名を必要としますが、パスワードは必要としません。セキュリティリスクを回避するために、パスワード認証を有効にする必要があります。

  1. フォームサブフローの + メニューをクリックします。

  2. サブフローを追加をクリックします。

  3. 名前として Authentication と入力します。

  4. 追加をクリックします。

  5. 認証認証タイプの必須を選択して、要件を必須に設定します。

  6. 認証サブフローの + メニューをクリックします。

  7. ステップを追加をクリックします。

  8. リストからWebAuthn パスワードレス認証機能を選択します。

  9. 追加をクリックします。

  10. Webauthn パスワードレス認証機能認証タイプの代替を選択して、要件を代替に設定します。

  11. 認証サブフローの + メニューをクリックします。

  12. サブフローを追加をクリックします。

  13. 名前として Password with OTP と入力します。

  14. 追加をクリックします。

  15. パスワードと OTP認証タイプの代替を選択して、要件を代替に設定します。

  16. パスワードと OTPサブフローの + メニューをクリックします。

  17. ステップを追加をクリックします。

  18. リストからパスワードフォームを選択します。

  19. 追加をクリックします。

  20. パスワードフォーム認証タイプの必須を選択して、要件を必須に設定します。

  21. パスワードと OTPサブフローの + メニューをクリックします。

  22. ステップを追加をクリックします。

  23. リストからOTP フォームを選択します。

  24. 追加をクリックします。

  25. OTP フォーム認証タイプの必須をクリックして、要件を必須に設定します。

最後に、バインディングを変更します。

  1. 画面上部のアクションメニューをクリックします。

  2. メニューからフローをバインドを選択します。

  3. ブラウザフロードロップダウンリストをクリックします。

  4. 保存をクリックします。

パスワードレスブラウザログイン

Passwordless browser login

ユーザー名を入力すると、フローは次のように動作します

ユーザーが WebAuthn パスワードレス資格情報を記録している場合、これらの資格情報を使用して直接ログインできます。これがパスワードレスログインです。WebAuthn パスワードレス実行と パスワードと OTP フローが代替に設定されているため、ユーザーはパスワードと OTPを選択することもできます。必須に設定されている場合、ユーザーは WebAuthn、パスワード、および OTP を入力する必要があります。

ユーザーが WebAuthn パスワードレス認証で別の方法を試すリンクを選択した場合、ユーザーは パスワードパスキー (WebAuthn パスワードレス) のいずれかを選択できます。パスワードを選択した場合、ユーザーは続行して割り当てられた OTP でログインする必要があります。ユーザーが WebAuthn 資格情報を持っていない場合、ユーザーはパスワードを入力してから OTP を入力する必要があります。ユーザーが OTP 資格情報を持っていない場合、ユーザーは OTP 資格情報を記録するように求められます。

WebAuthn パスワードレス実行は必須ではなく代替に設定されているため、このフローではユーザーに WebAuthn 資格情報の登録を求めることはありません。ユーザーが Webauthn 資格情報を持つには、管理者がユーザーに必要なアクションを追加する必要があります。これを行うには、

  1. レルムでWebauthn パスワードレス登録必須アクションを有効にします(WebAuthn ドキュメントを参照してください)。

  2. ユーザーの資格情報管理メニューの資格情報のリセット部分を使用して、必須アクションを設定します。

このような高度なフローを作成すると、副作用が発生する可能性があります。たとえば、ユーザーのパスワードをリセットする機能を有効にすると、パスワードフォームからアクセスできるようになります。デフォルトの 資格情報のリセット フローでは、ユーザーはユーザー名を入力する必要があります。ユーザーは Browser Password-less フローの早い段階でユーザー名を既に入力しているため、このアクションは Keycloak にとって不要であり、ユーザーエクスペリエンスにとって最適ではありません。この問題を修正するには、

  • 資格情報のリセット フローを複製します。たとえば、名前を パスワードレスの資格情報のリセット に設定します。

  • ユーザーを選択ステップの削除(ゴミ箱アイコン)をクリックします。

  • アクションメニューで、フローをバインドを選択し、ドロップダウンから資格情報のリセットフローを選択して、保存をクリックします

クライアントポリシーを使用した認証フローの選択

クライアントポリシーは、特定のスコープや ACR (認証コンテキストクラス参照) を要求するなど、特定の条件に基づいて認証フローを動的に選択するために使用できます。これには、AuthenticationFlowSelectorExecutor を好みの条件と組み合わせて使用します。

AuthenticationFlowSelectorExecutor を使用すると、適切な認証フローを選択し、選択したフローが完了したら適用する認証レベルを設定できます。

考えられる構成には、ACRConditionAuthenticationFlowSelectorExecutor と組み合わせて使用することが含まれます。この設定により、要求された ACR に基づいて認証フローを選択し、ACR から LoA へのマッピングを使用してトークンに ACR 値を含めることができます。

詳細については、クライアントポリシーを参照してください。

ステップアップメカニズムを備えたブラウザログインフローの作成

このセクションでは、ステップアップメカニズムを使用した高度なブラウザログインフローの作成方法について説明します。ステップアップ認証の目的は、ユーザーの特定の認証レベルに基づいてクライアントまたはリソースへのアクセスを許可することです。

手順
  1. メニューの認証をクリックします。

  2. フロータブをクリックします。

  3. フローを作成をクリックします。

  4. 名前として Browser Incl Step up Mechanism と入力します。

  5. 保存をクリックします。

  6. 実行を追加をクリックします。

  7. リストからCookieを選択します。

  8. 追加をクリックします。

  9. Cookie認証タイプの代替を選択して、要件を代替に設定します。

  10. サブフローを追加をクリックします。

  11. 名前として 認証フロー と入力します。

  12. 追加をクリックします。

  13. 認証タイプAuth Flowの要件を代替に設定するには、Alternativeをクリックします。

これで、最初の認証レベルのフローを設定します。

  1. Auth Flow+メニューをクリックします。

  2. サブフローを追加をクリックします。

  3. 名前として1st Condition Flowと入力します。

  4. 追加をクリックします。

  5. 認証タイプ1st Condition Flowの要件を条件付きに設定するには、Conditionalをクリックします。

  6. 1st Condition Flow+メニューをクリックします。

  7. 条件を追加をクリックします。

  8. リストからConditional - Level Of Authenticationを選択します。

  9. 追加をクリックします。

  10. 認証タイプConditional - Level Of Authenticationの要件を必須に設定するには、Requiredをクリックします。

  11. ⚙️ (歯車アイコン) をクリックします。

  12. エイリアスとしてLevel 1と入力します。

  13. 認証レベル (LoA) に1を入力します。

  14. 最大年齢を36000に設定します。この値は秒単位で、レルムで設定されているデフォルトのSSO Session Maxタイムアウトである10時間に相当します。その結果、ユーザーがこのレベルで認証すると、その後のSSOログインでこのレベルを再利用でき、ユーザーセッションの終了(デフォルトでは10時間)までこのレベルで認証する必要はありません。

  15. 保存をクリックします。

    最初の認証レベルの条件を設定します。

    Authentication step up condition 1

  16. 1st Condition Flow+メニューをクリックします。

  17. ステップを追加をクリックします。

  18. リストからUsername Password Formを選択します。

  19. 追加をクリックします。

これで、2番目の認証レベルのフローを設定します。

  1. Auth Flow+メニューをクリックします。

  2. サブフローを追加をクリックします。

  3. エイリアスとして2nd Condition Flowと入力します。

  4. 追加をクリックします。

  5. 認証タイプ2nd Condition Flowの要件を条件付きに設定するには、Conditionalをクリックします。

  6. 2nd Condition Flow+メニューをクリックします。

  7. 条件を追加をクリックします。

  8. アイテムリストからConditional - Level Of Authenticationを選択します。

  9. 追加をクリックします。

  10. 認証タイプConditional - Level Of Authenticationの要件を必須に設定するには、Requiredをクリックします。

  11. ⚙️ (歯車アイコン) をクリックします。

  12. エイリアスとしてLevel 2と入力します。

  13. 認証レベル (LoA) に2を入力します。

  14. 最大年齢を0に設定します。その結果、ユーザーが認証すると、このレベルは現在の認証に対してのみ有効であり、その後のSSO認証には有効ではありません。したがって、ユーザーはこのレベルが要求された場合、常にこのレベルで再度認証する必要があります。

  15. 保存をクリックします。

    2番目の認証レベルの条件を設定します。

    Autehtnication step up condition 2

  16. 2nd Condition Flow+メニューをクリックします。

  17. ステップを追加をクリックします。

  18. リストからOTP フォームを選択します。

  19. 追加をクリックします。

  20. OTP フォーム認証タイプの必須をクリックして、要件を必須に設定します。

最後に、バインディングを変更します。

  1. 画面上部のアクションメニューをクリックします。

  2. リストからBind flowを選択します。

  3. ドロップダウンからBrowser Flowを選択します。

  4. 保存をクリックします。

ステップアップメカニズムによるブラウザログイン

Authentication step up flow

特定の認証レベルを要求する

ステップアップメカニズムを使用するには、認証リクエストで要求する認証レベル (LoA) を指定します。この目的にはclaimsパラメータが使用されます。

https://{DOMAIN}/realms/{REALMNAME}/protocol/openid-connect/auth?client_id={CLIENT-ID}&redirect_uri={REDIRECT-URI}&scope=openid&response_type=code&response_mode=query&nonce=exg16fxdjcu&claims=%7B%22id_token%22%3A%7B%22acr%22%3A%7B%22essential%22%3Atrue%2C%22values%22%3A%5B%22gold%22%5D%7D%7D%7D

claimsパラメータはJSON形式で指定されます。

claims= {
            "id_token": {
                "acr": {
                    "essential": true,
                    "values": ["gold"]
                }
            }
        }

Keycloak javascript adapterは、このJSONを簡単に構築し、ログインリクエストで送信する機能をサポートしています。詳細については、securing appsセクションのKeycloak JavaScript adapterを参照してください。

特定のレベルを非必須として要求するには、claimsパラメータの代わりに、よりシンプルなパラメータacr_valuesを使用することもできます。これはOIDC仕様に記載されています。

特定のクライアントのデフォルトレベルを設定することもできます。これは、acr_valuesパラメータまたはacrクレームを持つclaimsパラメータが存在しない場合に使用されます。詳細については、クライアント ACR 設定を参照してください。

acr_valuesを数値ではなくテキスト(goldなど)として要求するには、ACRとLoA間のマッピングを設定します。レルムレベル(推奨)またはクライアントレベルで設定できます。設定については、ACR から LoA へのマッピングを参照してください。

詳細については、公式 OIDC 仕様を参照してください。

フローロジック

前に設定した認証フローのロジックは次のとおりです。
クライアントが高い認証レベル、つまり認証レベル 2 (LoA 2) を要求した場合、ユーザーは完全な2要素認証(ユーザー名/パスワード + OTP)を実行する必要があります。ただし、ユーザーがKeycloakにセッションを既に持っており、ユーザー名とパスワード (LoA 1) でログインしている場合、ユーザーは2番目の認証要素 (OTP) のみを求められます。

条件の最大年齢オプションは、後続の認証レベルが有効である期間(秒単位)を決定します。この設定は、ユーザーが後続の認証中に認証要素を再度提示するように求められるかどうかを決定するのに役立ちます。特定のレベルXがclaimsまたはacr_valuesパラメータによって要求され、ユーザーが既にレベルXで認証されているが、期限切れになっている場合(たとえば、最大年齢が300に設定されており、ユーザーが310秒より前に認証した場合)、ユーザーは特定のレベルで再度認証するように求められます。ただし、レベルがまだ期限切れになっていない場合、ユーザーはそのレベルで認証されたと自動的に見なされます。

最大年齢を0の値で使用すると、特定のレベルはこの単一の認証に対してのみ有効であることを意味します。したがって、そのレベルを要求する再認証ごとに、そのレベルで再度認証する必要があります。これは、アプリケーションでより高いセキュリティを必要とする操作(例:送金)や、常に特定のレベルでの認証を必要とする場合に役立ちます。

claimsacr_valuesなどのパラメータは、クライアントからユーザーのブラウザを介してKeycloakにログインリクエストが送信されるときに、URLでユーザーによって変更される可能性があることに注意してください。クライアントがPAR(プッシュ認可リクエスト)、リクエストオブジェクト、またはユーザーがURL内のパラメータを書き換えるのを防ぐその他のメカニズムを使用する場合、この状況は軽減できます。したがって、認証後、クライアントはIDトークンをチェックして、トークン内のacrが期待されるレベルに対応していることを再確認することをお勧めします。

パラメータによって明示的なレベルが要求されない場合、Keycloakは、前の例のユーザー名/パスワードなど、認証フローで見つかった最初のLoA条件での認証を要求します。ユーザーがすでにそのレベルで認証されており、そのレベルが期限切れになった場合、ユーザーは再認証する必要はありませんが、トークン内のacrの値は0になります。この結果は、OIDC Core 1.0仕様のセクション2で言及されているように、long-lived browser cookieのみに基づく認証と見なされます。

ユーザーの最初の認証中、Conditional - Level Of Authenticationを含む最初に設定されたサブフローは、ユーザーがまだレベルを持っていないため(要求されたレベルに関係なく)常に実行されます。したがって、最初のレベルのサブフローには、ユーザー認証に必要な最小限の認証器を含めることをお勧めします。さらに、Conditional - Level Of Authenticationの値が異なるサブフローが、上記の例に示すように、最も低いものから順に並べられていることを確認してください。たとえば、レベル2のサブフローを設定してから、レベル1の別のサブフローを追加すると、最初の認証中に常にレベル2のサブフローが要求されますが、これは望ましい動作ではない可能性があります。
管理者が複数のフローを指定し、それぞれに異なるLoAレベルを設定し、それらのフローを異なるクライアントに割り当てると、競合状況が発生する可能性があります。ただし、ルールは常に同じです。ユーザーがあるレベルを持っている場合、クライアントに接続するために必要なのはそのレベルだけです。LoAに一貫性があることを確認するのは管理者次第です。
認証レベル条件を使用したステップアップ認証は、各レベルが先行レベルからのすべての認証方法を必要とするユースケースを対象としています。たとえば、レベルXは常にレベルX-1で必要なすべての認証方法を含む必要があります。レベル3などの特定のレベルが、以前のレベルとは異なる認証方法を必要とするユースケースの場合、ACRから特定のフローへのマッピングを使用する方が適切かもしれません。詳細については、クライアントポリシーを使用して認証フローを選択するを参照してください。

例のシナリオ

  1. 最大年齢はレベル1条件に対して300秒として設定されています。

  2. acrを要求せずにログインリクエストが送信されます。レベル1が使用され、ユーザーはユーザー名とパスワードで認証する必要があります。トークンにはacr=1が含まれます。

  3. 別のログインリクエストが100秒後に送信されます。ユーザーはSSOにより自動的に認証され、トークンはacr=1を返します。

  4. さらに201秒後(ポイント2での認証から301秒後)に別のログインリクエストが送信されます。ユーザーはSSOにより自動的に認証されますが、レベル1が期限切れと見なされるため、トークンはacr=0を返します。

  5. 別のログインリクエストが送信されますが、今度はclaimsパラメータでレベル1のACRを明示的に要求します。ユーザーはユーザー名/パスワードで再認証するように求められ、その後、トークンにacr=1が返されます。

トークン内のACRクレーム

ACRクレームは、acrクライアントスコープで定義されたacr loa levelプロトコルマッパーによってトークンに追加されます。このクライアントスコープはレルムのデフォルトクライアントスコープであるため、レルムで新しく作成されたすべてのクライアントに追加されます。

トークン内にacrクレームが不要な場合、または追加するためのカスタムロジックが必要な場合は、クライアントからクライアントスコープを削除できます。

ログインリクエストがacressentialクレームとして要求するclaimsパラメータを含むリクエストを開始する場合、Keycloakは常に指定されたレベルのいずれかを返すことに注意してください。指定されたレベルのいずれかを返すことができない場合(たとえば、要求されたレベルが不明であるか、認証フローで設定された条件よりも大きい場合)、Keycloakはエラーをスローします。

クライアントによって要求された登録または資格情報のリセット

通常、ユーザーがクライアントアプリケーションからKeycloakにリダイレクトされると、browserフローがトリガーされます。レルム登録が有効になっており、ユーザーがログイン画面でRegisterをクリックした場合、このフローによりユーザーは登録できる場合があります。また、レルムでパスワードを忘れた場合が有効になっている場合、ユーザーはログイン画面でパスワードを忘れた場合をクリックできます。これにより、資格情報のリセットフローがトリガーされ、ユーザーはメールアドレスの確認後に資格情報をリセットできます。

クライアントアプリケーションがユーザーを直接登録画面または資格情報のリセットフローにリダイレクトすることが役立つ場合があります。結果として得られるアクションは、ユーザーが通常のログイン画面で登録またはパスワードを忘れた場合をクリックしたときのアクションと一致します。登録または資格情報リセット画面への自動リダイレクトは、次のように実行できます。

  • クライアントがユーザーを登録に直接リダイレクトしたい場合、OIDCクライアントはログインリクエストにパラメータprompt=createを追加する必要があります。非推奨の代替案として、クライアントはOIDCログインURLパス(/auth)の最後のスニペットを/registrationsに置き換えることができます。したがって、完全なURLは次のようになります。https://keycloak.example.com/realms/your_realm/protocol/openid-connect/registrationsprompt=create仕様標準であるため、推奨されます。

  • クライアントがユーザーを資格情報のリセットフローに直接リダイレクトしたい場合、OIDCクライアントはOIDCログインURLパス(/auth)の最後のスニペットを/forgot-credentialsに置き換える必要があります。

上記の手順は、クライアントが登録または資格情報リセットフローを直接要求するための唯一のサポートされている方法です。セキュリティ上の理由から、クライアントアプリケーションがOIDC/SAMLフローをバイパスし、他のKeycloakエンドポイント(たとえば、/realms/realm_name/login-actionsまたは/realms/realm_name/brokerの下のエンドポイントなど)に直接リダイレクトすることはサポートされておらず、推奨されていません。

ユーザーセッションの制限

ユーザーが持つことができるセッション数の制限を設定できます。セッションはレルムごとまたはクライアントごとに制限できます。

セッション制限をフローに追加するには、次の手順を実行します。

  1. フローのステップを追加をクリックします。

  2. アイテムリストからUser session count limiterを選択します。

  3. 追加をクリックします。

  4. 認証タイプUser Session Count Limiterの要件を必須に設定するには、Requiredをクリックします。

  5. User Session Count Limiter⚙️ (歯車アイコン) をクリックします。

  6. この設定のエイリアスを入力します。

  7. ユーザーがこのレルムで持つことができるセッションの最大数を入力します。たとえば、値が2の場合、各ユーザーがこのレルムで持つことができる最大SSOセッション数は2です。値が0の場合、このチェックは無効になります。

  8. ユーザーがクライアントに対して持つことができるセッションの最大数を入力します。たとえば、値が2の場合、各クライアントに対してこのレルムでの最大SSOセッション数は2です。したがって、ユーザーがクライアントfooへの認証を試みているが、そのユーザーが既にクライアントfooへの2つのSSOセッションで認証されている場合、設定された動作に基づいて、認証が拒否されるか、既存のセッションが強制終了されます。値0が使用されている場合、このチェックは無効になります。セッション制限とクライアントセッション制限の両方が有効になっている場合、クライアントセッション制限を常にセッション制限よりも低くすることが理にかなっています。クライアントごとの制限は、このユーザーのすべてのSSOセッションの制限を超えることはありません。

  9. 制限に達した後、ユーザーがセッションを作成しようとしたときに必要な動作を選択します。利用可能な動作は次のとおりです。

    • 新しいセッションを拒否 - 新しいセッションが要求され、セッション制限に達した場合、新しいセッションは作成されません。

    • 最も古いセッションを終了 - 新しいセッションが要求され、セッション制限に達した場合、最も古いセッションが削除され、新しいセッションが作成されます。

  10. オプションで、制限に達したときに表示するカスタムエラーメッセージを追加します。

ユーザーセッションの制限は、バインドされたBrowser flowDirect grant flowReset credentials、および任意のPost broker login flowに追加する必要があることに注意してください。認証器は、認証中にユーザーが既に認識されている時点(通常は認証フローの最後)に追加する必要があり、通常はREQUIREDである必要があります。同じレベルでALTERNATIVEとREQUIREDの実行を持つことはできないことに注意してください。

Direct grant flowReset credentialsPost broker login flowなどのほとんどの認証器では、認証フローの最後に認証器をREQUIREDとして追加することをお勧めします。以下は、Reset credentialsフローの例です。

Authentication User Session Limits Reset Credentials Flow

Browserフローの場合、セッション制限認証器をトップレベルフローに追加しないことを検討してください。この推奨事項は、SSO Cookieに基づいてユーザーを自動的に再認証するCookie認証器によるものです。これはトップレベルにあり、ユーザーセッションが既に存在するため、SSO再認証中にセッション制限をチェックしない方が適切です。代わりに、Cookieと同じレベルで、次のauthenticate-user-with-session-limitの例のような、別のALTERNATIVEサブフローを追加することを検討してください。次に、REQUIREDサブフローを、次のreal-authentication-subflowの例のように、authenticate-user-with-session-limitのネストされたサブフローとして追加し、User Session Limitも同じレベルで追加できます。real-authentication-subflow内では、デフォルトのブラウザフローと同様の方法で実際の認証器を追加できます。次のフロー例では、ユーザーはIDプロバイダーまたはパスワードとOTPで認証できます。

Authentication User Session Limits Browser Flow

Post Broker login flowに関して、IDプロバイダーでの認証後にトリガーする他の認証器がない限り、認証フローでUser Session Limitsを唯一の認証器として追加できます。ただし、このフローがIDプロバイダーでPost Broker Flowとして構成されていることを確認してください。この要件は、IDプロバイダーでの認証もセッション制限に参加するために必要です。

現在、管理者は異なる構成間の一貫性を維持する責任があります。したがって、すべてのフローでUser Session Limitsの同じ構成を使用していることを確認してください。
ユーザーセッション制限機能はCIBAでは利用できません。

スクリプトオーセンティケーター

管理コンソールおよびRESTエンドポイント経由でスクリプトをアップロードする機能は非推奨となりました。

詳細については、JavaScript Providersを参照してください。

Kerberos

Keycloakは、Simple and Protected GSSAPI Negotiation Mechanism(SPNEGO)プロトコルを介したKerberosチケットによるログインをサポートしています。SPNEGOは、ユーザーがセッションを認証した後、Webブラウザーを介して透過的に認証を行います。Webケース以外の場合、またはログイン中にチケットが利用できない場合、KeycloakはKerberosのユーザー名とパスワードによるログインをサポートします。

Web認証の一般的なユースケースは次のとおりです。

  1. ユーザーはデスクトップにログインします。

  2. ユーザーはブラウザーを使用して、Keycloakによって保護されたWebアプリケーションにアクセスします。

  3. アプリケーションはKeycloakログインにリダイレクトします。

  4. Keycloakは、ステータス401とHTTPヘッダーWWW-Authenticate: NegotiateでHTMLログイン画面をレンダリングします。

  5. ブラウザーがデスクトップログインからのKerberosチケットを持っている場合、ブラウザーはデスクトップサインオン情報をヘッダーAuthorization: Negotiate 'spnego-token'でKeycloakに転送します。それ以外の場合は、標準のログイン画面が表示され、ユーザーはログイン資格情報を入力します。

  6. Keycloakはブラウザーからのトークンを検証し、ユーザーを認証します。

  7. Kerberos認証をサポートするLDAPFederationProviderを使用している場合、KeycloakはLDAPからユーザーデータをプロビジョニングします。KerberosFederationProviderを使用している場合、Keycloakはユーザーがプロファイルを更新し、ログインデータを事前入力できるようにします。

  8. Keycloakはアプリケーションに戻ります。Keycloakとアプリケーションは、OpenID ConnectまたはSAMLメッセージを介して通信します。KeycloakはKerberos/SPNEGOログインへのブローカーとして機能します。したがって、Kerberosを介したKeycloak認証はアプリケーションからは隠されています。

Negotiate www-authenticateスキームでは、KerberosへのフォールバックとしてNTLMが許可されており、一部のWindowsのWebブラウザーではNTLMがデフォルトでサポートされています。www-authenticateチャレンジがブラウザーの許可リスト外のサーバーから来た場合、ユーザーはNTLMダイアログプロンプトに遭遇する可能性があります。Keycloakはこのメカニズムをサポートしていないため、ユーザーはダイアログのキャンセルボタンをクリックして続行する必要があります。この状況は、イントラネットWebブラウザーが厳密に構成されていない場合、またはKeycloakがイントラネットとインターネットの両方のユーザーにサービスを提供している場合に発生する可能性があります。カスタムオーセンティケーターを使用すると、Negotiateチャレンジをホストのホワイトリストに制限できます。

Kerberos認証を設定するには、次の手順を実行します。

  1. Kerberosサーバー(KDC)のセットアップと構成。

  2. Keycloakサーバーのセットアップと構成。

  3. クライアントマシンのセットアップと構成。

Kerberosサーバーのセットアップ

Kerberosサーバーをセットアップする手順は、オペレーティングシステム(OS)とKerberosベンダーによって異なります。Kerberosサーバーのセットアップと構成の手順については、Windows Active Directory、MIT Kerberos、およびOSのドキュメントを参照してください。

セットアップ中に、次の手順を実行します。

  1. Kerberosデータベースにいくつかのユーザープリンシパルを追加します。KerberosをLDAPと統合して、ユーザーアカウントをLDAPサーバーからプロビジョニングすることもできます。

  2. 「HTTP」サービス用のサービスプリンシパルを追加します。たとえば、Keycloakサーバーがwww.mydomain.orgで実行されている場合は、サービスプリンシパルHTTP/www.mydomain.org@<kerberos realm>を追加します。

    MIT Kerberosでは、「kadmin」セッションを実行します。MIT Kerberosを搭載したマシンでは、次のコマンドを使用できます。

sudo kadmin.local

次に、HTTPプリンシパルを追加し、次のようなコマンドを使用してそのキーをkeytabファイルにエクスポートします。

addprinc -randkey HTTP/www.mydomain.org@MYDOMAIN.ORG
ktadd -k /tmp/http.keytab HTTP/www.mydomain.org@MYDOMAIN.ORG

keytabファイル/tmp/http.keytabがKeycloakを実行しているホストからアクセスできることを確認してください。

Keycloakサーバーのセットアップと構成

Kerberosクライアントをマシンにインストールします。

手順
  1. Kerberosクライアントをインストールします。マシンがFedora、Ubuntu、またはRHELを実行している場合は、Kerberosクライアントとその他のユーティリティを含むfreeipa-clientパッケージをインストールします。

  2. Kerberosクライアントを構成します(Linuxでは、構成設定は/etc/krb5.confファイルにあります)。

    Kerberosレルムを構成に追加し、サーバーが実行されているHTTPドメインを構成します。

    たとえば、MYDOMAIN.ORGレルムの場合、次のようにdomain_realmセクションを構成できます。

    [domain_realm]
      .mydomain.org = MYDOMAIN.ORG
      mydomain.org = MYDOMAIN.ORG
  3. HTTPプリンシパルを含むkeytabファイルをエクスポートし、ファイルがKeycloakサーバーを実行しているプロセスからアクセスできることを確認します。本番環境では、ファイルがこのプロセスでのみ読み取り可能であることを確認してください。

    上記のMIT Kerberosの例では、keytabを/tmp/http.keytabファイルにエクスポートしました。Key Distribution Centre(KDC)とKeycloakが同じホストで実行されている場合、ファイルはすでに利用可能です。

SPNEGO処理の有効化

デフォルトでは、KeycloakはSPNEGOプロトコルサポートを無効にしています。有効にするには、ブラウザーフローに移動し、Kerberosを有効にします。

ブラウザフロー

Browser Flow

Kerberos要件をdisabledからalternative(Kerberosはオプション)またはrequired(ブラウザーでKerberosを有効にする必要がある)に設定します。SPNEGOまたはKerberosを使用するようにブラウザーを構成していない場合、Keycloakは通常のログイン画面にフォールバックします。

Kerberosユーザーストレージフェデレーションプロバイダーの構成

KeycloakがKerberosチケットを解釈する方法を構成するには、ユーザーストレージフェデレーションを使用する必要があります。Kerberos認証をサポートする2つの異なるフェデレーションプロバイダーが存在します。

LDAPサーバーによってバックアップされたKerberosで認証するには、LDAPフェデレーションプロバイダーを構成します。

手順
  1. LDAPプロバイダーの構成ページに移動します。

    LDAP Kerberos統合

    LDAP Kerberos Integration

  2. Kerberos認証を許可するONに切り替えます。

Kerberos認証を許可するにより、KeycloakはKerberosプリンシパルアクセスユーザー情報を使用して、情報をKeycloak環境にインポートできるようにします。

LDAPサーバーがKerberosソリューションをバックアップしていない場合は、Kerberosユーザーストレージフェデレーションプロバイダーを使用します。

手順
  1. メニューの「User Federation (ユーザーフェデレーション)」をクリックします。

  2. プロバイダーを追加の選択ボックスからKerberosを選択します。

    Kerberosユーザーストレージプロバイダー

    Kerberos User Storage Provider

Kerberosプロバイダーは、Kerberosチケットを解析して単純なプリンシパル情報を取得し、その情報をローカルのKeycloakデータベースにインポートします。名、姓、メールアドレスなどのユーザープロファイル情報はプロビジョニングされません。

クライアントマシンのセットアップと構成

クライアントマシンにはKerberosクライアントが必要であり、上記で説明したようにkrb5.confを設定する必要があります。クライアントマシンは、ブラウザーでSPNEGOログインサポートも有効にする必要があります。Firefoxブラウザーを使用している場合は、Kerberos用のFirefoxの構成を参照してください。

.mydomain.org URIは、network.negotiate-auth.trusted-uris構成オプションにある必要があります。

Windowsドメインでは、クライアントは構成を調整する必要はありません。Internet ExplorerとEdgeはすでにSPNEGO認証に参加できます。

設定例

KeycloakとFreeIPAのDockerイメージ

Dockerをインストールしたら、FreeIPAサーバーがインストールされたDockerイメージを実行します。FreeIPAは、MIT Kerberosと389 LDAPサーバーを備えた統合セキュリティソリューションを提供します。イメージには、LDAPフェデレーションプロバイダーで構成され、FreeIPAサーバーに対するSPNEGO/Kerberos認証が有効になっているKeycloakサーバーも含まれています。詳細については、こちらを参照してください。

ApacheDSテストKerberosサーバー

簡単なテストと単体テストには、シンプルなApacheDS Kerberosサーバーを使用します。ソースからKeycloakをビルドし、テストスイートからmaven-exec-pluginを使用してKerberosサーバーを実行する必要があります。詳細については、こちらを参照してください。

資格情報の委任

Kerberosは資格情報の委任をサポートしています。アプリケーションは、Kerberosによって保護された他のサービスと対話するために再利用できるように、Kerberosチケットへのアクセスが必要になる場合があります。KeycloakサーバーがSPNEGOプロトコルを処理したため、OpenID ConnectトークンクレームまたはSAMLアサーション属性内でGSS資格情報をアプリケーションに伝播する必要があります。KeycloakはこれをKeycloakサーバーからアプリケーションに送信します。このクレームをトークンまたはアサーションに挿入するには、各アプリケーションは組み込みのプロトコルマッパーgss delegation credentialを有効にする必要があります。このマッパーは、アプリケーションのクライアントページのマッパータブにあります。詳細については、プロトコルマッパーの章を参照してください。

アプリケーションは、Keycloakから受信したクレームをデシリアライズしてから、他のサービスに対してGSS呼び出しを行うために使用する必要があります。アクセス トークンから GSSCredential オブジェクトに資格情報をデシリアライズする場合は、この資格情報を GSSManager.createContext メソッドに渡して GSSContext を作成します。例:

// Obtain accessToken in your application.
KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) servletReq.getUserPrincipal();
AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken();

// Retrieve Kerberos credential from accessToken and deserialize it
String serializedGssCredential = (String) accessToken.getOtherClaims().
    get(org.keycloak.common.constants.KerberosConstants.GSS_DELEGATION_CREDENTIAL);

GSSCredential deserializedGssCredential = org.keycloak.common.util.KerberosSerializationUtils.
    deserializeCredential(serializedGssCredential);

// Create GSSContext to call other Kerberos-secured services
GSSContext context = gssManager.createContext(serviceName, krb5Oid,
    deserializedGssCredential, GSSContext.DEFAULT_LIFETIME);

krb5.confファイルでforwardable Kerberosチケットを構成し、委任された資格情報のサポートをブラウザーに追加します。

資格情報の委任にはセキュリティ上の意味合いがあるため、必要な場合にのみ、HTTPSでのみ使用してください。詳細と例については、この記事を参照してください。

クロスレルム信頼

Kerberosプロトコルでは、realmはKerberosプリンシパルのセットです。これらのプリンシパルの定義は、通常はLDAPサーバーであるKerberosデータベースに存在します。

Kerberosプロトコルは、クロスレルム信頼を許可します。たとえば、2つのKerberosレルムAとBが存在する場合、クロスレルム信頼により、レルムAのユーザーはレルムBのリソースにアクセスできるようになります。レルムBはレルムAを信頼します。

Kerberosクロスレルム信頼

kerberos trust basic

Keycloakサーバーはクロスレルム信頼をサポートしています。これを実装するには、次を実行します。

  • クロスレルム信頼のためにKerberosサーバーを構成します。この手順の実装は、Kerberosサーバーの実装によって異なります。この手順は、Kerberosプリンシパルkrbtgt/B@AをレルムAとBのKerberosデータベースに追加するために必要です。このプリンシパルは、両方のKerberosレルムで同じキーを持っている必要があります。プリンシパルは、両方のレルムで同じパスワード、キーバージョン番号、および暗号を持っている必要があります。詳細については、Kerberosサーバーのドキュメントを参照してください。

クロスレルム信頼は、デフォルトでは一方向です。レルムAとレルムB間の双方向信頼のために、プリンシパルkrbtgt/A@Bを両方のKerberosデータベースに追加する必要があります。ただし、信頼はデフォルトで推移的です。レルムBがレルムAを信頼し、レルムCがレルムBを信頼する場合、レルムCはプリンシパルkrbtgt/C@Aが利用可能でなくてもレルムAを信頼します。クライアントが信頼パスを見つけられるようにするには、追加の構成(たとえば、capaths)がKerberosクライアント側で必要になる場合があります。詳細については、Kerberosドキュメントを参照してください。

  • Keycloakサーバーを構成します。

    • Kerberosサポート付きのLDAPストレージプロバイダーを使用する場合は、レルムBのサーバープリンシパルを構成します。例:HTTP/mydomain.com@B。レルムAのユーザーがKeycloakに対して正常に認証するには、LDAPサーバーがレルムAのユーザーを見つける必要があります。これは、KeycloakがSPNEGOフローを実行してからユーザーを見つける必要があるためです。

ユーザーの検索は、LDAPストレージプロバイダーのオプションKerberos principal attributeに基づいています。これがuserPrincipalNameのような値で構成されている場合、ユーザーjohn@AのSPNEGO認証後、KeycloakはuserPrincipalName属性がjohn@Aと同等のLDAPユーザーを検索しようとします。Kerberos principal attributeが空のままの場合、Keycloakはレルムを省略したKerberosプリンシパルのプレフィックスに基づいてLDAPユーザーを検索します。たとえば、Kerberosプリンシパルユーザーjohn@Aは、ユーザー名johnの下のLDAPで利用可能である必要があります。通常は、uid=john,ou=People,dc=example,dc=comのようなLDAP DNの下にあります。レルムAとBのユーザーを認証する場合は、LDAPがレルムAとBの両方のユーザーを見つけることができるようにしてください。

  • Kerberosユーザーストレージプロバイダー(通常、LDAP統合なしのKerberos)を使用する場合は、サーバープリンシパルをHTTP/mydomain.com@Bとして構成し、KerberosレルムAとBのユーザーが認証できるようにする必要があります。

複数のKerberosレルムのユーザーは、すべてのユーザーが認証に使用されたKerberosプリンシパルを参照する属性KERBEROS_PRINCIPALを持ち、これがこのユーザーのさらなるルックアップに使用されるため、認証できます。両方のKerberosレルムABにユーザーjohnがいる場合に競合を回避するために、Keycloakユーザーのユーザー名にはKerberosレルムが小文字で含まれている場合があります。たとえば、ユーザー名はjohn@aになります。レルムが構成済みのKerberos realmと一致する場合に限り、レルムサフィックスは生成されたユーザー名から省略される場合があります。たとえば、Kerberos realmがKerberosプロバイダーでAとして構成されている限り、Kerberosプリンシパルjohn@Aのユーザー名はjohnになります。

トラブルシューティング

問題が発生した場合は、問題のデバッグのために追加のロギングを有効にします。

  • KerberosまたはLDAPフェデレーションプロバイダーの管理コンソールでDebugフラグを有効にします。

  • カテゴリorg.keycloakのTRACEロギングを有効にして、サーバーログでより多くの情報を受け取ります。

  • システムプロパティ-Dsun.security.krb5.debug=trueおよび-Dsun.security.spnego.debug=trueを追加します。

X.509クライアント証明書ユーザー認証

Keycloakは、相互SSL認証を使用するようにサーバーを構成している場合、X.509クライアント証明書を使用したログインをサポートしています。

一般的なワークフロー

  • クライアントはSSL/TLSチャネル経由で認証リクエストを送信します。

  • SSL/TLSハンドシェイク中に、サーバーとクライアントはx.509/v3証明書を交換します。

  • コンテナ(WildFly)は、証明書PKIXパスと証明書の有効期限を検証します。

  • x.509クライアント証明書オーセンティケーターは、次の方法を使用してクライアント証明書を検証します。

    • CRLまたはCRL配布ポイントを使用して、証明書の失効ステータスをチェックします。

    • OCSP(オンライン証明書ステータスプロトコル)を使用して、証明書の失効ステータスをチェックします。

    • 証明書のキーが予期されるキーと一致するかどうかを検証します。

    • 証明書の拡張キーが予期される拡張キーと一致するかどうかを検証します。

  • これらのチェックのいずれかが失敗した場合、x.509認証は失敗します。それ以外の場合、オーセンティケーターは証明書のIDを抽出し、既存のユーザーにマッピングします。

証明書が既存のユーザーにマッピングされると、動作は認証フローによって異なります。

  • ブラウザーフローでは、サーバーはユーザーにIDの確認またはユーザー名とパスワードでのサインインを求めます。

  • ダイレクトグラントフローでは、サーバーはユーザーをサインインします。

Webコンテナが証明書PKIXパスを検証するのはWebコンテナの責任であることに注意してください。Keycloak側のX.509オーセンティケーターは、証明書の有効期限、証明書失効ステータス、およびキーの使用状況をチェックするための追加サポートのみを提供します。リバースプロキシの背後にデプロイされたKeycloakを使用している場合は、リバースプロキシがPKIXパスを検証するように構成されていることを確認してください。リバースプロキシを使用せず、ユーザーがWildFlyに直接アクセスする場合は、WildFlyが以下で説明するように構成されている限り、PKIXパスが検証されるため問題ありません。

機能

サポートされている証明書IDソース

  • 正規表現を使用したSubjectDNのマッチング

  • X500サブジェクトのメール属性

  • Subject Alternative Name Extension(RFC822Name General Name)からのX500サブジェクトのメール

  • X.500 Subject Alternative Name Extension からの X.500 Subject の別名。この別名は通常、ユーザープリンシパル名 (UPN) です。

  • X.500 Subject の共通名属性

  • 正規表現を使用した IssuerDN のマッチング

  • 証明書シリアル番号

  • 証明書シリアル番号と IssuerDN

  • SHA-256 証明書サムプリント

  • PEM 形式の完全な証明書

正規表現

Keycloak は、フィルターとして正規表現を使用して、Subject DN または Issuer DN から証明書 ID を抽出します。たとえば、この正規表現はメール属性に一致します。

emailAddress=(.*?)(?:,|$)

正規表現フィルタリングは、Identity Source正規表現を使用した SubjectDN のマッチング または 正規表現を使用した IssuerDN のマッチング のいずれかに設定されている場合に適用されます。

証明書 ID の既存ユーザーへのマッピング

証明書 ID マッピングは、抽出されたユーザー ID を、証明書 ID に一致する既存ユーザーのユーザー名、メールアドレス、またはカスタム属性にマップできます。たとえば、Identity sourceSubject のメールアドレス に、または User mapping methodユーザー名またはメールアドレス に設定すると、X.509 クライアント証明書オーセンティケーターは、ユーザー名またはメールアドレスで既存のユーザーを検索する際の検索基準として、証明書の Subject DN のメール属性を使用します。

  • レルム設定で メールアドレスでのログイン を無効にすると、証明書認証にも同じルールが適用されます。ユーザーはメールアドレス属性を使用してログインできません。

  • 証明書シリアル番号と IssuerDN を ID ソースとして使用するには、シリアル番号と IssuerDN 用の 2 つのカスタム属性が必要です。

  • SHA-256 証明書サムプリント は、SHA-256 証明書サムプリントの小文字の 16 進数表現です。

  • PEM 形式の完全な証明書 を ID ソースとして使用することは、LDAP などの外部フェデレーションソースにマッピングされたカスタム属性に限定されます。Keycloak は長さ制限のため証明書をデータベースに保存できないため、LDAP の場合は、常に LDAP から値を読み込む を有効にする必要があります。

拡張証明書検証
  • CRL を使用した失効ステータスチェック。

  • CRL/Distribution Point を使用した失効ステータスチェック。

  • OCSP/レスポンダ URI を使用した失効ステータスチェック。

  • 証明書 KeyUsage 検証。

  • 証明書 ExtendedKeyUsage 検証。

ブラウザフローへの X.509 クライアント証明書認証の追加

  1. メニューの認証をクリックします。

  2. Browser フローをクリックします。

  3. アクション リストから 複製 を選択します。

  4. コピーの名前を入力します。

  5. 複製 をクリックします。

  6. ステップを追加をクリックします。

  7. "X509/Validate Username Form" をクリックします。

  8. 追加をクリックします。

    X509 実行

    X509 Execution

  9. "X509/Validate Username Form" を "Browser Forms" 実行の上にドラッグアンドドロップします。

  10. 要件を "ALTERNATIVE" に設定します。

    X509 ブラウザフロー

    X509 Browser Flow

  11. アクション メニューをクリックします。

  12. フローをバインド をクリックします。

  13. ドロップダウンリストから Browser フロー をクリックします。

  14. 保存をクリックします。

    X509 ブラウザフローバインディング

    X509 Browser Flow Bindings

X.509 クライアント証明書認証の設定

X509 設定

X509 Configuration

ユーザー ID ソース

クライアント証明書からユーザー ID を抽出する方法を定義します。

Canonical DN 表現を有効にする

識別名を決定するために正規形式を使用するかどうかを定義します。公式の Java API ドキュメント に形式が記載されています。このオプションは、2 つのユーザー ID ソース 正規表現を使用した SubjectDN のマッチング正規表現を使用した IssuerDN のマッチング のみに影響します。新しい Keycloak インスタンスをセットアップする場合は、このオプションを有効にします。既存の Keycloak インスタンスとの下位互換性を維持するには、このオプションを無効にします。

シリアル番号の 16 進数表現を有効にする

シリアル番号 を 16 進数として表現します。符号ビットが 1 に設定されているシリアル番号は、00 オクテットで左パディングする必要があります。たとえば、10 進数値 161、または 16 進数表現 a1 のシリアル番号は、RFC5280 に従って 00a1 としてエンコードされます。詳細については、RFC5280、付録 B を参照してください。

正規表現

証明書 ID の抽出にフィルターとして使用する正規表現。式には単一のグループが含まれている必要があります。

ユーザーマッピング方法

証明書 ID を既存のユーザーとマッチングさせる方法を定義します。ユーザー名またはメールアドレス は、ユーザー名またはメールアドレスで既存のユーザーを検索します。カスタム属性マッパー は、証明書 ID に一致するカスタム属性を持つ既存のユーザーを検索します。カスタム属性の名前は設定可能です。

ユーザー属性の名前

証明書 ID と照合される値を持つカスタム属性。属性マッピングが複数の値に関連付けられている場合は、複数のカスタム属性を使用します。たとえば、「証明書シリアル番号と IssuerDN」などです。

CRL チェックを有効にする

証明書失効リストを使用して証明書の失効ステータスを確認します。リストの場所は、CRL ファイルパス 属性で定義されています。

証明書失効ステータスを確認するために CRL Distribution Point を有効にする

CDP を使用して証明書の失効ステータスを確認します。ほとんどの PKI 認証局は証明書に CDP を含めています。

CRL ファイルパス

CRL リストを含むファイルへのパス。CRL チェックを有効にする オプションが有効になっている場合、値は有効なファイルへのパスである必要があります。

CRL が更新されていない場合に中止する

RFC5280 に準拠する CRL には、次回の CRL が発行される日付を示す次の更新フィールドが含まれています。その時間が経過すると、CRL は古くなったと見なされ、更新する必要があります。このオプションが true の場合、CRL が古くなっていると認証は失敗します (推奨)。オプションが false に設定されている場合、古い CRL は引き続きユーザー証明書の検証に使用されます。

OCSP チェックを有効にする

オンライン証明書ステータスプロトコルを使用して証明書の失効ステータスを確認します。

OCSP フェイルオープン動作

デフォルトでは、認証を成功させるには、OCSP チェックが肯定的な応答を返す必要があります。ただし、このチェックが決定的なものではない場合があります。たとえば、OCSP サーバーに到達できない、過負荷になっている、またはクライアント証明書に OCSP レスポンダ URI が含まれていないなどです。この設定が ON になっている場合、認証は、OCSP レスポンダから明示的な否定応答が受信され、証明書が確実に失効している場合にのみ拒否されます。有効な OCSP 応答が利用できない場合、認証試行は受け入れられます。

OCSP レスポンダ URI

証明書の OCSP レスポンダ URI の値をオーバーライドします。

Key Usage の検証

証明書の KeyUsage 拡張ビットが設定されていることを検証します。たとえば、「digitalSignature,KeyEncipherment」は、KeyUsage 拡張のビット 0 と 2 が設定されているかどうかを検証します。Key Usage の検証を無効にするには、このパラメーターを空のままにします。詳細については、RFC5280、セクション 4.2.1.3 を参照してください。Keycloak は、Key Usage の不一致が発生するとエラーを発生させます。

Extended Key Usage の検証

Extended Key Usage 拡張で定義された 1 つ以上の目的を検証します。詳細については、RFC5280、セクション 4.2.1.12 を参照してください。Extended Key Usage の検証を無効にするには、このパラメーターを空のままにします。Keycloak は、発行 CA によってクリティカルとしてフラグが立てられ、Key Usage 拡張の不一致が発生するとエラーを発生させます。

証明書ポリシーの検証

証明書ポリシー拡張で定義された 1 つ以上のポリシー OID を検証します。 RFC5280、セクション 4.2.1.4 を参照してください。証明書ポリシーの検証を無効にするには、パラメーターを空のままにします。複数のポリシーはコンマで区切る必要があります。

証明書ポリシー検証モード

証明書ポリシーの検証 設定で複数のポリシーが指定されている場合、マッチングは、要求されたすべてのポリシーが存在するかどうかを確認する必要があるか、1 つのマッチで認証が成功するかどうかを決定します。デフォルト値は All であり、これは、要求されたすべてのポリシーがクライアント証明書に存在する必要があることを意味します。

ID 確認をバイパスする

有効にすると、X.509 クライアント証明書認証は、ユーザーに証明書 ID の確認を求めません。Keycloak は認証に成功するとユーザーをサインインさせます。

クライアント証明書を再検証する

設定されている場合、クライアント証明書トラストチェーンは、設定されたトラストストアに存在する証明書を使用して、常にアプリケーションレベルで検証されます。これは、基盤となる Web サーバーがクライアント証明書チェーンの検証を強制しない場合 (たとえば、検証しないロードバランサーまたはリバースプロキシの背後にある場合)、または許可された CA の数が相互 SSL ネゴシエーションに対して多すぎる場合 (ほとんどのブラウザーは、最大 SSL ネゴシエーションパケットサイズを 32767 バイトに制限しており、これは約 200 のアドバタイズされた CA に相当します) に役立ちます。デフォルトでは、このオプションはオフになっています。

ダイレクトグラントフローへの X.509 クライアント証明書認証の追加

  1. メニューの認証をクリックします。

  2. 組み込みの "Direct grant" フローのコピーを作成するには、"アクションリスト" から 複製 を選択します。

  3. コピーの名前を入力します。

  4. 複製 をクリックします。

  5. 作成したフローをクリックします。

  6. "ユーザー名検証" のゴミ箱アイコン 🗑️ をクリックし、削除 をクリックします。

  7. "パスワード" のゴミ箱アイコン 🗑️ をクリックし、削除 をクリックします。

  8. ステップを追加をクリックします。

  9. "X509/Validate Username" をクリックします。

  10. 追加をクリックします。

    X509 ダイレクトグラント実行

    X509 Direct Grant Execution

  11. x509 ブラウザフロー セクションで説明されている手順に従って、x509 認証設定をセットアップします。

  12. バインディング タブをクリックします。

  13. ダイレクトグラントフロー ドロップダウンリストをクリックします。

  14. 新しく作成した "x509 Direct Grant" フローをクリックします。

  15. 保存をクリックします。

    X509 ダイレクトグラントフローバインディング

    X509 Direct Grant Flow Bindings

CURL を使用した例

次の例は、ダイレクトグラントフローを使用してレルム test のユーザーのアクセストークンを取得する方法を示しています。この例では、アプリのセキュリティ保護 セクションの OAuth2 リソースオーナーパスワードクレデンシャルグラント とコンフィデンシャルクライアント resource-owner を使用しています。

curl \
  -d "client_id=resource-owner" \
  -d "client_secret=40cc097b-2a57-4c17-b36a-8fdf3fc2d578" \
  -d "grant_type=password" \
  --cacert /tmp/truststore.pem \
  --cert /tmp/keystore.pem:kssecret \
  "https://#:8543/realms/test/protocol/openid-connect/token"

ファイル /tmp/truststore.pem は、Keycloak サーバーの証明書を含むトラストストアを持つファイルを指します。ファイル /tmp/keystore.pem には、Keycloak ユーザーに対応する秘密鍵と証明書が含まれており、このリクエストによって正常に認証されます。証明書から Keycloak ユーザーへのコンテンツのマッピングの正確な方法は、設定セクション で説明されているように、オーセンティケーターの構成によって異なります。kssecret は、このキーストアファイルのパスワードである可能性があります。

環境に応じて、たとえば CURL コマンドに追加のオプションを使用する必要がある場合があります。

  • 自己署名証明書を使用している場合は、--insecure オプション

  • 証明書認証局パスを含むディレクトリ全体を含めるための --capath オプション

  • PEM とは異なるファイルを使用する場合の --cert-type または --key-type オプション

必要に応じて、curl ツールのドキュメントを参照してください。curl 以外のツールを使用している場合は、ツールのドキュメントを参照してください。ただし、セットアップは似ています。コンフィデンシャルクライアントを使用している場合は、キーストアとトラストストア、およびクライアントクレデンシャルを含める必要があります。

可能であれば、ダイレクトグラントに X.509 認証を使用するのではなく、MTLS クライアント認証 (クライアントオーセンティケーター X509 Certificate) と組み合わせて サービスアカウント を使用することをお勧めします。ダイレクトグラントでは、ユーザー証明書をクライアントアプリケーションと共有する必要がある場合があるためです。サービスアカウントを使用する場合、トークンはクライアント自体に代わって取得されます。これは、一般的に優れており、より安全なプラクティスです。

W3C Web Authentication (WebAuthn)

Keycloak は、W3C Web Authentication (WebAuthn) のサポートを提供します。Keycloak は、WebAuthn の Relying Party (RP) として機能します。

WebAuthn の操作の成功は、ユーザーの WebAuthn をサポートするオーセンティケーター、ブラウザー、およびプラットフォームに依存します。オーセンティケーター、ブラウザー、およびプラットフォームが WebAuthn 仕様をサポートしていることを確認してください。

WebAuthn の仕様では、user.id を使用して、公開鍵クレデンシャルを Relying Party の特定のユーザーアカウントにマッピングします。このユーザー ID ハンドルは、最大サイズが 64 バイトの不透明なバイトシーケンスです。Keycloak は、登録に内部データベース ID を渡します。これは、一般的なユーザーでは 36 文字の UUID です。ただし、ユーザーが外部ユーザーフェデレーションプロバイダーからのユーザーである場合、内部 Keycloak ID は ストレージ ID であり、f:<provider-id>:<user-id> の形式で、64 バイトの制限を超える可能性があります。Storage SPI と WebAuthn を組み合わせる場合は、この点を考慮し、フェデレーションプロバイダーコンポーネントとプロバイダーからのユーザーに短い ID を使用してください。

セットアップ

2FA の WebAuthn サポートのセットアップ手順は次のとおりです。

WebAuthn オーセンティケーター登録の有効化
  1. メニューの認証をクリックします。

  2. Required Actionsタブをクリックします。

  3. Webauthn Register スイッチを ON に切り替えます。

すべての新規ユーザーに WebAuthn クレデンシャルの登録を要求する場合は、デフォルトアクション スイッチを ON に切り替えます。

ブラウザフローへの WebAuthn 認証の追加

  1. メニューの認証をクリックします。

  2. Browser フローをクリックします。

  3. 組み込みの Browser フローのコピーを作成するには、"アクションリスト" から 複製 を選択します。

  4. コピーの名前として "WebAuthn Browser" を入力します。

  5. 複製 をクリックします。

  6. 名前をクリックして詳細に移動します。

  7. "WebAuthn Browser Browser - Conditional OTP" のゴミ箱アイコン 🗑️ をクリックし、削除 をクリックします。

すべてのユーザーに WebAuthn を要求する場合

  1. WebAuthn Browser Forms+ メニューをクリックします。

  2. ステップを追加をクリックします。

  3. WebAuthn Authenticator をクリックします。

  4. 追加をクリックします。

  5. WebAuthn Authenticator 認証タイプの 必須 を選択して、その要件を必須に設定します。

    Webauthn browser flow required

  6. 画面上部のアクションメニューをクリックします。

  7. ドロップダウンリストから フローをバインド を選択します。

  8. ドロップダウンリストから Browser を選択します。

  9. 保存をクリックします。

ユーザーが WebAuthn クレデンシャルを持っていない場合、ユーザーは WebAuthn クレデンシャルを登録する必要があります。

WebAuthnクレデンシャルのみを登録しているユーザーは、WebAuthnでログインできます。そのため、WebAuthn Authenticatorの実行を追加する代わりに、以下を実行できます。

手順
  1. WebAuthn Browser Forms行の+メニューをクリックします。

  2. サブフローを追加をクリックします。

  3. nameフィールドに「Conditional 2FA」と入力します。

  4. Conditional 2FAConditionalを選択して、要件を条件付きに設定します。

  5. Conditional 2FA行で、プラス記号+をクリックし、Add conditionを選択します。

  6. 条件を追加をクリックします。

  7. Condition - User Configuredを選択します。

  8. 追加をクリックします。

  9. Condition - User ConfiguredRequiredを選択して、要件を必須に設定します。

  10. WebAuthn AuthenticatorConditional 2FAフローにドラッグアンドドロップします。

  11. WebAuthn AuthenticatorAlternativeを選択して、要件を代替に設定します。

    Webauthn browser flow conditional

ユーザーは、第2要素としてWebAuthnとOTPのどちらかを選択できます。

手順
  1. Conditional 2FA行で、プラス記号+をクリックし、Add stepを選択します。

  2. リストからOTP フォームを選択します。

  3. 追加をクリックします。

  4. OTP FormAlternativeを選択して、要件を代替に設定します。

    WebAuthn browser flow conditional with OTP

WebAuthnオーセンティケーターでの認証

WebAuthnオーセンティケーターを登録した後、ユーザーは以下の操作を実行します。

  • ログインフォームを開きます。ユーザーはユーザー名とパスワードで認証する必要があります。

  • ユーザーのブラウザは、WebAuthnオーセンティケーターを使用して認証するようにユーザーに求めます。

管理者としてWebAuthnを管理する

クレデンシャルを管理する

Keycloakは、ユーザー資格情報管理の他の資格情報と同様にWebAuthn資格情報を管理します。

  • Keycloakは、リセットアクションリストからWebauthn Registerを選択して、WebAuthnクレデンシャルを作成するための必須アクションをユーザーに割り当てます。

  • 管理者は、削除をクリックしてWebAuthnクレデンシャルを削除できます。

  • 管理者は、データを表示…を選択して、AAGUIDなどのクレデンシャルのデータを表示できます。

  • 管理者は、ユーザーラベルフィールドに値を設定し、データを保存することで、クレデンシャルのラベルを設定できます。

ポリシーを管理する

管理者は、レルムごとにWebAuthnポリシーとしてWebAuthn関連の操作を設定できます。

手順
  1. メニューの認証をクリックします。

  2. ポリシー」タブをクリックします。

  3. WebAuthnポリシータブをクリックします。

  4. ポリシー内の項目を設定します(以下の説明を参照)。

  5. 保存をクリックします。

設定可能な項目とその説明は以下のとおりです。

構成 説明

証明書利用者エンティティ名

WebAuthn証明書利用者としての読み取り可能なサーバー名。この項目は必須であり、WebAuthnオーセンティケーターの登録に適用されます。デフォルト設定は「keycloak」です。詳細については、WebAuthn仕様を参照してください。

署名アルゴリズム

公開鍵クレデンシャルに使用する署名アルゴリズムをWebAuthnオーセンティケーターに指示するアルゴリズム。Keycloakは、認証アサーションに署名および検証するために公開鍵クレデンシャルを使用します。アルゴリズムが存在しない場合、デフォルトのES256およびRS256が採用されます。ES256およびRS256は、WebAuthnオーセンティケーターの登録に適用されるオプションの設定項目です。詳細については、WebAuthn仕様を参照してください。

証明書利用者ID

公開鍵クレデンシャルのスコープを決定するWebAuthn証明書利用者のID。IDは、オリジンの有効ドメインである必要があります。このIDは、WebAuthnオーセンティケーターの登録に適用されるオプションの設定項目です。このエントリが空白の場合、KeycloakはKeycloakのベースURLのホスト部分を採用します。詳細については、WebAuthn仕様を参照してください。

Attestation Conveyance Preference(アテステーション伝達優先度)

ブラウザ上のWebAuthn API実装(WebAuthnクライアント)は、アテステーションステートメントを生成するための優先メソッドです。この優先度は、WebAuthnオーセンティケーターの登録に適用されるオプションの設定項目です。オプションが存在しない場合、その動作は「none」を選択した場合と同じです。詳細については、WebAuthn仕様を参照してください。

Authenticator Attachment(オーセンティケーターアタッチメント)

WebAuthnクライアントに対するWebAuthnオーセンティケーターの許容可能なアタッチメントパターン。このパターンは、WebAuthnオーセンティケーターの登録に適用されるオプションの設定項目です。詳細については、WebAuthn仕様を参照してください。

Require Discoverable Credential(ディスカバラブルクレデンシャルを必須にする)

WebAuthnオーセンティケーターがクライアントサイドディスカバラブルクレデンシャルとして公開鍵クレデンシャルを生成することを要求するオプション。このオプションは、WebAuthnオーセンティケーターの登録に適用されます。空白のままにすると、その動作は「No」を選択した場合と同じです。詳細については、WebAuthn仕様を参照してください。

User Verification Requirement(ユーザー検証要件)

WebAuthnオーセンティケーターがユーザーの検証を確認することを要求するオプション。これは、WebAuthnオーセンティケーターの登録と、WebAuthnオーセンティケーターによるユーザーの認証に適用されるオプションの設定項目です。オプションが存在しない場合、その動作は「preferred」を選択した場合と同じです。詳細については、WebAuthnオーセンティケーターの登録に関するWebAuthn仕様およびWebAuthnオーセンティケーターによるユーザーの認証に関するWebAuthn仕様を参照してください。

タイムアウト

WebAuthnオーセンティケーターの登録と、WebAuthnオーセンティケーターを使用したユーザーの認証のタイムアウト値(秒単位)。ゼロに設定すると、その動作はWebAuthnオーセンティケーターの実装に依存します。デフォルト値は0です。詳細については、WebAuthnオーセンティケーターの登録に関するWebAuthn仕様およびWebAuthnオーセンティケーターによるユーザーの認証に関するWebAuthn仕様を参照してください。

同じオーセンティケーターの再登録を回避する

有効にすると、Keycloakは既に登録されているWebAuthnオーセンティケーターを再登録できません。

Acceptable AAGUIDs(許容可能なAAGUID)

WebAuthnオーセンティケーターが登録する必要があるAAGUIDのホワイトリスト。

アテステーションステートメントの検証

WebAuthnオーセンティケーターを登録する際、KeycloakはWebAuthnオーセンティケーターによって生成されたアテステーションステートメントの信頼性を検証します。Keycloakは、トラストストアにインポートされたトラストアンカーの証明書を必要とします。

この検証を省略するには、このトラストストアを無効にするか、WebAuthnポリシーの設定項目「Attestation Conveyance Preference」を「none」に設定します。

ユーザーとしてWebAuthnクレデンシャルを管理する

WebAuthnオーセンティケーターを登録する

WebAuthnオーセンティケーターを登録する適切な方法は、ユーザーがKeycloakにアカウントを既に登録しているかどうかによって異なります。

新規ユーザー

レルムでWebAuthn Register必須アクションがデフォルトアクションの場合、新規ユーザーは最初のログイン後にパスキーを設定する必要があります。

手順
  1. ログインフォームを開きます。

  2. Registerをクリックします。

  3. フォームの項目を記入します。

  4. Registerをクリックします。

登録が成功すると、ブラウザはユーザーにWebAuthnオーセンティケーターのラベルのテキストを入力するように求めます。

既存ユーザー

最初の例に示すように、WebAuthn Authenticatorが必須として設定されている場合、既存ユーザーがログインしようとすると、WebAuthnオーセンティケーターを自動的に登録する必要があります。

手順
  1. ログインフォームを開きます。

  2. フォームの項目を入力します。

  3. 保存をクリックします。

  4. ログインをクリックします。

登録が成功すると、ユーザーのブラウザはユーザーにWebAuthnオーセンティケーターのラベルのテキストを入力するように求めます。

パスワードレスWebAuthnと2要素認証

Keycloakは2要素認証にWebAuthnを使用しますが、WebAuthnを第一要素認証として使用できます。この場合、パスワードレスWebAuthnクレデンシャルを持つユーザーは、パスワードなしでKeycloakに認証できます。Keycloakは、レルムおよび単一の認証フローのコンテキストで、パスワードレスと2要素認証メカニズムの両方としてWebAuthnを使用できます。

管理者は通常、WebAuthnパスワードレス認証のためにユーザーが登録したパスキーが異なる要件を満たすことを要求します。たとえば、パスキーはユーザーにPINを使用してパスキーに対して認証することを要求したり、パスキーがより強力な認証局で証明したりする場合があります。

このため、Keycloakを使用すると、管理者は個別のWebAuthn Passwordless Policyを設定できます。Webauthn Register Passwordlessアクション(タイプ)と、WebAuthn Passwordless Authenticator(タイプ)の個別のオーセンティケーターが必要です。

セットアップ

WebAuthnパスワードレスサポートを次のように設定します。

  1. (まだ存在しない場合)WebAuthnパスワードレスサポートの新しい必須アクションを登録します。WebAuthnオーセンティケーター登録の有効化で説明されている手順を使用します。Webauthn Register Passwordlessアクションを登録します。

  2. ポリシーを設定します。ポリシーの管理で説明されている手順と構成オプションを使用できます。管理コンソールのWebAuthn Passwordless Policyタブで構成を実行します。通常、パスキーの要件は、2要素ポリシーよりも厳しくなります。たとえば、パスワードレスポリシーを構成するときに、User Verification RequirementRequiredに設定できます。

  3. 認証フローを設定します。ブラウザフローへのWebAuthn認証の追加で説明されているWebAuthn Browserフローを使用します。フローを次のように構成します。

    • WebAuthn Browser Formsサブフローには、最初のオーセンティケーターとしてUsername Formが含まれています。デフォルトのUsername Password Formオーセンティケーターを削除し、Username Formオーセンティケーターを追加します。このアクションでは、ユーザーが最初のステップとしてユーザー名を提供する必要があります。

    • たとえば、Passwordless Or Two-factorという名前を付けることができる必須のサブフローがあります。このサブフローは、ユーザーがパスワードレスWebAuthnクレデンシャルまたは2要素認証で認証できることを示します。

    • フローには、最初の代替としてWebAuthn Passwordless Authenticatorが含まれています。

    • 2番目の代替は、たとえばPassword And Two-factor Webauthnという名前のサブフローになります。このサブフローには、Password FormWebAuthn Authenticatorが含まれています。

フローの最終的な構成は次のようになります。

パスワードレスフロー

PasswordLess flow

これで、Keycloakに既に認識されているユーザーにWebAuthn Register Passwordlessを必須アクションとして追加して、これをテストできます。最初の認証中、ユーザーはパスワードと2要素WebAuthnクレデンシャルを使用する必要があります。ユーザーがWebAuthnパスワードレスクレデンシャルを使用する場合、パスワードと2要素WebAuthnクレデンシャルを提供する必要はありません。

ログインレスWebAuthn

Keycloakは2要素認証にWebAuthnを使用しますが、WebAuthnを第一要素認証として使用できます。この場合、パスワードレスWebAuthnクレデンシャルを持つユーザーは、ログインまたはパスワードを送信せずにKeycloakに認証できます。Keycloakは、レルムのコンテキストで、ログインレス/パスワードレスと2要素認証メカニズムの両方としてWebAuthnを使用できます。

管理者は通常、WebAuthnログインレス認証のためにユーザーが登録したパスキーが異なる要件を満たすことを要求します。ログインレス認証では、ユーザーがパスキーに対して認証する必要があり(たとえば、PINコードまたは指紋を使用)、ログインレスクレデンシャルに関連付けられた暗号化キーがパスキーに物理的に保存されている必要があります。すべてのパスキーがそのような要件を満たしているわけではありません。デバイスが「ユーザー検証」と「ディスカバラブルクレデンシャル」をサポートしているかどうかをパスキーベンダーに確認してください。サポートされているパスキーを参照してください。

Keycloakを使用すると、管理者はログインレス認証を許可する方法でWebAuthn Passwordless Policyを構成できます。ログインレス認証は、WebAuthn Passwordless PolicyおよびWebAuthn Passwordlessクレデンシャルでのみ構成できることに注意してください。WebAuthnログインレス認証とWebAuthnパスワードレス認証は同じレルムで構成できますが、同じポリシーWebAuthn Passwordless Policyを共有します。

セットアップ
手順

WebAuthnログインレスサポートを次のように設定します。

  1. (まだ存在しない場合)WebAuthnパスワードレスサポートの新しい必須アクションを登録します。WebAuthnオーセンティケーター登録の有効化で説明されている手順を使用します。Webauthn Register Passwordlessアクションを登録します。

  2. WebAuthn Passwordless Policyを設定します。管理コンソール、Authenticationセクション、PoliciesWebAuthn Passwordless Policyタブで構成を実行します。ログインレスシナリオのポリシーを構成する場合は、User Verification Requirementrequiredに、Require Discoverable CredentialYesに設定する必要があります。専用のログインレスポリシーがないため、user verification=no/discoverable credential=noの認証シナリオとログインレスシナリオ(user verification=yes/discoverable credential=yes)を混在させることはできません。ストレージ容量は通常パスキーで非常に限られているため、パスキーに多くのディスカバラブルクレデンシャルを保存することはできません。

  3. 認証フローを設定します。新しい認証フローを作成し、「WebAuthn Passwordless」実行を追加し、実行の要件設定を必須に設定します。

フローの最終的な構成は次のようになります。

ログインレスフロー

LoginLess flow

これで、Keycloakに既に認識されているユーザーに必須アクションWebAuthn Register Passwordlessを追加して、これをテストできます。必須アクションが構成されたユーザーは、(たとえばユーザー名/パスワードを使用して)認証する必要があり、ログインレス認証に使用されるパスキーを登録するように求められます。

ベンダー固有の注意
互換性チェックリスト

Keycloakを使用したログインレス認証では、パスキーが次の機能を満たす必要があります。

  • FIDO2準拠:FIDO/U2Fと混同しないでください。

  • ユーザー検証:パスキーがユーザーを認証する機能(誰かがあなたのパスキーを見つけてログインレスおよびパスワードレス認証を行うのを防ぎます)

  • ディスカバラブルクレデンシャル:パスキーがログイン情報とクライアントアプリケーションに関連付けられた暗号鍵を保存する機能

Windows Hello

Windows HelloベースのクレデンシャルをKeycloakに対して認証に使用するには、WebAuthn Passwordless Policy署名アルゴリズム設定にRS256の値を含めるように構成します。一部のブラウザは、プライベートウィンドウ内でプラットフォームパスキー(Windows Helloなど)へのアクセスを許可しないことに注意してください。

サポートされているパスキー

次のパスキーは、Keycloakでのログインレス認証で正常にテストされています。

  • Windows Hello (Windows 10 21H1/21H2)

  • Yubico Yubikey 5 NFC

  • Feitian ePass FIDO-NFC

パスキー

Keycloakはパスキーのプレビューサポートを提供します。Keycloakはパスキーの証明書利用者 (RP) として機能します。

パスキーの登録と認証は、WebAuthnの機能によって実現されます。したがって、Keycloakのユーザーは、既存のWebAuthnの登録と認証によってパスキーの登録と認証を行うことができます。

同期されたパスキーとデバイスバインドされたパスキーの両方を、同一デバイス認証とクロスデバイス認証 (CDA) の両方で使用できます。ただし、パスキーの操作の成否はユーザーの環境に依存します。環境内でどの操作が成功するかを確認してください。

条件付きUIを使用したパスキー認証

条件付きUIを使用したパスキー認証は、LoginLess WebAuthnと同様の方法で、ユーザーをパスキーで認証できます。この認証では、ユーザーがブラウザを実行しているデバイスに保存されているパスキーのリストがユーザーに表示されます。したがって、ユーザーはリストからパスキーの1つを選択して認証できます。LoginLess WebAuthnと比較して、この認証はユーザーの認証エクスペリエンスを向上させます。

この認証は、WebAuthn Conditional UIを使用します。したがって、この認証の成功はユーザーの環境に依存します。環境がWebAuthn Conditional UIをサポートしていない場合、この認証はLoginLess WebAuthnにフォールバックします。

パスキー認証はプレビューであり、完全にサポートされていません。この機能はデフォルトで無効になっています。

有効にするには、サーバーを--features=previewまたは--features=passkeysで起動します。

セットアップ
手順

条件付きUIを使用したパスキー認証を次のように設定します。

  1. (まだ存在しない場合)WebAuthnパスワードレスサポートの新しい必須アクションを登録します。WebAuthnオーセンティケーター登録の有効化で説明されている手順を使用します。Webauthn Register Passwordlessアクションを登録します。

  2. WebAuthn Passwordless Policyを構成します。Admin ConsoleのAuthenticationセクション、PoliciesWebAuthn Passwordless Policyタブで構成を実行します。ログインレスシナリオのポリシーを構成するときは、ユーザー検証要件必須に、ディスカバラブルクレデンシャルを要求はいに設定します。専用のログインレスポリシーがないため、ユーザー検証=no/ディスカバラブルクレデンシャル=noの認証シナリオとログインレスシナリオ(ユーザー検証=yes/ディスカバラブルクレデンシャル=yes)を混在させることは不可能であることに注意してください。

    ハードウェアパスキーのストレージ容量は通常非常に限られています。つまり、パスキーに多くのディスカバラブルクレデンシャルを保存することはできません。ただし、この制限は、たとえば、GoogleアカウントでバックアップされたAndroidフォンをパスキーデバイスとして使用したり、BitwardenでバックアップされたiPhoneを使用したりすると、軽減される場合があります。
  3. 認証フローを構成します。新しい認証フローを作成し、Passkeys Conditional UI Authenticatorの実行を追加し、実行の要件設定を必須に設定します。

    フローの最終的な構成は次のようになります: 条件付きUIフローフローを使用したパスキー認証

  4. 上記のフローを、上記のWebAuthnセクションで説明されているように、レルムのブラウザ認証フローとしてバインドします。

上記の認証フローでは、ユーザーがログインできるようにするために、アカウントにパスキークレデンシャルが既にある必要があります。この要件は、レルム内のすべてのユーザーがすでにパスキーを設定している必要があることを意味します。これは、たとえば、以下で説明するようにユーザー登録を有効にすることで実現できます。

パスキー条件付きUIの登録の設定
  1. レルムの登録を有効にします。

  2. レルムの認証フローで、フローregistrationを選択し、認証器パスワード検証無効に切り替えます。これは、この設定例では、新しく登録されたユーザーはパスワードを作成する必要がないことを意味します。ユーザーは常にパスワードの代わりにパスキーを使用する必要があります。

  3. AuthenticationタブのRequired actionsサブタブに戻り、Webauthn Register Passwordlessアクションを見つけて、デフォルトアクションとして設定でマークします。これは、登録後、すべての新規ユーザーに追加されることを意味します。

登録フロー設定の代替案は、必要なアクションWebAuthn Register PasswordlessをKeycloakにすでに知られているユーザーに追加することです。必要なアクションが構成されたユーザーは、(たとえばユーザー名/パスワードで)認証する必要があり、その後、ログインレス認証に使用するパスキーを登録するように求められます。

ユーザビリティを向上させ、条件付きパスキーを、デフォルトのユーザー名/パスワードフォームなどの既存の認証器およびフォームと統合できるようにする予定です。

Web Authn Level 3から、Resident KeyDiscoverable Credentialに置き換えられました。

ユーザーのブラウザがWebAuthn Conditional UIをサポートしている場合、次の画面が表示されます。

条件付き UI を使用したパスキー認証

Passkey Authentication with Conditional UI

ユーザーがSelect your passkeyテキストボックスをクリックすると、ユーザーがブラウザを実行しているデバイスに保存されているパスキーのリストが次のように表示されます。

条件付きUIオートフィルを使用したパスキー認証

Passkey Authentication with Conditional UI Autofill

ユーザーのブラウザがWebAuthn Conditional UIをサポートしていない場合、認証は次のようにLoginLess WebAuthnにフォールバックします。

LoginLess WebAuthnにフォールバックする条件付きUIを使用したパスキー認証

Passkey Authentication with Conditional UI falling back to LoginLess WebAuthn

リカバリーコード

リカバリーコードは、Keycloakによって自動生成される一連のワンタイムパスワード(現在は12個)です。コードは、認証フローにRecovery Authentication Code Form認証器を追加することにより、2要素認証(2FA)として使用できます。フローで構成されている場合、Keycloakはユーザーに生成された次のコードを順番に要求します。現在のコードがユーザーによって入力されると、それは削除され、次回のログインには次のコードが必要になります。

その性質上、リカバリーコードは通常、別の2FAメソッドのバックアップとして機能します。これらは、以前の2FAメソッドに使用されていたソフトウェアまたはハードウェアデバイスが故障または利用できなくなった場合などに、Keycloakにログインするためのバックアップ方法を提供するために、OTP FormまたはWebAuthn Authenticatorを補完できます。

RecoveryCodesはプレビューであり、完全にサポートされていません。この機能はデフォルトで無効になっています。

有効にするには、サーバーを--features=previewまたは--features=recovery-codesで起動します。

リカバリーコードの必須アクションを有効にする

Keycloakでリカバリーコードのアクションが有効になっていることを確認してください。

  1. メニューの認証をクリックします。

  2. Required Actionsタブをクリックします。

  3. リカバリー認証コードスイッチの有効オンに設定されていることを確認してください。

すべての新規ユーザーに最初のログインでリカバリーコードクレデンシャルを登録させたい場合は、デフォルトアクションスイッチをオンに切り替えます。

リカバリーコードをブラウザフローに追加する

次の手順では、デフォルトのBrowserフローでのログインの代替方法としてRecovery Authentication Code Formを追加します。

  1. レルムメニューでAuthenticationをクリックします。

  2. Browser フローをクリックします。

  3. アクションリストからDuplicateを選択して、組み込みのBrowserフローのコピーを作成します。

    たとえば、コピーの名前としてRecovery Codes Browserと入力します。

  4. 複製 をクリックします。

  5. フローRecovery Codes Browser Browser - Conditional OTPで、Add+)ボタンをクリックし、Add Executionを選択します。

  6. フィルタリングしてRecovery Authentication Code Formを見つけ、実行をAddします。

  7. 新しいステップの要件を代替に設定します。

  8. OTP Formの要件も代替に設定します。

    Recovery Codes Browserフロー

    Recovery Codes Browser flow

  9. 画面上部のアクションメニューをクリックします。

  10. ドロップダウンリストから フローをバインド を選択します。

  11. ドロップダウンリストからBrowser flowを選択して、この新しいフローをレルムのデフォルトフローとして設定します。

  12. 保存をクリックします。

この構成では、両方の2FA認証器(OTP FormRecovery Authentication Code Form)がKeycloakにログインするための代替方法となります。ユーザーが両方のクレデンシャルタイプを構成している場合、デフォルトでOTP Formが表示されますが、別のオプション別の方法を試すが利用可能になり、Recovery Authentication Codeを選択してログインできます。

2FA構成のより多くの例は、2FA条件付きワークフローの例で確認できます。

リカバリーコードクレデンシャルの作成

リカバリーコードの必須アクションが有効になり、クレデンシャルタイプがフローで管理されると、ユーザーは独自のコードを作成するように要求できます。このアクションは、Keycloakで使用できる別の必須アクションにすぎません(アカウントコンソールを使用してユーザーが直接呼び出すか、Admin Consoleを使用して管理者が割り当てます)。

必須アクションは、実行されると、コードのリストを生成し、ユーザーに提示します。このアクションは、ユーザーがコードを安全な場所に保管できるように、コードのリストを印刷、ダウンロード、またはコピーする機能を提供します。セットアップを完了するには、チェックボックスこれらのコードを安全な場所に保存しましたを事前にチェックする必要があります。

リカバリー認証コード設定ページ

Recovery Authentication Codes setup page

リカバリーコードはいつでも再作成できます。

条件付きフローの条件

実行要件で述べたように、Condition実行はConditionalサブフローにのみ含めることができます。すべてのCondition実行がtrueと評価された場合、ConditionalサブフローはRequiredとして機能します。Conditionalサブフローで次の実行を処理できます。Conditionalサブフローに含まれる一部の実行がfalseと評価された場合、サブフロー全体はDisabledと見なされます。

利用可能な条件

条件 - ユーザーロール

この実行は、ユーザーがUser roleフィールドで定義されたロールを持っているかどうかを判別する機能があります。ユーザーが必要なロールを持っている場合、実行はtrueと見なされ、他の実行が評価されます。管理者は、次のフィールドを定義する必要があります。

エイリアス

認証フローに表示される実行の名前を記述します。

ユーザーロール

ユーザーがこのフローを実行するために持つ必要のあるロール。アプリケーションロールを指定するには、構文はappname.approleです(例:myapp.myrole)。

条件 - ユーザー構成済み

これは、フロー内の他の実行がユーザーに対して構成されているかどうかを確認します。実行要件セクションには、OTPフォームの例が含まれています。

条件 - ユーザー属性

これは、ユーザーが必要な属性を設定しているかどうかを確認します。オプションで、チェックはグループ属性も評価できます。出力を否定する可能性があり、これはユーザーが属性を持つべきではないことを意味します。ユーザー属性セクションでは、カスタム属性を追加する方法を示しています。次のフィールドを指定できます。

エイリアス

認証フローに表示される実行の名前を記述します。

属性名

チェックする属性の名前。

期待される属性値

属性内の期待される値。

グループ属性を含める

オンの場合、条件は、参加しているグループのいずれかに、構成された名前と値に一致する属性が1つでもあるかどうかを確認します。このオプションはパフォーマンスに影響を与える可能性があります。

出力を否定する

出力を否定できます。言い換えれば、属性は存在すべきではありません。

条件 - サブフロー実行済み

条件は、以前のサブフローが認証プロセスで正常に実行された(または実行されなかった)かどうかを確認します。したがって、フローは以前のサブフローの終了に基づいて他のステップをトリガーできます。次の構成フィールドが存在します。

フロー名

実行されたかどうかを確認するサブフロー名。必須。

チェック結果

条件がtrueと評価される場合。構成されたサブフローが出力成功で実行された場合、executedはtrueを返し、それ以外の場合はfalseを返します。サブフローが出力成功で実行された場合、not-executedはfalseを返し、それ以外の場合はtrueを返します(前のオプションの否定)。

条件 - クライアントスコープ

構成されたクライアントスコープが、認証を要求するクライアントのクライアントスコープとして存在するかどうかを評価する条件。次の構成フィールドが存在します。

クライアントスコープ名

認証を要求しているクライアントのクライアントスコープとして存在する必要があるクライアントスコープの名前。要求されたクライアントスコープがログインを要求しているクライアントのデフォルトクライアントスコープである場合、条件はtrueと評価されます。要求されたクライアントスコープがログインを要求しているクライアントのオプションクライアントスコープである場合、クライアントスコープがログインリクエストでクライアントによって送信された場合(たとえば、OIDC/OAuth2クライアントログインの場合のscopeパラメーターによる)、条件はtrueと評価されます。必須。

出力を否定する

チェック結果にNOTを適用します。これがtrueの場合、構成されたクライアントスコープが存在しない場合にのみ、条件はtrueと評価されます。

条件付きフローでのアクセスを明示的に拒否/許可する

条件付きフローでリソースへのアクセスを許可または拒否できます。2つの認証器Deny AccessAllow Accessは、条件によってリソースへのアクセスを制御します。

Allow Access

認証器は常に認証に成功します。この認証器は設定できません。

Deny Access

アクセスは常に拒否されます。ユーザーに表示されるエラーメッセージを定義できます。以下のフィールドを指定できます。

エイリアス

認証フローに表示される実行の名前を記述します。

エラーメッセージ

ユーザーに表示されるエラーメッセージ。エラーメッセージは、特定​​のメッセージとして、またはローカライズで使用するためにプロパティとして指定できます。(例:「ロール 'admin' を持っていません。」、メッセージプロパティのmy-property-deny) プロパティaccess-deniedとして定義されたデフォルトメッセージを使用する場合は、空白のままにしてください。

ロールrole1を持っていないすべてのユーザーへのアクセスを拒否し、プロパティdeny-role1で定義されたエラーメッセージを表示する例を次に示します。この例には、Condition - User RoleDeny Accessの実行が含まれています。

ブラウザフロー

Deny access flow

Condition - ユーザーロール設定

Deny access role settings

Deny Accessの設定は非常に簡単です。任意エイリアスと必要なメッセージをこのように指定できます。

Deny access execution settings

最後に行うことは、ログインテーマのmessages_en.properties(英語の場合)でエラーメッセージを含むプロパティを定義することです。

deny-role1 = You do not have required role!

2FA条件付きワークフローの例

このセクションでは、さまざまな方法で2要素認証(2FA)を統合する条件付きワークフローの例をいくつか紹介します。例では、デフォルトのbrowserフローをコピーし、formsサブフロー内の設定を変更しています。

条件付き2FAサブフロー

デフォルトのbrowserフローは、OTPフォーム(ワンタイムパスワード)による2FAをすでに提供しているConditional OTPサブフローを使用しています。同じ考え方で、Condition - User Configuredを使用して、さまざまな2FAメソッドを統合できます。

2FAすべての代替

2FA all alternative

formsサブフローには、Condition - user configuredを持つ別の2FA条件付きサブフローが含まれています。3つの2FAステップ(OTP、Webauthn、リカバリーコード)が代替ステップとして許可されています。ユーザーが設定されている場合、ユーザーは3つのオプションのいずれかを選択できます。サブフローは条件付きであるため、2FAクレデンシャルが設定されていない場合、認証プロセスは正常に完了します。

条件付き2FAサブフローとアクセス拒否

2番目の例は、前の例の続きです。2FAサブフローの後、別のフローDeny access if no 2FAを使用して、前の2FAが実行されなかったかどうかを確認します。その場合(ユーザーが2FAクレデンシャルを設定していない場合)、アクセスは拒否されます。

2FAすべての代替とアクセス拒否

2FA all alternative and deny access

Condition - sub-flow executedは、2FAサブフローが以前に実行されなかったかどうかを検出するように設定されています。

サブフロー実行済みに対する設定

Configuration for the sub-flow executed

ステップDeny accessは、実行されていない場合に認証を拒否します。

OTPデフォルトの条件付き2FAサブフロー

最後の例は、前の例と非常によく似ています。アクセスを拒否する代わりに、ステップOTP Formが必須として設定されています。

OTPデフォルトの2FAすべての代替

2FA all alternative with OTP default

このフローでは、ユーザーが2FAメソッドを何も設定していない場合、ログインを続行するためにOTP設定が強制されます。

認証セッション

Webブラウザーでログインページが初めて開かれると、Keycloakは認証セッションと呼ばれるオブジェクトを作成し、リクエストに関するいくつかの有用な情報を保存します。同じブラウザーの別のタブから新しいログインページが開かれるたびに、Keycloakは認証サブセッションと呼ばれる新しいレコードを作成し、認証セッション内に保存します。認証リクエストは、Admin CLIなどの任意のタイプのクライアントから送信できます。その場合でも、新しい認証セッションが1つの認証サブセッションとともに作成されます。認証セッションは、ブラウザーフローを使用する以外の方法でも作成できることに注意してください。

認証セッションは通常、デフォルトで30分後に期限切れになります。正確な時間は、レルムの設定時に管理コンソールのセッションタブにあるログインタイムアウトスイッチで指定されます。

複数のブラウザータブでの認証

前のセクションで説明したように、ユーザーが単一ブラウザーの複数のタブからKeycloakサーバーへの認証を試行している状況が発生する可能性があります。ただし、ユーザーが1つのブラウザータブで認証すると、他のブラウザータブは自動的に認証を再開します。この認証は、Keycloakログインページで利用可能な小さなJavaScriptによって発生します。再開は通常、他のブラウザータブでユーザーを認証し、クライアントにリダイレクトします。これは、ユーザーが最初のブラウザータブで正常に認証したという事実により、SSOセッションが確立されているためです。prompt=loginのOIDCパラメーターを使用する場合や、現在認証されている要素よりも強力な認証要素を要求するステップアップ認証を使用する場合など、ユーザーが他のブラウザータブで自動的に認証されないまれな例外が存在します。

まれに、最初のブラウザータブでの認証後、認証セッションが既に期限切れになっているため、他のブラウザータブが認証を再開できない場合があります。この場合、特定のブラウザータブは、期限切れの認証セッションに関するエラーをプロトコル固有の方法でクライアントにリダイレクトします。詳細については、アプリの保護セクションのOIDCドキュメントの対応するセクションを参照してください。クライアントアプリケーションがそのようなエラーを受信した場合、通常は以前に説明したように既存のSSOセッションによりユーザーが自動的に認証されるため、OIDC/SAML認証リクエストをKeycloakにすぐに再送信できます。その結果、エンドユーザーはすべてのブラウザータブで自動的に認証されます。アプリの保護セクションのKeycloak JavaScriptアダプターと、Keycloakアイデンティティプロバイダーは、このエラーを自動的に処理し、そのような場合にKeycloakサーバーへの認証を再試行することをサポートしています。

アイデンティティプロバイダーの統合

アイデンティティブローカーは、サービスプロバイダーとアイデンティティプロバイダーを接続する仲介サービスです。アイデンティティブローカーは、外部アイデンティティプロバイダーとの関係を構築し、プロバイダーのアイデンティティを使用して、サービスプロバイダーが公開する内部サービスにアクセスします。

ユーザーの観点から見ると、アイデンティティブローカーは、セキュリティードメインおよびレルムのアイデンティティを管理するための中央集権的なユーザー中心の方法を提供します。アカウントをアイデンティティプロバイダーからの1つまたは複数のアイデンティティとリンクしたり、それらからのアイデンティティ情報に基づいてアカウントを作成したりできます。

アイデンティティプロバイダーは、認証に使用され、認証および承認情報をユーザーに送信するために使用される特定のプロトコルから派生します。それは次のいずれかになります。

  • Facebook、Google、Twitterなどのソーシャルプロバイダー。

  • ユーザーがサービスにアクセスする必要があるビジネスパートナー。

  • 統合したいクラウドベースのアイデンティティサービス。

通常、Keycloakはアイデンティティプロバイダーを以下のプロトコルに基づいています。

  • SAML v2.0

  • OpenID Connect v1.0

  • OAuth v2.0

ブローカリングの概要

Keycloakをアイデンティティブローカーとして使用する場合、Keycloakはユーザーに特定のレルムで認証するためのクレデンシャルの提供を強制しません。Keycloakは、認証できるアイデンティティプロバイダーのリストを表示します。

デフォルトのアイデンティティプロバイダーを設定すると、Keycloakはユーザーをデフォルトのプロバイダーにリダイレクトします。

プロトコルが異なると、異なる認証フローが必要になる場合があります。Keycloakでサポートされているすべてのアイデンティティプロバイダーは、次のフローを使用します。

アイデンティティブローカーフロー

Identity broker flow

  1. 認証されていないユーザーがクライアントアプリケーションで保護されたリソースをリクエストします。

  2. クライアントアプリケーションは、認証のためにユーザーをKeycloakにリダイレクトします。

  3. Keycloakは、レルムで設定されたアイデンティティプロバイダーのリストを含むログインページを表示します。

  4. ユーザーは、ボタンまたはリンクをクリックして、アイデンティティプロバイダーのいずれかを選択します。

  5. Keycloakは、認証を要求するターゲットアイデンティティプロバイダーに認証リクエストを発行し、ユーザーをアイデンティティプロバイダーのログインページにリダイレクトします。管理者は、管理コンソールのアイデンティティプロバイダーの接続プロパティとその他の構成オプションをすでに設定しています。

  6. ユーザーは、クレデンシャルを提供するか、アイデンティティプロバイダーで認証することに同意します。

  7. アイデンティティプロバイダーによる認証が成功すると、ユーザーは認証応答とともにKeycloakにリダイレクトバックされます。通常、応答には、Keycloakがアイデンティティプロバイダーの認証を信頼し、ユーザー情報を取得するために使用するセキュリティートークンが含まれています。

  8. Keycloakは、アイデンティティプロバイダーからの応答が有効かどうかを確認します。有効な場合、ユーザーがまだ存在しない場合は、Keycloakがユーザーをインポートして作成します。トークンにその情報が含まれていない場合、Keycloakはアイデンティティプロバイダーに追加のユーザー情報を要求する場合があります。この動作はアイデンティティフェデレーションです。ユーザーがすでに存在する場合、Keycloakはユーザーにアイデンティティプロバイダーから返されたアイデンティティを既存のアカウントにリンクするように求める場合があります。この動作はアカウントリンクです。Keycloakを使用すると、アカウントリンクを設定し、初回ログインフローで指定できます。このステップで、Keycloakはユーザーを認証し、サービスプロバイダーでリクエストされたリソースにアクセスするためのトークンを発行します。

  9. ユーザーが認証されると、Keycloakはローカル認証中に以前に発行されたトークンを送信することにより、ユーザーをサービスプロバイダーにリダイレクトします。

  10. サービスプロバイダーはKeycloakからトークンを受信し、保護されたリソースへのアクセスを許可します。

このフローのバリエーションは可能です。たとえば、クライアントアプリケーションは、リストを表示するのではなく、特定のアイデンティティプロバイダーをリクエストしたり、アイデンティティをフェデレーションする前にユーザーに追加情報の提供を強制するようにKeycloakを設定したりできます。

認証プロセスの最後に、Keycloakはクライアントアプリケーションにトークンを発行します。クライアントアプリケーションは、外部アイデンティティプロバイダーとは分離されているため、クライアントアプリケーションのプロトコルやユーザーのアイデンティティを検証する方法を確認できません。プロバイダーはKeycloakについてのみ知っている必要があります。

デフォルトアイデンティティプロバイダー

Keycloakは、ログインフォームを表示する代わりに、アイデンティティプロバイダーにリダイレクトできます。このリダイレクトを有効にするには

手順
  1. メニューの認証をクリックします。

  2. Browser フローをクリックします。

  3. アイデンティティプロバイダーリダイレクター行の歯車アイコン⚙️をクリックします。

  4. デフォルトアイデンティティプロバイダーを、ユーザーをリダイレクトするアイデンティティプロバイダーに設定します。

Keycloakが設定されたデフォルトのアイデンティティプロバイダーを見つけられない場合、ログインフォームが表示されます。

この認証器は、kc_idp_hintクエリパラメーターの処理を担当します。詳細については、クライアントが推奨するアイデンティティプロバイダーセクションを参照してください。

認証器はアイデンティティプロバイダーにリダイレクトし、認証はアイデンティティプロバイダーに委任されます。アイデンティティプロバイダーでのログインが正常に完了した後、browser認証フローは続行されません。(たとえば、2要素認証など)アイデンティティプロバイダーログイン後に追加のステップを実行する場合は、ログイン後フローを設定する必要がある場合があります。

一般的な設定

アイデンティティブローカー構成の基礎は、アイデンティティプロバイダー(IDP)です。Keycloakは、レルムごとにアイデンティティプロバイダーを作成し、デフォルトですべてのアプリケーションに対して有効にします。レルムのユーザーは、アプリケーションにサインインするときに、登録されている任意のアイデンティティプロバイダーを使用できます。

手順
  1. メニューのIdentity Providersをクリックします。

    アイデンティティプロバイダー

    Identity Providers

  2. アイデンティティプロバイダーを選択します。Keycloakは、選択したアイデンティティプロバイダーの構成ページを表示します。

    Facebookアイデンティティプロバイダーを追加

    Add Facebook Identity Provider

    IDプロバイダーを設定すると、KeycloakのログインページにオプションとしてIDプロバイダーが表示されます。ログイン画面には、IDプロバイダーごとにカスタムアイコンを配置できます。詳細については、カスタムアイコンを参照してください。

    IDPログインページ

    identity provider login page

    ソーシャル

    ソーシャルプロバイダーは、レルムでのソーシャル認証を有効にします。Keycloakを使用すると、ユーザーはソーシャルネットワークアカウントを使用してアプリケーションにログインできます。サポートされているプロバイダーには、Twitter、Facebook、Google、LinkedIn、Instagram、Microsoft、PayPal、Openshift v4、GitHub、GitLab、Bitbucket、Stack Overflowなどがあります。

    プロトコルベース

    プロトコルベースのプロバイダーは、特定のプロトコルに依存してユーザーを認証および認可します。これらのプロバイダーを使用すると、特定のプロトコルに準拠した任意のIDプロバイダーに接続できます。Keycloakは、SAML v2.0およびOpenID Connect v1.0プロトコルをサポートしています。これらのオープンスタンダードに基づいて、任意のIDプロバイダーを設定およびブローカーできます。

各タイプのIDプロバイダーにはそれぞれ設定オプションがありますが、すべてに共通の設定があります。以下の設定オプションが利用可能です。

表1. 共通設定
構成 説明

エイリアス

エイリアスは、IDプロバイダーの一意の識別子であり、内部IDプロバイダーを参照します。Keycloakは、リダイレクトURIまたはコールバックURLを必要とするOpenID ConnectプロトコルのリダイレクトURIを構築するためにエイリアスを使用します。すべてのIDプロバイダーはエイリアスを持つ必要があります。エイリアスの例としては、facebookgoogleidp.acme.comなどがあります。

有効

プロバイダーのオン/オフを切り替えます。

ログインページに非表示

オンの場合、Keycloakはこのプロバイダーをログインページのログインオプションとして表示しません。クライアントは、URLで 'kc_idp_hint' パラメーターを使用して、このプロバイダーをリクエストできます。

アカウントリンキングのみ

オンの場合、Keycloakはこのプロバイダーに既存のアカウントをリンクします。このプロバイダーはユーザーをログインさせることができず、Keycloakはこのプロバイダーをログインページのオプションとして表示しません。

トークンを保存

オンの場合、KeycloakはIDプロバイダーからのトークンを保存します。

保存されたトークンを読み取り可能

オンの場合、ユーザーは保存されたIDプロバイダートークンを取得できます。このアクションは、broker クライアントレベルロール read token にも適用されます。

メールを信頼

オンの場合、KeycloakはIDプロバイダーからのメールアドレスを信頼します。レルムがメール検証を必要とする場合、このIDプロバイダーからログインするユーザーは、メール検証プロセスを実行する必要はありません。

GUI順序

ログインページで利用可能なIDプロバイダーのソート順序。

必須クレームを検証

オンの場合、IDプロバイダーによって発行されたIDトークンには特定のクレームが含まれている必要があります。そうでない場合、ユーザーはこのブローカーを介して認証できません。

必須クレーム

必須クレームを検証オンの場合、フィルター処理するJWTトークンクレームの名前(大文字と小文字を区別)

必須クレーム値

必須クレームを検証オンの場合、一致させるJWTトークンクレームの値(正規表現形式をサポート)

初回ログインフロー

ユーザーがこのIDプロバイダーを使用してKeycloakに初めてログインするときにKeycloakがトリガーする認証フロー。

ログイン後フロー

ユーザーが外部IDプロバイダーでのログインを完了したときにKeycloakがトリガーする認証フロー。

同期モード

マッパーを介してIDプロバイダーからユーザー情報を更新する戦略。legacyを選択すると、Keycloakは現在の動作を使用します。Importはユーザーデータを更新せず、forceは可能な場合にユーザーデータを更新します。詳細については、IDプロバイダーマッパーを参照してください。

大文字と小文字を区別するユーザー名

有効にすると、ユーザーをフェデレーションするときに、IDプロバイダーからの元のユーザー名がそのまま保持されます。それ以外の場合、IDプロバイダーからのユーザー名は小文字に変換され、大文字と小文字が区別される場合は元の値と一致しない可能性があります。この設定は、サーバー内のユーザー名は常に小文字であるため、フェデレーションされたIDに関連付けられたユーザー名にのみ影響します。

ソーシャルIDプロバイダー

ソーシャルIDプロバイダーは、信頼できる尊敬されるソーシャルメディアアカウントへの認証を委任できます。Keycloakには、Google、Facebook、Twitter、GitHub、LinkedIn、Microsoft、Stack Overflowなどのソーシャルネットワークのサポートが含まれています。

Bitbucket

Bitbucketでログインするには、次の手順を実行します。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Bitbucketを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、Bitbucket CloudでのOAuthプロセスを実行します。コンシューマーを追加をクリックすると

    1. リダイレクトURIの値をコールバックURLフィールドに貼り付けます。

    2. アプリケーションがメールを読み取れるように、アカウントセクションでメール読み取りを選択していることを確認してください。

  5. コンシューマーを作成するときにBitbucketが表示するキーシークレットの値をメモします。

  6. Keycloakで、Keyの値をクライアントIDフィールドに貼り付けます。

  7. Keycloakで、Secretの値をクライアントシークレットフィールドに貼り付けます。

  8. 追加をクリックします。

Facebook

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Facebookを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、Meta for Developersを開きます。

    1. マイアプリをクリックします。

    2. アプリを作成を選択します。

      ユースケースを追加

      Add a use case

    3. その他を選択します。

      アプリタイプを選択

      Select an app type

    4. コンシューマーを選択します。

      アプリを作成

      Create an app

    5. 必須フィールドをすべて入力します。

    6. アプリを作成をクリックします。Metaによってダッシュボードに移動します。

      製品を追加

      Add Product

    7. Facebookログインボックスの設定をクリックします。

    8. ウェブを選択します。

    9. リダイレクトURIの値をサイトURLフィールドに入力し、保存をクリックします。

    10. ナビゲーションパネルで、アプリ設定 - ベーシックを選択します。

    11. アプリシークレットフィールドの表示をクリックします。

    12. アプリIDアプリシークレットをメモします。

  5. FacebookアプリのApp ID および App Secret の値を、KeycloakのクライアントIDフィールドとクライアントシークレットフィールドに入力します。

  6. 追加をクリックします。

  7. 必要なスコープをデフォルトスコープフィールドに入力します。デフォルトでは、Keycloakはemailスコープを使用します。Facebookスコープの詳細については、Graph APIを参照してください。

Keycloakは、デフォルトでgraph.facebook.com/me?fields=id,name,email,first_name,last_nameにプロファイルリクエストを送信します。レスポンスには、id、name、email、first_name、last_nameフィールドのみが含まれています。Facebookプロファイルから追加のフィールドを取得するには、対応するスコープを追加し、Additional user’s profile fields設定オプションフィールドにフィールド名を追加します。

GitHub

GitHubでログインするには、次の手順を実行します。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Githubを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、OAUTHアプリを作成します。

    1. アプリを作成するときに、リダイレクトURIの値をAuthorization callback URLフィールドに入力します。

    2. OAUTHアプリの管理ページで、Client IDClient secretをメモします。

  5. Keycloakで、Client IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Client secretの値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

GitLab

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、GitLabを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、新しいGitLabアプリケーションを追加します。

    1. クリップボードにあるリダイレクトURIリダイレクトURIとして使用します。

    2. アプリケーションを保存するときに、Application IDSecretをメモします。

  5. Keycloakで、Application IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Secretの値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

Google

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Googleを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブでGoogle Cloud Platformコンソールを開きます。

  5. GoogleアプリのGoogleダッシュボードで、左側のナビゲーションメニューで、APIとサービスにカーソルを合わせ、OAuth同意画面オプションをクリックします。同意画面を作成し、同意画面のユーザータイプが外部であることを確認します。

  6. Googleダッシュボードで

    1. 認証情報メニューをクリックします。

    2. 認証情報を作成 - OAuthクライアントIDをクリックします。

    3. アプリケーションの種類リストから、ウェブアプリケーションを選択します。

    4. クリップボードにあるリダイレクトURI承認済みのリダイレクトURIとして使用します。

    5. 作成をクリックします。

    6. クライアントIDクライアントシークレットをメモします。

  7. Keycloakで、Your Client IDの値をクライアントIDフィールドに貼り付けます。

  8. Keycloakで、Your Client secretの値をクライアントシークレットフィールドに貼り付けます。

  9. 追加をクリックします。

  10. 必要なスコープをデフォルトスコープフィールドに入力します。デフォルトでは、Keycloakは次のスコープを使用します。openid profile email。Googleスコープのリストについては、OAuth Playgroundを参照してください。

  11. GSuite組織のメンバーのみにアクセスを制限するには、ホストドメインフィールドにG Suiteドメインを入力します。

  12. 保存をクリックします。

Instagram

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Instagramを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、Meta for Developersを開きます。

    1. マイアプリをクリックします。

    2. アプリを作成を選択します。

      ユースケースを追加

      Add a use case

    3. その他を選択します。

      アプリタイプを選択

      Select an app type

    4. コンシューマーを選択します。

      アプリを作成

      Create an app

    5. 必須フィールドをすべて入力します。

    6. アプリを作成をクリックします。Metaによってダッシュボードに移動します。

    7. ナビゲーションパネルで、アプリ設定 - ベーシックを選択します。

    8. ページの下部にある+プラットフォームを追加を選択します。

    9. [ウェブサイト]をクリックします。

    10. サイトのURLを入力します。

      製品を追加

      Add Product

    11. メニューからダッシュボードを選択します。

    12. Instagram Basic Displayボックスの設定をクリックします。

    13. 新しいアプリを作成をクリックします。

      新しいInstagramアプリIDを作成

      Create a New Instagram App ID

    14. 表示名フィールドに値を入力します。

      アプリを設定

      Setup the App

    15. KeycloakからのリダイレクトURL有効なOAuthリダイレクトURIフィールドに貼り付けます。

    16. KeycloakからのリダイレクトURL認可解除コールバックURLフィールドに貼り付けます。

    17. KeycloakからのリダイレクトURLデータ削除リクエストURLフィールドに貼り付けます。

    18. Instagramアプリシークレットフィールドの表示をクリックします。

    19. InstagramアプリIDInstagramアプリシークレットをメモします。

    20. アプリレビュー - リクエストをクリックします。

    21. 画面の指示に従ってください。

  5. Keycloakで、Instagram App IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Instagram App Secretの値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

LinkedIn

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、LinkedInを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、LinkedInデベロッパーポータルでアプリを作成します

    1. アプリを作成したら、Authタブをクリックします。

    2. リダイレクトURIの値をアプリの承認済みリダイレクトURLフィールドに入力します。

    3. クライアントIDクライアントシークレットをメモします。

    4. 製品タブをクリックし、OpenID Connectを使用したLinkedInでサインイン製品のアクセスをリクエストします。

  5. Keycloakで、Client IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Client Secretの値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

Microsoft

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Microsoftを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、アプリの登録の下のMicrosoft Azureにアプリを登録します。

    1. リダイレクトURIセクションで、プラットフォームとしてWebを選択し、リダイレクトURIの値をフィールドに貼り付けます。

    2. アプリの登録でアプリケーションを見つけ、証明書とシークレットセクションで新しいクライアントシークレットを追加します。

    3. 作成したシークレットのをメモします。

    4. 概要セクションでアプリケーション(クライアント)IDをメモします。

  5. Keycloakで、Application (client) IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、シークレットのValueクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

OpenShift 4

前提条件
  1. Keycloakトラストストアに格納されているOpenShift 4インスタンスの証明書。

  2. トラストストアを使用するように構成されたKeycloakサーバー。詳細については、トラストストアの構成ガイドを参照してください。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Openshift v4を選択します。

  3. クライアントIDクライアントシークレットを入力し、ベースURLフィールドにOpenShift 4インスタンスのAPI URLを入力します。さらに、リダイレクトURIをクリップボードにコピーできます。

    IDプロバイダーを追加

    Add Identity Provider

  4. OpenShift 4コンソール(ホーム → APIエクスプローラー → OAuthクライアント → インスタンス)またはocコマンドラインツールを使用して、クライアントを登録します。

    $ oc create -f <(echo '
    kind: OAuthClient
    apiVersion: oauth.openshift.io/v1
    metadata:
     name: kc-client (1)
    secret: "..." (2)
    redirectURIs:
     - "<here you can paste the Redirect URI that you copied in the previous step>" (3)
    grantMethod: prompt (4)
    ')
1 OAuthクライアントのname<openshift_master>/oauth/authorizeおよび<openshift_master>/oauth/tokenにリクエストを行う際にclient_idリクエストパラメーターとして渡されます。nameパラメーターは、OAuthClientオブジェクトとKeycloak構成で同じである必要があります。
2 Keycloakがclient_secretリクエストパラメーターとして使用するsecret
3 <openshift_master>/oauth/authorizeおよび<openshift_master>/oauth/tokenへのリクエストで指定されたredirect_uriパラメーターは、redirectURIsのURIの1つと等しい(またはプレフィックスが付いている)必要があります。正しく構成する最も簡単な方法は、Keycloak OpenShift 4アイデンティティプロバイダー構成ページ(Redirect URIフィールド)からコピーアンドペーストすることです。
4 このクライアントがトークンをリクエストしたが、ユーザーからアクセス許可が付与されていない場合に、Keycloakがアクションを決定するために使用するgrantMethod

最後に、KeycloakインスタンスのログインページにOpenShift 4アイデンティティプロバイダーが表示されるはずです。クリックすると、OpenShift 4ログインページにリダイレクトされるはずです。

結果

Result

詳細については、公式OpenShiftドキュメントを参照してください。

PayPal

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、PayPalを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、PayPalデベロッパーアプリケーションエリアを開きます。

    1. アプリを作成をクリックして、PayPalアプリを作成します。

    2. クライアントIDクライアントシークレットをメモします。表示リンクをクリックしてシークレットを表示します。

    3. PayPalでログインがチェックされていることを確認します。

    4. PayPalでログインの下にある高度な設定をクリックします。

    5. リターンURLフィールドの値をKeycloakのリダイレクトURIの値に設定します。URLにlocalhostを含めることはできません。Keycloakをローカルで使用する場合は、リターンURLlocalhost127.0.0.1に置き換え、ブラウザーでlocalhostの代わりに127.0.0.1を使用してKeycloakにアクセスします。

    6. フルネームフィールドとメールフィールドがチェックされていることを確認します。

    7. 保存、次に変更を保存をクリックします。

  5. Keycloakで、Client IDの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Secret key 1の値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

Stack Overflow

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Stack Overflowを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. 別のブラウザータブで、Stack Appsでアプリケーションを登録するためにログインします。

    アプリケーションを登録

    Register Application

    1. アプリケーション名フィールドにアプリケーション名を入力します。

    2. OAuthドメインフィールドにOAuthドメインを入力します。

    3. アプリケーションを登録をクリックします。

      設定

      Settings

  4. クライアントIDクライアントシークレット、およびキーをメモします。

  5. Keycloakで、Client Idの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、Client Secretの値をクライアントシークレットフィールドに貼り付けます。

  7. Keycloakで、Keyの値をキーフィールドに貼り付けます。

  8. 追加をクリックします。

Twitter

前提条件
  1. Twitterデベロッパーアカウント。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、Twitterを選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. リダイレクトURIの値をクリップボードにコピーします。

  4. 別のブラウザータブで、Twitterアプリケーション管理でアプリを作成します。

    1. アプリ名を入力し、次へをクリックします。

    2. APIキーAPIキーシークレットの値をメモし、アプリ設定をクリックします。

    3. ユーザー認証設定セクションで、設定ボタンをクリックします。

    4. アプリのタイプとしてWebアプリを選択します。

    5. コールバックURI / リダイレクトURLフィールドにリダイレクトURLの値を貼り付けます。

    6. ウェブサイトURLの値は、localhostを除く任意の有効なURLにすることができます。

    7. 保存、次に完了をクリックします。

  5. Keycloakで、API Keyの値をクライアントIDフィールドに貼り付けます。

  6. Keycloakで、API Key Secretの値をクライアントシークレットフィールドに貼り付けます。

  7. 追加をクリックします。

OpenID Connect v1.0アイデンティティプロバイダー

Keycloakは、OpenID Connectプロトコルに基づいてアイデンティティプロバイダーを仲介します。これらのアイデンティティプロバイダー(IDP)は、ユーザーを認証し、アクセスを承認するために、仕様で定義されているAuthorization Code Flowをサポートする必要があります。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーを追加リストから、OpenID Connect v1.0を選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. 初期構成オプションを入力します。構成オプションの詳細については、一般的なIDP構成を参照してください。

    表2. OpenID Connect構成
    構成 説明

    認証URL

    OIDCプロトコルに必要な認証URLエンドポイント。

    トークンURL

    OIDCプロトコルに必要なトークンURLエンドポイント。

    ログアウトURL

    OIDCプロトコルのログアウトURLエンドポイント。この値はオプションです。

    バックチャネルログアウト

    ユーザーをログアウトするためのIDPへのバックグラウンド、アウトオブバンド、RESTリクエスト。一部のIDPは、ブラウザークッキーを使用してセッションを識別する可能性があるため、ブラウザーリダイレクトのみを介してログアウトを実行します。

    ユーザー情報URL

    OIDCプロトコルが定義するエンドポイント。このエンドポイントは、ユーザープロファイル情報を指します。

    クライアント認証

    KeycloakがAuthorization Code Flowで使用するクライアント認証方法を定義します。プライベートキーで署名されたJWTの場合、Keycloakはレルムプライベートキーを使用します。その他の場合、クライアントシークレットを定義します。詳細については、クライアント認証仕様を参照してください。

    クライアントID

    外部IDPに対してOIDCクライアントとして機能するレルム。外部IDPと対話するためにAuthorization Code Flowを使用する場合、レルムにはOIDCクライアントIDが必要です。

    クライアントシークレット

    外部Vaultからのクライアントシークレット。このシークレットは、Authorization Code Flowを使用している場合に必要です。

    クライアントアサーション署名アルゴリズム

    クライアント認証としてJWTアサーションを作成するための署名アルゴリズム。プライベートキーで署名されたJWTまたはjwtとしてのクライアントシークレットの場合に必要です。アルゴリズムが指定されていない場合、次のアルゴリズムが適用されます。RS256は、プライベートキーで署名されたJWTの場合に適用されます。HS256は、jwtとしてのクライアントシークレットの場合に適用されます。

    クライアントアサーションオーディエンス

    クライアントアサーションに使用するオーディエンス。デフォルト値は、IDPのトークンエンドポイントURLです。

    発行者

    Keycloakは、IDPからの応答で、この値に対して発行者クレームを検証します。

    デフォルトスコープ

    Keycloakが認証リクエストとともに送信するOIDCスコープのリスト。デフォルト値はopenidです。各スコープはスペースで区切ります。

    プロンプト

    OIDC仕様のプロンプトパラメーター。このパラメーターを介して、再認証やその他のオプションを強制できます。詳細については、仕様を参照してください。

    クライアントからのprompt=noneフォワードを受け入れる

    IDPがprompt=noneクエリパラメーターを含む転送された認証リクエストを受け入れるかどうかを指定します。レルムがprompt=noneの認証リクエストを受信した場合、レルムはユーザーが現在認証されているかどうかを確認し、ユーザーがログインしていない場合はlogin_requiredエラーを返します。Keycloakが認証リクエストのデフォルトIDPを決定する(kc_idp_hintクエリパラメーターを使用するか、レルムのデフォルトIDPを持っている)場合、prompt=noneの認証リクエストをデフォルトIDPに転送できます。デフォルトIDPは、そこでユーザーの認証を確認します。すべてのIDPがprompt=noneのリクエストをサポートしているわけではないため、Keycloakはこのスイッチを使用して、認証リクエストをリダイレクトする前に、デフォルトIDPがパラメーターをサポートしていることを示します。

    ID プロバイダー (IDP) でユーザーが認証されていない場合でも、クライアントは login_required エラーを受け取ります。ユーザーが IDP で認証済みの場合でも、Keycloak がユーザーのインタラクションを必要とする認証ページを表示する必要がある場合は、クライアントは interaction_required エラーを受け取る可能性があります。この認証には、必須アクション (パスワードの変更など)、同意画面、および first broker login フローまたは post broker login フローによって表示されるように設定された画面が含まれます。

    署名の検証

    Keycloak がこの IDP によって署名された外部 ID トークンの署名を検証するかどうかを指定します。ON の場合、Keycloak は外部 OIDC IDP の公開鍵を知っている必要があります。パフォーマンス上の理由から、Keycloak は外部 OIDC アイデンティティプロバイダーの公開鍵をキャッシュします。

    JWKS URL を使用

    このスイッチは、署名の検証ON の場合に適用されます。JWKS URL を使用ON の場合、Keycloak は JWKS URL から IDP の公開鍵をダウンロードします。新しい鍵ペアがアイデンティティプロバイダーによって生成されると、新しい鍵がダウンロードされます。OFF の場合、Keycloak はデータベースから公開鍵 (または証明書) を使用するため、IDP 鍵ペアが変更された場合は、新しい鍵を Keycloak データベースにもインポートしてください。

    JWKS URL

    IDP JWK 鍵の場所を指す URL。詳細については、JWK 仕様 を参照してください。外部 Keycloak を IDP として使用する場合は、ブローカー Keycloak が http://broker-keycloak:8180 で実行されており、レルムが test の場合、http://broker-keycloak:8180/realms/test/protocol/openid-connect/certs のような URL を使用できます。

    公開鍵の検証

    Keycloak が外部 IDP 署名を検証するために使用する PEM 形式の公開鍵。この鍵は、JWKS URL を使用OFF の場合に適用されます。

    公開鍵 ID の検証

    この設定は、JWKS URL を使用OFF の場合に適用されます。この設定は、PEM 形式の公開鍵の ID を指定します。鍵 ID を鍵から計算する標準的な方法がないため、外部アイデンティティプロバイダーは Keycloak が使用するアルゴリズムとは異なるアルゴリズムを使用する場合があります。このフィールドの値が指定されていない場合、Keycloak は外部 IDP から送信された鍵 ID に関係なく、すべてのリクエストに検証用公開鍵を使用します。ON の場合、このフィールドの値は、プロバイダーからの署名を検証するために Keycloak が使用する鍵 ID であり、IDP によって指定された鍵 ID と一致する必要があります。

OpenID プロバイダーメタデータを指す URL またはファイルを提供することで、この構成データをすべてインポートできます。Keycloak 外部 IDP に接続する場合は、<root>/realms/{realm-name}/.well-known/openid-configuration から IDP 設定をインポートできます。このリンクは、IDP に関するメタデータを記述した JSON ドキュメントです。

プロバイダーで Json Web Encryption (JWE) ID トークンまたは UserInfo レスポンスを使用する場合は、IDP は Keycloak で使用する公開鍵を知っている必要があります。プロバイダーは、トークンを復号化するために、さまざまな暗号化アルゴリズム用に定義された レルム鍵 を使用します。Keycloak は、IDP が鍵を自動的にダウンロードするために使用できる標準の JWKS エンドポイント を提供します。

SAML v2.0 アイデンティティプロバイダー

Keycloak は、SAML v2.0 プロトコルに基づいてアイデンティティプロバイダーを仲介できます。

手順
  1. メニューのIdentity Providersをクリックします。

  2. プロバイダーの追加 リストから SAML v2.0 を選択します。

    IDプロバイダーを追加

    Add Identity Provider

  3. 初期構成オプションを入力します。構成オプションの詳細については、一般的なIDP構成を参照してください。

表 3. SAML 構成
構成 説明

サービスプロバイダーエンティティ ID

リモートアイデンティティプロバイダーがこのサービスプロバイダーからのリクエストを識別するために使用する SAML エンティティ ID。デフォルトでは、この設定はレルムベース URL <root>/realms/{realm-name} に設定されています。

アイデンティティプロバイダーエンティティ ID

受信した SAML アサーションの発行者を検証するために使用されるエンティティ ID。空の場合、発行者の検証は実行されません。

シングルサインオンサービス URL

認証プロセスを開始する SAML エンドポイント。SAML IDP が IDP エンティティ記述子を公開している場合、このフィールドの値はそこに指定されています。

アーティファクトサービス URL

SAML アーティファクト解決エンドポイント。SAML IDP が IDP エンティティ記述子を公開している場合、このフィールドの値はそこに指定されています。

シングルログアウトサービス URL

SAML ログアウトエンドポイント。SAML IDP が IDP エンティティ記述子を公開している場合、このフィールドの値はそこに指定されています。

バックチャネルログアウト

SAML IDP がバックチャネルログアウトをサポートしている場合は、このスイッチを ON に切り替えます。

NameID ポリシー形式

名前識別子形式に対応する URI 参照。デフォルトでは、Keycloak は urn:oasis:names:tc:SAML:2.0:nameid-format:persistent に設定します。

プリンシパルタイプ

外部ユーザーID を識別および追跡するために SAML アサーションのどの部分を使用するかを指定します。サブジェクト NameID または SAML 属性 (名前またはフレンドリー名のいずれか) を指定できます。サブジェクト NameID 値は、'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' NameID ポリシー形式の値と一緒に設定することはできません。

プリンシパル属性

プリンシパルタイプが空白でない場合、このフィールドは識別属性の名前 ("属性 [名前]") またはフレンドリー名 ("属性 [フレンドリー名]") を指定します。

作成を許可

外部アイデンティティプロバイダーがプリンシパルを表す新しい識別子を作成できるようにします。

HTTP-POST バインディングレスポンス

外部 IDP によって送信された SAML リクエストへのレスポンスで SAML バインディングを制御します。OFF の場合、Keycloak はリダイレクトバインディングを使用します。

ARTIFACT バインディングレスポンス

外部 IDP によって送信された SAML リクエストへのレスポンスで SAML バインディングを制御します。OFF の場合、Keycloak は HTTP-POST バインディングレスポンス構成を評価します。

AuthnRequest の HTTP-POST バインディング

外部 IDP からの認証をリクエストする際の SAML バインディングを制御します。OFF の場合、Keycloak はリダイレクトバインディングを使用します。

AuthnRequest の署名を要求

ON の場合、Keycloak はレルムの鍵ペアを使用して、外部 SAML IDP に送信されるリクエストに署名します。

アサーションの署名を要求

このサービスプロバイダーが署名付きアサーションを期待するかどうかを示します。

アサーションの暗号化を要求

このサービスプロバイダーが暗号化されたアサーションを期待するかどうかを示します。

署名アルゴリズム

AuthnRequest の署名を要求ON の場合、使用する署名アルゴリズム。SHA1 ベースのアルゴリズムは非推奨であり、将来のリリースで削除される可能性があることに注意してください。*_SHA1 の代わりに、より安全なアルゴリズムを使用することをお勧めします。また、*_SHA1 アルゴリズムでは、SAML アイデンティティプロバイダー (たとえば、Keycloak の別のインスタンス) が Java 17 以降で実行されている場合、署名の検証は機能しません。

暗号化アルゴリズム

SAML ドキュメント、アサーション、または ID の暗号化に SAML IDP が使用する暗号化アルゴリズム。SAML ドキュメント部分を復号化するための対応する復号化鍵は、この構成されたアルゴリズムに基づいて選択され、暗号化 (ENC) 使用のためにレルム鍵で利用可能である必要があります。アルゴリズムが構成されていない場合、サポートされているアルゴリズムはすべて許可され、復号化鍵は SAML ドキュメント自体で指定されたアルゴリズムに基づいて選択されます。

SAML 署名鍵名

POST バインディングを使用して送信された署名付き SAML ドキュメントには、KeyName 要素に署名鍵の識別が含まれており、デフォルトでは Keycloak 鍵 ID が含まれています。外部 SAML IDP は、別の鍵名を期待する場合があります。このスイッチは、KeyName に以下を含めるかどうかを制御します。* KEY_ID - 鍵 ID。* CERT_SUBJECT - レルム鍵に対応する証明書からのサブジェクト。Microsoft Active Directory フェデレーションサービスは CERT_SUBJECT を期待します。* NONE - Keycloak は SAML メッセージから鍵名ヒントを省略します。

強制認証

ユーザーがすでにログインしている場合でも、ユーザーは外部 IDP で資格情報を入力する必要があります。

署名の検証

ON の場合、レルムは外部 IDP からの SAML リクエストとレスポンスがデジタル署名されることを期待します。

メタデータ記述子 URL

アイデンティティプロバイダーが IDPSSODescriptor メタデータを公開する外部 URL。この URL は、鍵の再読み込み または 鍵のインポート アクションがクリックされたときにアイデンティティプロバイダー証明書をダウンロードするために使用されます。

メタデータ記述子 URL を使用

ON の場合、署名を検証するための証明書は メタデータ記述子 URL から自動的にダウンロードされ、Keycloak にキャッシュされます。SAML プロバイダーは、2 つの異なる方法で署名を検証できます。特定の証明書が要求され (通常は POST バインディング)、キャッシュにない場合、証明書は URL から自動的に更新されます。すべての証明書が署名を検証するために要求された場合 (REDIRECT バインディング)、更新は最大キャッシュ時間後にのみ実行されます (public-key-storage spi をすべてのプロバイダー構成ガイドで参照して、キャッシュの仕組みの詳細を確認してください)。キャッシュは、アイデンティティプロバイダーページの 鍵の再読み込み アクションを使用して手動で更新することもできます。

オプションが OFF の場合、X.509 証明書の検証 の証明書が署名の検証に使用されます。

X.509 証明書の検証

メタデータ記述子 URL を使用OFF の場合、Keycloak が外部 IDP からの SAML リクエストとレスポンスの署名を検証するために使用する公開証明書。複数の証明書をカンマ (,) で区切って入力できます。証明書は、アイデンティティプロバイダーページの 鍵のインポート アクションをクリックして、メタデータ記述子 URL から再インポートできます。アクションは、メタデータエンドポイントの現在の証明書をダウンロードし、この同じオプションの構成に割り当てます。再インポートされた証明書を確実に保存するには、保存 をクリックする必要があります。

サービスプロバイダーメタデータに署名

ON の場合、Keycloak はレルムの鍵ペアを使用して、SAML サービスプロバイダーメタデータ記述子 に署名します。

サブジェクトを渡す

Keycloak が login_hint クエリパラメーターを IDP に転送するかどうかを制御します。Keycloak は、AuthnRequest の Subject の login_hint パラメーターにこのフィールドの値を追加するため、宛先プロバイダーはログインフォームを事前に入力できます。

属性コンシューミングサービスインデックス

リモート IDP にリクエストする属性セットを識別します。Keycloak は、アイデンティティプロバイダー構成でマッピングされた属性を、自動生成された SP メタデータドキュメントに自動的に追加します。

属性コンシューミングサービス名

自動生成された SP メタデータドキュメントでアドバタイズされる属性セットの説明的な名前。

外部 IDP の SAML IDP エンティティ記述子を指す URL またはファイルを提供することで、すべての構成データをインポートできます。Keycloak 外部 IDP に接続している場合は、URL <root>/realms/{realm-name}/protocol/saml/descriptor から IDP 設定をインポートできます。このリンクは、IDP に関するメタデータを記述した XML ドキュメントです。外部 SAML IDP のエンティティ記述子を指す URL または XML ファイルを提供することで、この構成データをすべてインポートすることもできます。

特定の AuthnContexts のリクエスト

アイデンティティプロバイダーは、ユーザーのアイデンティティを検証する認証方法に関する制約をクライアントが指定できるようにします。たとえば、MFA、Kerberos 認証、またはセキュリティ要件を要求するなどです。これらの制約は、特定の AuthnContext 基準を使用します。クライアントは 1 つ以上の基準を要求し、アイデンティティプロバイダーがリクエストされた AuthnContext を正確に、または他の同等のものを満たすことによって一致させる方法を指定できます。

サービスプロバイダーに必要な基準をリストするには、[リクエストされた AuthnContext 制約] セクションに ClassRefs または DeclRefs を追加します。通常、ClassRefs または DeclRefs のいずれかを提供する必要があります。サポートされている値については、アイデンティティプロバイダーのドキュメントを確認してください。ClassRefs または DeclRefs が存在しない場合、アイデンティティプロバイダーは追加の制約を強制しません。

表 4. リクエストされた AuthnContext 制約
構成 説明

比較

アイデンティティプロバイダーがコンテキスト要件を評価するために使用する方法。使用可能な値は、ExactMinimumMaximum、または Better です。デフォルト値は Exact です。

AuthnContext ClassRefs

必要な基準を記述する AuthnContext ClassRefs。

AuthnContext DeclRefs

必要な基準を記述する AuthnContext DeclRefs。

SP 記述子

プロバイダーの SAML SP メタデータにアクセスするときは、アイデンティティプロバイダー構成設定の [エンドポイント] 項目を探してください。これには、サービスプロバイダーの SAML エンティティ記述子を生成する SAML 2.0 サービスプロバイダーメタデータ リンクが含まれています。記述子をダウンロードするか、その URL をコピーして、リモートアイデンティティプロバイダーにインポートできます。

このメタデータは、次の URL にアクセスすることによっても公開で利用できます。

http[s]://{host:port}/realms/{realm-name}/broker/{broker-alias}/endpoint/descriptor

記述子にアクセスする前に、構成の変更を保存してください。

SAML リクエストでサブジェクトを送信

デフォルトでは、SAML アイデンティティプロバイダーを指すソーシャルボタンは、ユーザーを次のログイン URL にリダイレクトします。

http[s]://{host:port}/realms/${realm-name}/broker/{broker-alias}/login

login_hint という名前のクエリパラメーターをこの URL に追加すると、パラメーターの値が Subject 属性として SAML リクエストに追加されます。このクエリパラメーターが空の場合、Keycloak はリクエストにサブジェクトを追加しません。

"サブジェクトを渡す" オプションを有効にして、SAML リクエストでサブジェクトを送信します。

クライアント推奨のアイデンティティプロバイダー

OIDCアプリケーションは、使用したいアイデンティティプロバイダーをヒントすることで、Keycloakのログインページをバイパスできます。これは、Authorization Code Flowの認可エンドポイントでkc_idp_hintクエリパラメータを設定することで有効にできます。

Keycloak OIDCクライアントアダプターを使用すると、アプリケーション内の保護されたリソースにアクセスする際に、このクエリパラメータを指定できます。

例:

GET /myapplication.com?kc_idp_hint=facebook HTTP/1.1
Host: localhost:8080

この場合、レルムにはfacebookエイリアスを持つアイデンティティプロバイダーが必要です。このプロバイダーが存在しない場合、ログインフォームが表示されます。

JavaScriptアダプターを使用している場合は、次の方法で同じ動作を実現することもできます。

const keycloak = new Keycloak({
        url: "http://keycloak-server",
        realm: "my-realm",
        clientId: "my-app"
);

await keycloak.createLoginUrl({
        idpHint: 'facebook'
});

kc_idp_hintクエリパラメータを使用すると、クライアントは、Identity Provider Redirector認証器に対してデフォルトのアイデンティティプロバイダーを設定している場合、それをオーバーライドできます。クライアントは、kc_idp_hintクエリパラメータを空の値に設定することで、自動リダイレクトを無効にできます。

クレームとアサーションのマッピング

外部IDPとの認証に使用されるSAMLおよびOpenID Connectのメタデータを、レルムにインポートできます。インポート後、ユーザープロファイルのメタデータやその他の情報を抽出して、アプリケーションで利用できるようにすることができます。

外部アイデンティティプロバイダーを使用してレルムにログインする各ユーザーは、SAMLまたはOIDCアサーションおよびクレームからのメタデータに基づいて、ローカルのKeycloakデータベースにエントリを持ちます。

手順
  1. メニューのIdentity Providersをクリックします。

  2. リストからアイデンティティプロバイダーの1つを選択します。

  3. マッパータブをクリックします。

    アイデンティティプロバイダーマッパー

    identity provider mappers

  4. マッパーを追加をクリックします。

    アイデンティティプロバイダーマッパー

    identity provider mapper

  5. 同期モードのオーバーライドの値を選択します。マッパーは、ユーザーがこの設定に従って繰り返しログインするときにユーザー情報を更新します。

    1. 以前のKeycloakバージョンの動作を使用するには、legacyを選択します。

    2. 特定のアイデンティティプロバイダーを使用した最初のKeycloakへのログイン中にユーザーが最初に作成された時点からデータをインポートするには、importを選択します。

    3. ユーザーがログインするたびにユーザーデータを更新するには、forceを選択します。

    4. アイデンティティプロバイダーで設定された同期モードを使用するには、inheritを選択します。他のすべてのオプションは、この同期モードをオーバーライドします。

  6. マッパータイプリストからマッパーを選択します。マッパータイプにカーソルを合わせると、マッパーの説明とマッパーに入力する設定が表示されます。

  7. 保存をクリックします。

JSONベースのクレームの場合、ネストにはドット表記を使用でき、インデックスで配列フィールドにアクセスするには角括弧を使用できます。例:contact.address[0].country

ソーシャルプロバイダーから提供されるユーザープロファイルJSONデータの構造を調査するには、サーバー起動時にDEBUGレベルロガーorg.keycloak.social.user_profile_dumpを有効にできます。

利用可能なユーザーセッションデータ

外部IDPからのユーザーログイン後、Keycloakはアクセス可能なユーザーセッションノートデータを保存します。このデータは、適切なクライアントマッパーを使用してクライアントに渡されるトークンまたはSAMLアサーションを使用して、ログインを要求するクライアントに伝播できます。

identity_provider

ログインを実行するために使用されたブローカーのIDPエイリアス。

identity_provider_identity

現在認証されているユーザーのIDPユーザー名。多くの場合、Keycloakのユーザー名と同じですが、常にそうとは限りません。たとえば、Keycloakはユーザー`john`をFacebookユーザーjohn123@gmail.comにリンクできます。その場合、ユーザーセッションノートの値はjohn123@gmail.comになります。

ユーザーセッションノートタイプのプロトコルマッパーを使用して、この情報をクライアントに伝播できます。

初回ログインフロー

ユーザーがアイデンティティブローカリングを通じてログインすると、Keycloakはレルムのローカルデータベース内でユーザーの側面をインポートしてリンクします。Keycloakが外部アイデンティティプロバイダーを介してユーザーを正常に認証すると、2つの状況が存在する可能性があります。

  • Keycloakは、認証されたアイデンティティプロバイダーアカウントですでにユーザーアカウントをインポートおよびリンクしています。この場合、Keycloakは既存のユーザーとして認証し、アプリケーションにリダイレクトバックします。

  • このユーザーのアカウントがKeycloakに存在しません。通常、新しいアカウントを登録してKeycloakデータベースにインポートしますが、同じメールアドレスを持つ既存のKeycloakアカウントが存在する可能性があります。既存のローカルアカウントを外部アイデンティティプロバイダーに自動的にリンクすることは、潜在的なセキュリティホールです。外部アイデンティティプロバイダーから取得する情報を常に信頼できるとは限りません。

一部の状況に対処する場合、組織によって異なる要件があります。Keycloakを使用すると、IDP設定の初回ログインフローオプションを使用して、外部IDPから初めてログインするユーザーのワークフローを選択できます。デフォルトでは、初回ログインフローオプションはfirst broker loginフローを指していますが、アイデンティティプロバイダーごとに異なるフローまたは別のフローを使用できます。

フローは、管理コンソールの認証タブにあります。First Broker Loginフローを選択すると、デフォルトで使用される認証器が表示されます。既存のフローを再構成できます。たとえば、一部の認証器を無効にしたり、一部を必須としてマークしたり、一部の認証器を設定したりできます。

新しい認証フローを作成したり、独自のAuthenticator実装を作成して、フローで使用したりすることもできます。詳細については、Server Developer Guideを参照してください。

デフォルトの初回ログインフロー認証器

プロファイルの確認
  • この認証器は、プロファイル情報ページを表示するため、ユーザーはKeycloakがアイデンティティプロバイダーから取得したプロファイルを確認できます。

  • アクションメニューで初回ログイン時にプロファイルを更新オプションを設定できます。

  • ONの場合、ユーザーのアイデンティティをフェデレーションするために追加情報を要求するプロファイルページが表示されます。

  • missingの場合、アイデンティティプロバイダーがメール、名、姓などの必須情報を提供しない場合、プロファイルページが表示されます。

  • OFFの場合、Confirm Link Existing Account認証器によって表示されるページで、ユーザーが後でプロファイル情報を確認リンクをクリックしない限り、プロファイルページは表示されません。

ユニークな場合はユーザーを作成

この認証器は、アイデンティティプロバイダーのアカウントと同じメールまたはユーザー名を持つ既存のKeycloakアカウントがすでに存在するかどうかを確認します。存在しない場合、認証器は新しいローカルKeycloakアカウントを作成し、それをアイデンティティプロバイダーにリンクすると、フロー全体が完了します。それ以外の場合は、次の既存のアカウントを処理サブフローに進みます。重複するアカウントがないことを常に保証したい場合は、この認証器を必須としてマークできます。この場合、既存のKeycloakアカウントが存在するとユーザーにエラーページが表示され、ユーザーはアカウント管理を通じてアイデンティティプロバイダーアカウントをリンクする必要があります。

  • この認証器は、アイデンティティプロバイダーのアカウントと同じメールまたはユーザー名を持つKeycloakアカウントがすでに存在することを確認します。

  • アカウントが存在しない場合、認証器はローカルKeycloakアカウントを作成し、このアカウントをアイデンティティプロバイダーにリンクして、フローを終了します。

  • アカウントが存在する場合、認証器は次の既存のアカウントを処理サブフローを実装します。

  • 重複するアカウントがないことを保証するには、この認証器を必須としてマークできます。Keycloakアカウントが存在する場合、ユーザーにエラーページが表示され、ユーザーはアカウント管理を通じてアイデンティティプロバイダーアカウントをリンクする必要があります。

既存のアカウントのリンクを確認
  • 情報ページで、ユーザーは同じメールアドレスを持つKeycloakアカウントを確認できます。ユーザーはプロファイルを再度確認し、別のメールアドレスまたはユーザー名を使用できます。フローが再起動し、プロファイルの確認認証器に戻ります。

  • または、ユーザーはアイデンティティプロバイダーアカウントを既存のKeycloakアカウントにリンクすることを確認できます。

  • この確認ページをユーザーに表示せず、メール検証または再認証によってアイデンティティプロバイダーアカウントへのリンクを直接進めたい場合は、この認証器を無効にします。

メールによる既存のアカウントの検証
  • この認証器は、デフォルトで代替です。レルムにSMTP設定が構成されている場合、Keycloakはこの認証器を使用します。

  • 認証器は、アイデンティティプロバイダーをKeycloakアカウントにリンクすることを確認するために、ユーザーにメールを送信します。

  • メールによるリンクの確認を不要にし、パスワードによる再認証をユーザーに求める場合は、この認証器を無効にします。

再認証による既存のアカウントの検証
  • メール認証器が利用できない場合は、この認証器を使用します。たとえば、レルムにSMTPを設定していない場合などです。この認証器は、ユーザーがKeycloakアカウントをアイデンティティプロバイダーにリンクするために認証するためのログイン画面を表示します。

  • ユーザーは、Keycloakアカウントにすでにリンクされている別のアイデンティティプロバイダーを使用して再認証することもできます。

  • ユーザーにOTPの使用を強制できます。それ以外の場合はオプションであり、ユーザーアカウントにOTPを設定している場合に使用されます。

AutoLink認証器は、ユーザーが任意のユーザー名またはメールアドレスを使用して自身を登録できる一般的な環境では危険です。ユーザー登録を慎重に管理し、ユーザー名とメールアドレスを割り当てている場合を除き、この認証器を使用しないでください。

プロンプトなしでユーザーを自動的にリンクする初回ログインフローを構成するには、次の2つの認証器を使用して新しいフローを作成します。

ユニークな場合はユーザーを作成

この認証器は、Keycloakが一意のユーザーを処理することを保証します。認証器の要件を代替に設定します。

既存のユーザーを自動的に設定

この認証器は、検証なしで既存のユーザーを認証コンテキストに設定します。認証器の要件を「代替」に設定します。

この設定は利用可能な最も単純な設定ですが、他の認証器を使用することも可能です。例:

  • エンドユーザーにプロファイル情報を確認させたい場合は、フローの先頭にプロファイルの確認認証器を追加できます。

  • 認証メカニズムをこのフローに追加して、ユーザーに資格情報を検証させることができます。認証メカニズムを追加するには、複雑なフローが必要です。たとえば、「代替」サブフローで「既存のユーザーを自動的に設定」と「パスワードフォーム」を「必須」として設定できます。

自動ユーザー作成の無効化

デフォルトの初回ログインフローは、外部アイデンティティに一致するKeycloakアカウントを検索し、それらをリンクすることを提案します。一致するKeycloakアカウントが存在しない場合、フローは自動的にアカウントを作成します。

このデフォルトの動作は、一部のセットアップには不適切な場合があります。1つの例は、すべてのユーザーが事前に作成されている読み取り専用LDAPユーザー ストアを使用する場合です。この場合、自動ユーザー作成をオフにする必要があります。

ユーザー作成を無効にするには

手順
  1. メニューの認証をクリックします。

  2. リストから初回ブローカーログインを選択します。

  3. ユニークな場合はユーザーを作成DISABLEDに設定します。

  4. 既存のアカウントのリンクを確認DISABLEDに設定します。

この構成は、Keycloak自体が外部アイデンティティに対応する内部アカウントを判別できないことも意味します。したがって、再認証による既存のアカウントの検証認証器は、ユーザーにユーザー名とパスワードの両方を要求します。

アイデンティティプロバイダーによるユーザー作成の有効化または無効化は、レルムのユーザー登録スイッチとは完全に独立しています。アイデンティティプロバイダーによるユーザー作成を有効にし、同時にレルムログイン設定でユーザーの自己登録を無効にしたり、その逆も可能です。

既存ユーザー検出初回ログインフロー

次の初回ログインフローを構成するには

  • このレルムにすでに登録されているユーザーのみがログインでき、

  • ユーザーはプロンプトなしで自動的にリンクされ、

次の2つの認証器を使用して新しいフローを作成します。

既存のブローカーユーザーを検出

この認証器は、一意のユーザーが処理されることを保証します。認証器の要件を必須に設定します。

既存のユーザーを自動的に設定

検証なしで既存のユーザーを認証コンテキストに自動的に設定します。認証器の要件を必須に設定します。

アイデンティティプロバイダー構成の初回ログインフローをそのフローに設定する必要があります。ユーザープロファイル(姓、名など)をアイデンティティプロバイダー属性で更新する場合は、同期モードforceに設定することもできます。

このフローは、アイデンティティを他のアイデンティティプロバイダー(GitHub、Facebookなど)に委任したいが、ログインできるユーザーを管理したい場合に使用できます。

この構成では、Keycloakは外部アイデンティティに対応する内部アカウントを判別できません。再認証による既存のアカウントの検証認証器は、プロバイダーにユーザー名とパスワードを要求します。

別のKeycloakアカウントを同じアイデンティティプロバイダー内の同じKeycloakアカウントにリンクする必要がある場合は、次の認証器を構成できます。

既存のリンクのオーバーライドを確認

この認証器は、ユーザーの既存のブローカーリンクを検出し、既存のブローカーリンクをオーバーライドすることを確認するための確認ページを表示します。認証器の要件をREQUIREDに設定します。

この認証機構の典型的な使用例は、次のようなシナリオです。

  • 例えば、メールアドレス john@gmail.com を持つ Keycloak ユーザー john を考えてみましょう。このユーザーは、アイデンティティプロバイダー google に、google のユーザー名 john@gmail.com でリンクされています。

  • 例えば、Keycloak ユーザー john がメールアドレス john-new@gmail.com で新しい Google アカウントを作成するとします。

  • その後、Keycloak へのログイン中に、ユーザーは john-new@gmail.com のような新しいユーザー名でアイデンティティプロバイダー google に対して認証されます。これはまだどの Keycloak アカウントにもリンクされていないため(Keycloak アカウント john はまだ google ユーザー john@gmail.com にリンクされているため)、最初のブローカーログインフローがトリガーされます。

  • 最初のブローカーログイン中に、Keycloak ユーザー john は何らかの方法で認証されます(デフォルトの最初のブローカーログイン再認証、または例えば Detect existing broker user のような認証機構による認証など)。

  • 認証フローでこの認証機構を使用すると、ユーザー john が確認した後、Keycloak ユーザー johngoogle アイデンティティプロバイダーへの IDP リンクを、新しい google ユーザー john-new@gmail.com への google リンクで上書きすることが可能です。

この認証機構で認証フローを作成する際には、他の認証機構(再認証または前述の Detect existing broker user の後など)によって Keycloak ユーザーが既に確立されている場合に、この認証機構を追加するようにしてください。

ログイン後のフロー

ログイン後のフローは、特定のアイデンティティプロバイダーを使用したすべてのログイン後に、追加の認証アクションをトリガーしたい場合に役立ちます。例えば、Keycloak から Facebook へのすべてのログイン後に 2 要素認証をトリガーしたい場合があります。なぜなら、Facebook はログイン中に 2 要素認証を提供しないためです。

必要なステップで認証フローを設定したら、アイデンティティプロバイダーを設定する際に、それを「ログイン後のフロー」として設定します。

ログイン後のフローの例

アイデンティティプロバイダーログイン後の 2 要素認証の要求

最も簡単な方法は、特定の 2 要素認証メソッドによる認証を強制することです。例えば、OTP を要求する場合、フローは単一の認証機構のみが設定された次のようになります。このタイプのフローは、ユーザーがアカウントに OTP を設定していない場合、アイデンティティプロバイダーを使用した最初のログイン時に OTP を設定するようにユーザーに求めます。

OTP を使用した 2FA ログイン後のフロー

Post login OTP

より複雑な設定には、複数の 2 要素認証メソッドを ALTERNATIVE として設定することが含まれます。この場合、ユーザーがアカウントにまだ 2 要素認証を設定していない場合、ユーザーがいずれかのメソッドを設定するように求められるようにしてください。これは、次のように行うことができます。

  • いずれかの 2 要素認証メソッドが最初のログインフローREQUIRED として設定されていることを確認してください。この方法は、すべてのユーザーがアイデンティティプロバイダーログインによって登録されることを期待する場合に機能します。

  • 2 要素認証メソッドを ALTERNATIVE として、例えば 2FA と呼ばれる条件付きサブフローにラップし、別の条件付きサブフロー(例えば OTP if no 2FA と呼ばれるもの)を作成します。これは、前のサブフローが実行されなかった場合にのみトリガーされ、ユーザーにいずれかの 2 要素認証メソッド(例えば、OTP)を追加するように求めます。同様のフロー構成の例は、認証フローの章の条件セクションで提供されています。

専用クライアントの追加認証ステップの要求

場合によっては、クライアントまたはクライアントグループが、アイデンティティプロバイダーログイン後に追加のステップを実行する必要がある場合があります。以下は、クライアントスコープ foo が要求された場合、ユーザーがアイデンティティプロバイダーログイン後に OTP で認証される必要があることを規定するフローの例です。

クライアントスコープと OTP を使用した 2FA ログイン後のフロー

Post login with client scope and OTP

これは、指定されたクライアントスコープを要求するための Condition - client scope の構成例です。

2FA ログイン後のフロークライアントスコープ構成

Post login flow client scope configuration

要求されたクライアントは、デフォルトまたはオプションとしてこのクライアントスコープを設定する必要があります。後者の場合、フローは、クライアントスコープがクライアントによって要求された場合(例えば、OIDC/OAuth2 クライアントログインの場合の scope パラメーターによって)にのみ実行されます。

外部 IDP トークンの取得

Keycloak では、IDP の設定ページにある Store Token 構成オプションを使用して、外部 IDP との認証プロセスからのトークンとレスポンスを保存できます。

アプリケーションコードは、これらのトークンとレスポンスを取得して、追加のユーザー情報をインポートしたり、外部 IDP に安全にリクエストしたりできます。例えば、アプリケーションは Google トークンを使用して、他の Google サービスと REST API を使用できます。特定のアイデンティティプロバイダーのトークンを取得するには、次のようにリクエストを送信します。

GET /realms/{realm-name}/broker/{provider_alias}/token HTTP/1.1
Host: localhost:8080
Authorization: Bearer <KEYCLOAK ACCESS TOKEN>

アプリケーションは Keycloak で認証を行い、アクセストークンを受け取る必要があります。このアクセストークンには、broker クライアントレベルロール read-token が設定されている必要があります。したがって、ユーザーはこのロールのマッピングを持っている必要があり、クライアントアプリケーションはそのスコープ内にそのロールを持っている必要があります。この場合、Keycloak の保護されたサービスにアクセスしているため、ユーザー認証中に Keycloak によって発行されたアクセストークンを送信します。ブローカー構成ページで保存されたトークンを読み取り可能にするスイッチをオンに設定することで、このロールを新しくインポートされたユーザーに割り当てることができます。

これらの外部トークンは、プロバイダーを介して再度ログインするか、クライアント主導のアカウントリンク API を使用して再確立できます。

アイデンティティブローカーのログアウト

ログアウト時に、Keycloak は最初にログインするために使用された外部アイデンティティプロバイダーにリクエストを送信し、ユーザーをこのアイデンティティプロバイダーからログアウトさせます。

SSO プロトコル

このセクションでは、認証プロトコル、Keycloak 認証サーバー、および Keycloak 認証サーバーによって保護されたアプリケーションがこれらのプロトコルとどのように対話するかについて説明します。

OpenID Connect

OpenID Connect (OIDC) は認証プロトコルであり、OAuth 2.0 の拡張機能です。

OAuth 2.0 は、認可プロトコルを構築するためのフレームワークであり、不完全です。しかし、OIDC は、Json Web Token (JWT) 標準を使用する完全な認証および認可プロトコルです。JWT 標準は、アイデンティティトークン JSON 形式と、コンパクトで Web フレンドリーな方法でデータにデジタル署名と暗号化を行う方法を定義しています。

一般的に、OIDC は 2 つのユースケースを実装しています。最初のケースは、アプリケーションが Keycloak サーバーにユーザーを認証するように要求することです。ログインに成功すると、アプリケーションはアイデンティティトークンアクセストークンを受け取ります。アイデンティティトークンには、ユーザー名、メールアドレス、プロファイル情報などのユーザー情報が含まれています。レルムは、アプリケーションがアプリケーションでユーザーがアクセスできるリソースを決定するために使用するアクセス情報(ユーザーロールマッピングなど)を含むアクセストークンにデジタル署名します。

2 番目のユースケースは、クライアントがリモートサービスにアクセスすることです。

  • クライアントは、ユーザーに代わってリモートサービスを呼び出すために、Keycloak からアクセストークンを要求します。

  • Keycloak はユーザーを認証し、要求クライアントへのアクセスを許可するための同意をユーザーに求めます。

  • クライアントは、レルムによってデジタル署名されたアクセストークンを受け取ります。

  • クライアントは、アクセストークンを使用してリモートサービスに対して REST リクエストを行います。

  • リモート REST サービスはアクセストークンを抽出します。

  • リモート REST サービスは、トークン署名を検証します。

  • リモート REST サービスは、トークン内のアクセス情報に基づいて、リクエストを処理するか拒否するかを決定します。

OIDC 認証フロー

OIDC には、クライアントまたはアプリケーションがユーザーを認証し、アイデンティティトークンとアクセストークンを受け取るために使用できるいくつかのメソッドまたはフローがあります。メソッドは、アクセスを要求するアプリケーションまたはクライアントのタイプによって異なります。

認可コードフロー

認可コードフローは、ブラウザベースのプロトコルであり、ブラウザベースのアプリケーションの認証と認可に適しています。ブラウザのリダイレクトを使用して、アイデンティティトークンとアクセストークンを取得します。

  1. ユーザーはブラウザを使用してアプリケーションに接続します。アプリケーションは、ユーザーがアプリケーションにログインしていないことを検出します。

  2. アプリケーションは、認証のためにブラウザを Keycloak にリダイレクトします。

  3. アプリケーションは、コールバック URL をクエリパラメーターとしてブラウザリダイレクトで渡します。Keycloak は、認証に成功するとパラメーターを使用します。

  4. Keycloak はユーザーを認証し、1 回限りの短寿命の一時コードを作成します。

  5. Keycloak は、コールバック URL を使用してアプリケーションにリダイレクトし、コールバック URL に一時コードをクエリパラメーターとして追加します。

  6. アプリケーションは一時コードを抽出し、バックグラウンド REST 呼び出しを Keycloak に行い、コードをアイデンティティトークン、アクセストークン、およびリフレッシュトークンと交換します。リプレイ攻撃を防ぐために、一時コードは複数回使用できません。

システムは、トークンの有効期間中、盗まれたトークンに対して脆弱です。セキュリティとスケーラビリティの理由から、アクセストークンは通常、有効期限がすぐに切れるように設定されているため、後続のトークンリクエストは失敗します。トークンの有効期限が切れた場合、アプリケーションは、ログインプロトコルによって送信された追加のリフレッシュトークンを使用して、新しいアクセストークンを取得できます。

Confidential クライアントは、一時コードをトークンと交換する際にクライアントシークレットを提供します。Public クライアントは、クライアントシークレットを提供する必要はありません。Public クライアントは、HTTPS が厳密に強制され、クライアントに登録されたリダイレクト URI が厳密に制御されている場合に安全です。HTML5/JavaScript クライアントは、クライアントシークレットを HTML5/JavaScript クライアントに安全に送信する方法がないため、public クライアントである必要があります。詳細については、クライアントの管理の章を参照してください。

Keycloak は、Proof Key for Code Exchange 仕様もサポートしています。

暗黙的フロー

暗黙的フローは、ブラウザベースのプロトコルです。認可コードフローに似ていますが、リクエストが少なく、リフレッシュトークンはありません。

トークンがリダイレクト URI 経由で送信される場合(下記参照)、ブラウザ履歴でアクセストークンがリークする可能性があります。

また、このフローはクライアントにリフレッシュトークンを提供しません。したがって、アクセストークンは長寿命であるか、有効期限が切れたときにユーザーが再認証する必要があります。

このフローの使用はお勧めしません。このフローは、OIDC および OAuth 2.0 仕様にあるためサポートされています。

プロトコルは次のように機能します。

  1. ユーザーはブラウザを使用してアプリケーションに接続します。アプリケーションは、ユーザーがアプリケーションにログインしていないことを検出します。

  2. アプリケーションは、認証のためにブラウザを Keycloak にリダイレクトします。

  3. アプリケーションは、コールバック URL をクエリパラメーターとしてブラウザリダイレクトで渡します。Keycloak は、認証に成功するとクエリパラメーターを使用します。

  4. Keycloak はユーザーを認証し、アイデンティティトークンとアクセストークンを作成します。Keycloak は、コールバック URL を使用してアプリケーションにリダイレクトし、さらにアイデンティティトークンとアクセストークンをコールバック URL にクエリパラメーターとして追加します。

  5. アプリケーションは、コールバック URL からアイデンティティトークンとアクセストークンを抽出します。

リソースオーナーパスワード資格情報グラント(ダイレクトアクセスグラント)

ダイレクトアクセスグラントは、REST クライアントがユーザーに代わってトークンを取得するために使用されます。これは、次のものを含む HTTP POST リクエストです。

  • ユーザーの資格情報。資格情報はフォームパラメーター内で送信されます。

  • クライアントの ID。

  • クライアントシークレット(機密クライアントの場合)。

HTTP レスポンスには、アイデンティティトークン、アクセストークン、およびリフレッシュトークンが含まれています。

クライアント資格情報グラント

クライアント資格情報グラントは、外部ユーザーに代わって動作するトークンを取得する代わりに、クライアントに関連付けられたサービスアカウントのメタデータとアクセス許可に基づいてトークンを作成します。クライアント資格情報グラントは、REST クライアントによって使用されます。

詳細については、サービスアカウントの章を参照してください。

リフレッシュトークングラント

デフォルトでは、Keycloak は、上記の暗黙的フローまたはクライアント資格情報グラントなどの一部の例外を除き、ほとんどのフローからのトークンレスポンスでリフレッシュトークンを返します。

リフレッシュトークンは、SSO ブラウザセッションのユーザーセッションに関連付けられており、ユーザーセッションの有効期間中有効である可能性があります。ただし、クライアントは指定された間隔に少なくとも 1 回はリフレッシュトークンリクエストを送信する必要があります。そうしないと、セッションは「アイドル」と見なされ、期限切れになる可能性があります。詳細については、タイムアウトセクションを参照してください。

Keycloak は、クライアントが対応するブラウザ SSO セッションが既に期限切れになっている場合でもリフレッシュトークンを使用する必要がある場合に通常使用できるオフライン トークンをサポートしています。

リフレッシュトークンローテーション

リフレッシュトークンが一度使用されると無効と見なされるように指定することができます。これは、クライアントが常に最後のリフレッシュレスポンスからリフレッシュトークンを保存する必要があることを意味します。なぜなら、既に使用された古いリフレッシュトークンは、Keycloak によって有効とは見なされなくなるためです。これは、タイムアウトセクションで指定されているように、リフレッシュトークンを取り消すオプションを使用することで設定できます。

Keycloak は、リフレッシュトークンローテーションが存在しない状況もサポートしています。この場合、リフレッシュトークンはログイン中に返されますが、その後のリフレッシュトークンリクエストからのレスポンスは新しいリフレッシュトークンを返しません。このプラクティスは、例えば FAPI 2 ドラフト仕様アプリケーションの保護セクションで推奨されています。Keycloak では、クライアントポリシーを使用することで、リフレッシュトークンローテーションをスキップすることが可能です。クライアントプロファイルに suppress-refresh-token-rotation エグゼキュータを追加し、クライアントポリシーを設定して、どのクライアントに対してプロファイルがトリガーされるかを指定できます。これは、それらのクライアントに対してリフレッシュトークンローテーションがスキップされることを意味します。

デバイス認可グラント

これは、入力機能が制限されている、または適切なブラウザがないインターネット接続デバイス上で実行されているクライアントによって使用されます。プロトコルの簡単な概要を以下に示します。

  1. アプリケーションは Keycloak にデバイスコードとユーザーコードをリクエストします。Keycloak はデバイスコードとユーザーコードを作成します。Keycloak は、デバイスコードとユーザーコードを含むレスポンスをアプリケーションに返します。

  2. アプリケーションはユーザーにユーザーコードと検証 URI を提供します。ユーザーは別のブラウザを使用して認証されるために検証 URI にアクセスします。プロキシ内で Keycloak の外部で Keycloak 検証 URI (/realms/realm_name/device) にリダイレクトされる短い verification_uri を定義できます (例: fe)。

  3. アプリケーションは、ユーザーがユーザー認証を完了したかどうかを確認するために、Keycloak に繰り返しポーリングします。ユーザー認証が完了すると、アプリケーションはデバイスコードをアイデンティティアクセスリフレッシュトークンと交換します。

クライアント起因バックチャネル認証グラント

この機能は、OAuth 2.0 の認可コードグラントのように、ユーザーのブラウザを介したリダイレクトなしで、OpenID プロバイダーと直接通信することにより認証フローを開始したいクライアントによって使用されます。プロトコルの簡単な概要を以下に示します。

  1. クライアントは Keycloak に、クライアントによって行われた認証リクエストを識別する auth_req_id をリクエストします。Keycloak は auth_req_id を作成します。

  2. この auth_req_id を受信した後、このクライアントはユーザーが認証されるまで、auth_req_id と引き換えにアクセストークン、リフレッシュトークン、および ID トークンを Keycloak から取得するために、Keycloak に繰り返しポーリングする必要があります。

管理者は、レルムごとに CIBA ポリシー としてクライアント起因バックチャネル認証 (CIBA) 関連の操作を設定できます。

また、アプリケーションの保護セクションの バックチャネル認証エンドポイントクライアント起因バックチャネル認証グラント など、Keycloak ドキュメントの他の場所も参照してください。

CIBA ポリシー

管理者は 管理コンソール で次の操作を実行します。

  • 認証 → CIBA ポリシー タブを開きます。

  • 項目を設定し、保存 をクリックします。

設定可能な項目とその説明は次のとおりです。

構成 説明

バックチャネルトークン配信モード

CD (Consumption Device: 消費デバイス) が認証結果と関連トークンを取得する方法を指定します。「poll」、「ping」、「push」の 3 つのモードがあります。Keycloak は「poll」のみをサポートしています。デフォルト設定は「poll」です。この設定は必須です。詳細については、CIBA 仕様 を参照してください。

有効期限

認証リクエストを受信してから「auth_req_id」の有効期限(秒単位)。デフォルト設定は 120 です。この設定は必須です。詳細については、CIBA 仕様 を参照してください。

間隔

CD (消費デバイス) がトークンエンドポイントへのポーリングリクエストの間で待機する必要がある間隔(秒単位)。デフォルト設定は 5 です。この設定はオプションです。詳細については、CIBA 仕様 を参照してください。

認証リクエストユーザーヒント

認証がリクエストされているエンドユーザーを識別する方法。デフォルト設定は「login_hint」です。「login_hint」、「login_hint_token」、「id_token_hint」の 3 つのモードがあります。Keycloak は「login_hint」のみをサポートしています。この設定は必須です。詳細については、CIBA 仕様 を参照してください。

プロバイダー設定

CIBA グラントは、次の 2 つのプロバイダーを使用します。

  1. 認証チャネルプロバイダー: AD (認証デバイス) 経由でユーザーを実際に認証するエンティティと Keycloak 間の通信を提供します。

  2. ユーザーリゾルバープロバイダー: クライアントから提供された情報から Keycloak の UserModel を取得してユーザーを識別します。

Keycloak には両方のデフォルトプロバイダーがあります。ただし、管理者は次のように認証チャネルプロバイダーを設定する必要があります。

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 を指定します。

認証チャネルプロバイダー

CIBA 標準ドキュメントでは、AD によるユーザー認証の方法は規定されていません。したがって、製品の裁量で実装される可能性があります。Keycloak は、この認証を外部の認証エンティティに委任します。認証エンティティと通信するために、Keycloak は認証チャネルプロバイダーを提供します。

Keycloak の実装では、認証エンティティは Keycloak の管理者によって制御されているため、Keycloak は認証エンティティを信頼することを前提としています。Keycloak の管理者が制御できない認証エンティティを使用することはお勧めしません。

認証チャネルプロバイダーは SPI プロバイダーとして提供されているため、Keycloak のユーザーは各自の環境に合わせて独自のプロバイダーを実装できます。Keycloak は、認証エンティティとの通信に HTTP を使用する HTTP 認証チャネルプロバイダーと呼ばれるデフォルトプロバイダーを提供しています。

Keycloak のユーザーが HTTP 認証チャネルプロバイダーを使用したい場合、Keycloak と認証エンティティ間の契約を知る必要があります。契約は次の 2 つの部分で構成されています。

認証委任リクエスト/レスポンス

Keycloak は認証リクエストを認証エンティティに送信します。

認証結果通知/ACK

認証エンティティは認証結果を Keycloak に通知します。

認証委任リクエスト/レスポンスは、次のメッセージングで構成されています。

認証委任リクエスト

リクエストは、AD によるユーザー認証を依頼するために Keycloak から認証エンティティに送信されます。

POST [delegation_reception]
  • ヘッダー

名前 説明

Content-Type

application/json

メッセージボディは json 形式です。

Authorization

Bearer [token]

[token] は、認証エンティティが認証結果を Keycloak に通知するときに使用されます。

  • パラメーター

タイプ 名前 説明

パス

delegation_reception

委任リクエストを受信する認証エンティティによって提供されるエンドポイント

  • ボディ

名前 説明

login_hint

AD によって認証されたユーザーを認証エンティティに伝えます。
デフォルトでは、ユーザーの「username」です。
このフィールドは必須であり、CIBA 標準ドキュメントで定義されています。

scope

認証エンティティが認証されたユーザーから同意を得るスコープを伝えます。
このフィールドは必須であり、CIBA 標準ドキュメントで定義されています。

is_consent_required

認証エンティティがスコープについて認証されたユーザーから同意を得る必要があるかどうかを示します。
このフィールドは必須です。

binding_message

その値は、AD による認証が CD によってトリガーされたことをユーザーに認識させるために、CD と AD の UI の両方に表示されることを意図しています。
このフィールドはオプションであり、CIBA 標準ドキュメントで定義されています。

acr_values

CD からのリクエスト認証コンテキストクラス参照を伝えます。
このフィールドはオプションであり、CIBA 標準ドキュメントで定義されています。

認証委任レスポンス

レスポンスは、認証エンティティから Keycloak に返され、認証エンティティが Keycloak からの認証リクエストを受信したことを通知します。

  • レスポンス

HTTP ステータスコード 説明

201

認証委任リクエストの受信を Keycloak に通知します。

認証結果通知/ACK は、次のメッセージングで構成されています。

認証結果通知

認証エンティティは認証リクエストの結果を Keycloak に送信します。

POST /realms/[realm]/protocol/openid-connect/ext/ciba/auth/callback
  • ヘッダー

名前 説明

Content-Type

application/json

メッセージボディは json 形式です。

Authorization

Bearer [token]

[token] は、認証エンティティが認証委任リクエストで Keycloak から受信したものと同じである必要があります。

  • パラメーター

タイプ 名前 説明

パス

realm

レルム名

  • ボディ

名前 説明

status

AD によるユーザー認証の結果を伝えます。
次のステータスのいずれかである必要があります。
SUCCEED : AD による認証が正常に完了しました。
UNAUTHORIZED : AD による認証が完了していません。
CANCELLED : AD による認証がユーザーによってキャンセルされました。

認証結果 ACK

レスポンスは、認証エンティティから Keycloak に返され、Keycloak が認証エンティティからの AD によるユーザー認証の結果を受信したことを通知します。

  • レスポンス

HTTP ステータスコード 説明

200

認証結果の通知を受信したことを認証エンティティに通知します。

ユーザーリゾルバープロバイダー

同じユーザーであっても、その表現は CD、Keycloak、および認証エンティティで異なる場合があります。

CD、Keycloak、および認証エンティティが同じユーザーを認識するために、このユーザーリゾルバープロバイダーは、それらの間で独自のユーザー表現を変換します。

ユーザーリゾルバープロバイダーは SPI プロバイダーとして提供されているため、Keycloak のユーザーは各自の環境に合わせて独自のプロバイダーを実装できます。Keycloak は、次の特性を持つデフォルトユーザーリゾルバープロバイダーと呼ばれるデフォルトプロバイダーを提供しています。

  • login_hint パラメーターのみをサポートし、デフォルトとして使用されます。

  • Keycloak の UserModel の username は、CD、Keycloak、および認証エンティティでユーザーを表すために使用されます。

OIDC ログアウト

OIDC には、ログアウトメカニズムに関連する 4 つの仕様があります。

これらすべては OIDC 仕様に記載されているため、ここでは簡単な概要のみを示します。

セッション管理

これはブラウザベースのログアウトです。アプリケーションは Keycloak から定期的にセッションステータス情報を取得します。Keycloak でセッションが終了すると、アプリケーションはそれを検出し、独自のログアウトをトリガーします。

RP 起因ログアウト

これもブラウザベースのログアウトであり、ログアウトはユーザーを Keycloak の特定のエンドポイントにリダイレクトすることによって開始されます。このリダイレクトは通常、以前に Keycloak を使用してユーザーを認証した一部のアプリケーションのページで、ユーザーが ログアウト リンクをクリックしたときに発生します。

ユーザーがログアウトエンドポイントにリダイレクトされると、Keycloak はクライアントにログアウトリクエストを送信して、ローカルユーザーセッションを無効にし、ログアウトプロセスが完了したらユーザーを特定の URL にリダイレクトする可能性があります。id_token_hint パラメーターが使用されていない場合、ユーザーはオプションでログアウトの確認を求められる場合があります。ログアウト後、post_logout_redirect_uri がパラメーターとして提供されている限り、ユーザーは指定された post_logout_redirect_uri に自動的にリダイレクトされます。post_logout_redirect_uri を含める場合は、client_id または id_token_hint パラメーターのいずれかを含める必要があることに注意してください。また、post_logout_redirect_uri パラメーターは、クライアント構成で指定された 有効なログアウトリダイレクト URI のいずれかと一致する必要があります。

クライアント構成に応じて、ログアウトリクエストはフロントチャネルまたはバックチャネルを介してクライアントに送信できます。前のセクションで説明したセッション管理に依存するフロントエンドブラウザークライアントの場合、Keycloak はログアウトリクエストを送信する必要はありません。これらのクライアントは、ブラウザの SSO セッションがログアウトしたことを自動的に検出します。

フロントチャネルログアウト

フロントチャネルを介してログアウトリクエストを受信するようにクライアントを設定するには、フロントチャネルログアウトクライアント設定を参照してください。この方法を使用する場合、次の点を考慮してください。

  • Keycloak によってクライアントに送信されるログアウトリクエストは、ブラウザとログアウトページ用にレンダリングされる埋め込み iframe に依存しています。

  • iframe に基づいているため、フロントチャネルログアウトはコンテンツセキュリティポリシー (CSP) の影響を受ける可能性があり、ログアウトリクエストがブロックされる可能性があります。

  • ユーザーがログアウトページをレンダリングする前、またはログアウトリクエストが実際にクライアントに送信される前にブラウザを閉じると、クライアントでのセッションが無効にならない可能性があります。

より信頼性が高く安全なユーザーログアウトおよびクライアントでのセッション終了のアプローチを提供するバックチャネルログアウトの使用を検討してください。

クライアントでフロントチャネルログアウトが有効になっていない場合、Keycloak は最初に バックチャネルログアウト URL を使用してバックチャネル経由でログアウトリクエストを送信しようとします。定義されていない場合、サーバーは 管理 URL の使用にフォールバックします。

バックチャネルログアウト

これは、Keycloak とクライアント間の直接バックチャネル通信を使用する非ブラウザベースのログアウトです。Keycloak は、ログアウトトークンを含む HTTP POST リクエストを Keycloak にログインしているすべてのクライアントに送信します。これらのリクエストは、Keycloak に登録されたバックチャネルログアウト URL に送信され、クライアント側でログアウトをトリガーすることを想定しています。

Keycloak サーバー OIDC URI エンドポイント

以下は、Keycloak が公開する OIDC エンドポイントのリストです。これらのエンドポイントは、Keycloak 以外のクライアントアダプターが OIDC を使用して認証サーバーと通信する場合に使用できます。これらはすべて相対 URL です。URL のルートは、HTTP(S) プロトコル、ホスト名、およびオプションでパスで構成されます。例:

https://#:8080
/realms/{realm-name}/protocol/openid-connect/auth

認可コードフローで一時コードを取得したり、暗黙的フロー、ダイレクトグラント、またはクライアントグラントを使用してトークンを取得したりするために使用されます。

/realms/{realm-name}/protocol/openid-connect/token

認可コードフローが一時コードをトークンに変換するために使用します。

/realms/{realm-name}/protocol/openid-connect/logout

ログアウトを実行するために使用されます。

/realms/{realm-name}/protocol/openid-connect/userinfo

OIDC 仕様で説明されているユーザー情報サービスに使用されます。

/realms/{realm-name}/protocol/openid-connect/revoke

RFC7009 で説明されている OAuth 2.0 トークン失効に使用されます。

/realms/{realm-name}/protocol/openid-connect/certs

JSON Web Key Set (JWKS) (jwks_uri) を検証するために使用される公開鍵を含む JSON Web Key Set (JWKS) に使用されます。

/realms/{realm-name}/protocol/openid-connect/auth/device

デバイスコードとユーザーコードを取得するためのデバイス認可グラントに使用されます。

/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} をレルムの名前に置き換えてください。

SAML

SAML 2.0 は OIDC と同様の仕様ですが、より成熟しています。SOAP および Web サービスメッセージング仕様から派生しているため、一般的に OIDC よりも冗長です。SAML 2.0 は、認証サーバーとアプリケーション間で XML ドキュメントを交換する認証プロトコルです。XML 署名と暗号化は、リクエストとレスポンスを検証するために使用されます。

一般的に、SAML は 2 つのユースケースを実装しています。

最初のユースケースは、アプリケーションが Keycloak サーバーにユーザー認証を要求するケースです。ログインに成功すると、アプリケーションは XML ドキュメントを受け取ります。このドキュメントには、ユーザー属性を指定する SAML アサーションが含まれています。レルムは、アプリケーションがユーザーにアクセスを許可するリソースを決定するために使用するアクセス情報 (ユーザーロールマッピングなど) を含むドキュメントにデジタル署名します。

2番目のユースケースは、クライアントがリモートサービスにアクセスするケースです。クライアントは、ユーザーに代わってリモートサービスを呼び出すために、Keycloak から SAML アサーションを要求します。

SAML バインディング

Keycloak は 3 種類のバインディングタイプをサポートしています。

リダイレクトバインディング

リダイレクト バインディングは、一連のブラウザリダイレクト URI を使用して情報を交換します。

  1. ユーザーはブラウザを使用してアプリケーションに接続します。アプリケーションは、ユーザーが認証されていないことを検出します。

  2. アプリケーションは XML 認証リクエストドキュメントを生成し、URI のクエリパラメータとしてエンコードします。この URI は、Keycloak サーバーにリダイレクトするために使用されます。設定によっては、アプリケーションは XML ドキュメントにデジタル署名し、署名を Keycloak へのリダイレクト URI のクエリパラメータとして含めることもできます。この署名は、リクエストを送信するクライアントを検証するために使用されます。

  3. ブラウザは Keycloak にリダイレクトします。

  4. サーバーは XML 認証リクエストドキュメントを抽出し、必要に応じてデジタル署名を検証します。

  5. ユーザーは認証情報を入力します。

  6. 認証後、サーバーは XML 認証レスポンスドキュメントを生成します。このドキュメントには、名前、住所、メールアドレス、およびユーザーが持つロールマッピングなど、ユーザーに関するメタデータを含む SAML アサーションが含まれています。ドキュメントは通常、XML 署名を使用してデジタル署名され、暗号化される場合もあります。

  7. XML 認証レスポンスドキュメントは、リダイレクト URI のクエリパラメータとしてエンコードされます。URI はブラウザをアプリケーションに戻します。デジタル署名もクエリパラメータとして含まれています。

  8. アプリケーションはリダイレクト URI を受信し、XML ドキュメントを抽出します。

  9. アプリケーションは、有効な認証レスポンスを受信していることを確認するために、レルムの署名を検証します。SAML アサーション内の情報は、アクセス決定を行ったり、ユーザーデータを表示したりするために使用されます。

POST バインディング

POST バインディングは *リダイレクト* バインディングに似ていますが、*POST* バインディングは GET リクエストを使用する代わりに POST リクエストを使用して XML ドキュメントを交換します。*POST* バインディングは JavaScript を使用して、ドキュメントを交換するときにブラウザが Keycloak サーバーまたはアプリケーションに POST リクエストを送信するようにします。HTTP は、埋め込み JavaScript を含む HTML フォームを含む HTML ドキュメントで応答します。ページが読み込まれると、JavaScript はフォームを自動的に呼び出します。

POST バインディングは、2 つの制限により推奨されます。

  • セキュリティ — *リダイレクト* バインディングでは、SAML レスポンスは URL の一部です。ログにレスポンスが記録される可能性があるため、セキュリティが低くなります。

  • サイズ — HTTP ペイロードでドキュメントを送信すると、制限された URL よりも大量のデータを扱うためのより広い範囲が提供されます。

ECP

Enhanced Client or Proxy (ECP) は、Web ブラウザのコンテキスト外で SAML 属性の交換を可能にする SAML v.2.0 プロファイルです。REST または SOAP ベースのクライアントでよく使用されます。

Keycloak サーバー SAML URI エンドポイント

Keycloak には、すべての SAML リクエストに対して 1 つのエンドポイントがあります。

http(s)://authserver.host/realms/{realm-name}/protocol/saml

すべてのバインディングはこのエンドポイントを使用します。

SAML と比較した OpenID Connect

以下に、プロトコルを選択する際に考慮すべきいくつかの要素を示します。

ほとんどの場合、Keycloak は OIDC の使用を推奨しています。

OIDC

  • OIDC は、Web での動作に特化して設計されています。

  • OIDC は、SAML よりもクライアント側での実装が容易なため、HTML5/JavaScript アプリケーションに適しています。

  • OIDC トークンは JSON 形式であるため、JavaScript での消費が容易です。

  • OIDC には、セキュリティ実装を容易にする機能があります。たとえば、ユーザーのログインステータスを判断するために仕様で使用されている iframe トリック を参照してください。

SAML

  • SAML は、Web の上で動作するレイヤーとして設計されています。

  • SAML は OIDC よりも冗長になる可能性があります。

  • ユーザーが OIDC よりも SAML を選択するのは、SAML が成熟しているという認識があるためです。

  • ユーザーが OIDC よりも SAML を選択するのは、SAML で保護されている既存のアプリケーションがあるためです。

Docker レジストリ v2 認証

Docker 認証はデフォルトで無効になっています。Docker 認証を有効にするには、機能の有効化と無効化 ガイドを参照してください。

Docker Registry V2 Authentication は、OIDC に似たプロトコルで、Docker レジストリに対してユーザーを認証します。Keycloak のこのプロトコルの実装により、Docker クライアントは Keycloak 認証サーバーを使用してレジストリに対して認証できます。このプロトコルは標準のトークンおよび署名メカニズムを使用しますが、真の OIDC 実装からは逸脱しています。リクエストとレスポンスに非常に具体的な JSON 形式を使用すること、およびリポジトリ名と権限を OAuth スコープメカニズムにマッピングすることによって逸脱しています。

Docker 認証フロー

認証フローは、Docker API ドキュメント で説明されています。以下は、Keycloak 認証サーバーの観点からの要約です。

  • docker login を実行します。

  • Docker クライアントは Docker レジストリからリソースを要求します。リソースが保護されており、認証トークンがリクエストに含まれていない場合、Docker レジストリサーバーは、必要な権限と認証サーバーの場所に関する情報を含む 401 HTTP メッセージで応答します。

  • Docker クライアントは、Docker レジストリからの 401 HTTP メッセージに基づいて認証リクエストを構築します。クライアントは、ローカルにキャッシュされたクレデンシャル (docker login コマンドから) を、Keycloak 認証サーバーへの HTTP Basic Authentication リクエストの一部として使用します。

  • Keycloak 認証サーバーは、ユーザーの認証を試み、OAuth スタイルのベアラートークンを含む JSON ボディを返します。

  • Docker クライアントは、JSON レスポンスからベアラートークンを受信し、保護されたリソースを要求するために認証ヘッダーで使用します。

  • Docker レジストリは、Keycloak サーバーからのトークンを含む、保護されたリソースの新しいリクエストを受信します。レジストリはトークンを検証し、要求されたリソースへのアクセスを許可します (適切な場合)。

Keycloak は、Docker プロトコルでの認証に成功した後、ブラウザ SSO セッションを作成しません。ブラウザ SSO セッションは、トークンを更新したり、Keycloak サーバーからトークンまたはセッションのステータスを取得したりできないため、Docker プロトコルを使用しません。したがって、ブラウザ SSO セッションは必要ありません。詳細については、一時的なセッション セクションを参照してください。

Keycloak Docker Registry v2 認証サーバー URI エンドポイント

Keycloak には、すべての Docker auth v2 リクエストに対して 1 つのエンドポイントがあります。

http(s)://authserver.host/realms/{realm-name}/protocol/docker-v2/auth

レルムリソースへのアクセス管理

Keycloak 上に作成された各レルムには、そのレルムを管理できる専用の Admin Console があります。master レルムは、管理者がシステム上の複数のレルムを管理できる特別なレルムです。サーバーを管理するために、異なるレルムのユーザーへのきめ細かいアクセスを定義することもできます。この章では、これに関するすべてのシナリオについて説明します。

マスターレルムのアクセス制御

Keycloak の master レルムは特別なレルムであり、他のレルムとは異なる扱いを受けます。Keycloak master レルムのユーザーには、Keycloak サーバーにデプロイされている 0 個以上のレルムを管理する権限を付与できます。レルムが作成されると、Keycloak はその新しいレルムへのアクセス権を付与するさまざまなロールを自動的に作成します。Admin Console および Admin REST エンドポイントへのアクセスは、これらのロールを master レルムのユーザーにマッピングすることで制御できます。複数のスーパーユーザーだけでなく、特定のレルムのみを管理できるユーザーを作成することも可能です。

グローバルロール

master レルムには、レルムレベルのロールが 2 つあります。これらは次のとおりです。

  • admin (管理者)

  • create-realm (レルム作成者)

admin ロールを持つユーザーはスーパーユーザーであり、サーバー上の任意のレルムを管理するためのフルアクセス権を持っています。create-realm ロールを持つユーザーは、新しいレルムを作成することを許可されています。彼らは、作成した新しいレルムへのフルアクセス権を付与されます。

レルム固有のロール

master レルム内の管理者ユーザーには、システム内の 1 つ以上の他のレルムに対する管理権限を付与できます。Keycloak の各レルムは、master レルム内のクライアントによって表されます。クライアントの名前は <realm name>-realm です。これらのクライアントにはそれぞれ、個々のレルムを管理するためのさまざまなレベルのアクセスを定義するクライアントレベルのロールが定義されています。

利用可能なロールは次のとおりです。

  • create-client (クライアント作成者)

  • impersonation (なりすまし)

  • manage-authorization (認可管理)

  • manage-clients (クライアント管理)

  • manage-events (イベント管理)

  • manage-identity-providers (ID プロバイダー管理)

  • manage-realm (レルム管理)

  • manage-users (ユーザー管理)

  • query-clients (クライアント照会)

  • query-groups (グループ照会)

  • query-realms (レルム照会)

  • query-users (ユーザー照会)

  • view-authorization (認可表示)

  • view-clients (クライアント表示)

  • view-events (イベント表示)

  • view-identity-providers (ID プロバイダー表示)

  • view-realm (レルム表示)

  • view-users (ユーザー表示)

ユーザーに必要なロールを割り当てると、ユーザーは管理コンソールのその特定の部分のみを使用できるようになります。

manage-users ロールを持つ管理者は、自分自身が持っている管理者ロールをユーザーにのみ割り当てることができます。したがって、管理者が manage-users ロールを持っていても manage-realm ロールを持っていない場合、このロールを割り当てることはできません。

専用レルム管理コンソール

各レルムには専用の Admin Console があり、URL /admin/{realm-name}/console にアクセスすることでアクセスできます。そのレルム内のユーザーには、特定のユーザーロールマッピングを割り当てることでレルム管理権限を付与できます。

各レルムには、realm-management という組み込みクライアントがあります。レルムの左側のメニュー項目の Clients に移動すると、このクライアントを表示できます。このクライアントは、レルムを管理するために付与できる権限を指定するクライアントレベルのロールを定義します。

  • create-client (クライアント作成者)

  • impersonation (なりすまし)

  • manage-authorization (認可管理)

  • manage-clients (クライアント管理)

  • manage-events (イベント管理)

  • manage-identity-providers (ID プロバイダー管理)

  • manage-realm (レルム管理)

  • manage-users (ユーザー管理)

  • query-clients (クライアント照会)

  • query-groups (グループ照会)

  • query-realms (レルム照会)

  • query-users (ユーザー照会)

  • realm-admin (レルム管理者)

  • view-authorization (認可表示)

  • view-clients (クライアント表示)

  • view-events (イベント表示)

  • view-identity-providers (ID プロバイダー表示)

  • view-realm (レルム表示)

  • view-users (ユーザー表示)

ユーザーに必要なロールを割り当てると、ユーザーは管理コンソールのその特定の部分のみを使用できるようになります。

権限を使用したレルム管理の委任

きめ細かい管理者権限機能を使用すると、レルム管理を他の管理者、レルム管理者に委任できます。 グローバルおよびレルム固有のロールを通じて提供されるロールベースのアクセス制御 (RBAC) メカニズムとは異なり、この機能は、レルムリソースへのアクセスおよび管理方法を、それらに対して実行できる明確に定義された操作セットに基づいて、よりきめ細かく制御できるようにします。

ポリシーベースのアクセス制御を利用することで、サーバー管理者は、ユーザー、グループ、クライアントなどのレルムリソースに対するアクセス許可を、さまざまなポリシータイプまたはアクセス制御方法を使用して定義できます。これにより、レルム管理者は、レルムリソースとその操作のサブセットへのアクセスに制限されます。

この機能は、前述のRBACメカニズムの代替手段を提供しますが、置き換えるものではありません。レルム管理者にアクセスを委任するために、view-usersmanage-clientsのような管理ロールを付与することもできますが、その場合、この機能によって提供されるメカニズムは適用されません。

レルムリソースへのアクセス制御は、管理コンソールまたはAdmin APIを通じてリソースを管理する場合にのみ適用されます。

レルムリソースタイプについて

レルム内では、ユーザー、グループ、クライアント、クライアントスコープ、ロールなど、さまざまなタイプのリソースを管理できます。 レルム管理者として、アイデンティティの管理、およびレルムとアプリケーションへの認証と認可の方法を管理する際に、これらのリソースを常に管理しています。

この機能は、レルムリソースを管理する際にアクセス制御を強制するために必要なメカニズムを提供します。対象は以下に限定されます。

  • ユーザー

  • グループ

  • クライアント

  • ロール

レルム内のすべてのユーザーなど、特定のリソースタイプのすべてのリソース、またはレルム内の特定のユーザーまたはユーザーセットなど、特定レルムリソースに対するアクセス許可を管理できます。

アクセスのスコープについて

各レルムリソースは、viewmanage、およびグループを例にとるとview-membersなどのリソース固有の操作など、それらに対して実行できる明確に定義された一連の管理操作、つまりスコープをサポートしています。

アクセス許可を管理する際、レルム管理者がリソースタイプに対して特定の操作を実行できるように、リソースタイプから1つ以上のスコープのセットを選択します。 たとえば、viewスコープを付与すると、レルム管理者はレルムリソースを一覧表示、検索、および表示できるようになります。 一方、manageスコープを使用すると、管理者はそれらに対する更新と削除を実行できます。

スコープは互いに完全に独立しています。 レルムリソースのmanageアクセス権を付与しても、viewスコープが自動的に付与されるわけではありません。 スコープ間に推移的な依存関係は存在しません。 これは、アクセス許可を管理する際の全体的なユーザーエクスペリエンスに影響を与える可能性があります。個々のスコープを選択する必要があるためですが、特定のスコープへのアクセスを強制するアクセス許可をより簡単に特定できるという利点があります。

あるリソースタイプの特定のスコープは、別のリソースタイプのスコープと関係(推移的な依存関係ではない)を持っています。 この関係は主に、レルムグループとそのメンバーなど、レルムリソースのグループを表すリソースタイプを管理する場合に当てはまります。

ユーザーリソースタイプ

ユーザーレルムリソースタイプは、レルム内のユーザーを表します。 以下のスコープセットに基づいて、ユーザーのアクセス許可を管理できます。

スコープ 説明 併せて付与されるもの

view

レルム管理者がユーザーを表示できるかどうかを定義します。 このスコープは、次のことを行う場合に常に設定する必要があります。

view-membersを使用して、クエリからユーザーを利用できるようにする。

manage

レルム管理者がユーザーを管理できるかどうかを定義します。

manage-members

manage-group-membership

レルム管理者がユーザーをグループに割り当てたり、グループから割り当て解除したりできるかどうかを定義します。

なし

map-roles

レルム管理者がロールをユーザーに割り当てたり、ユーザーから割り当て解除したりできるかどうかを定義します。

なし

impersonate

レルム管理者が他のユーザーになりすますことができるかどうかを定義します。

impersonate-members

ユーザーリソースタイプは、グループに設定できるアクセス許可の一部と強い関係があります。 ほとんどの場合、ユーザーはグループのメンバーであり、グループのview-membersまたはmanage-membersへのアクセスを許可すると、レルム管理者もそのグループのメンバーをviewおよびmanageできるようになるはずです。

この機能は、フェデレーションリソースへのアクセス制御をサポートしていませんが、この制限は将来の改善のために検討されています。

グループリソースタイプ

グループレルムリソースタイプは、レルム内のグループを表します。 次の管理操作セットに基づいて、グループのアクセス許可を管理できます。

操作 説明

view

レルム管理者がグループを表示できるかどうかを定義します。 このスコープは、グループをクエリから利用できるようにする場合に常に設定する必要があります。

manage

レルム管理者がグループを管理できるかどうかを定義します。

view-members

レルム管理者がグループメンバーを表示できるかどうかを定義します。 この操作は、グループ階層内のすべての子グループに適用されます。 これは、特定のサブグループに対するアクセス許可を明示的に拒否することで防止できます。

manage-members

レルム管理者がグループメンバーを管理できるかどうかを定義します。 この操作は、グループ階層内のすべての子グループに適用されます。 これは、特定のサブグループに対するアクセス許可を明示的に拒否することで防止できます。

impersonate-members

レルム管理者がグループメンバーになりすますことができるかどうかを定義します。 この操作は、グループ階層内のすべての子グループに適用されます。 これは、特定のサブグループに対するアクセス許可を明示的に拒否することで防止できます。

manage-membership

レルム管理者がグループのメンバーを追加または削除できるかどうかを定義します。

クライアントリソースタイプ

クライアントレルムリソースタイプは、レルム内のクライアントを表します。 次の管理操作セットに基づいて、クライアントのアクセス許可を管理できます。

操作 説明

view

レルム管理者がクライアントを表示できるかどうかを定義します。 このスコープは、クライアントをクエリから利用できるようにする場合に常に設定する必要があります。

manage

レルム管理者がクライアントを管理できるかどうかを定義します。

map-roles

レルム管理者がクライアントによって定義された任意のロールをユーザーに割り当てることができるかどうかを定義します。

map-roles-composite

レルム管理者がクライアントによって定義された任意のロールを別のロールへのコンポジットとして割り当てることができるかどうかを定義します。

map-roles-client-scope

レルム管理者がクライアントによって定義された任意のロールをクライアントスコープに割り当てることができるかどうかを定義します。

map-roles操作は、ユーザーを管理したり、ロールを任意に割り当てたりする機能は付与しません。 管理者は、ユーザーに対するユーザーロールマッピング権限も持っている必要があります。

ロールリソースタイプ

ロールレルムリソースタイプは、レルム内のロールを表します。 次の管理操作セットに基づいて、ロールのアクセス許可を管理できます。

操作 説明

map-role

レルム管理者がロール(または複数のロール)をユーザーに割り当てることができるかどうかを定義します。

map-role-composite

レルム管理者がロール(または複数のロール)を別のロールへのコンポジットとして割り当てることができるかどうかを定義します。

map-role-client-scope

レルム管理者がロール(または複数のロール)をクライアントスコープに適用できるかどうかを定義します。

map-roles操作は、ユーザーを管理したり、ロールを任意に割り当てたりする機能は付与しません。 管理者は、ユーザーに対するユーザーロールマッピング権限も持っている必要があります。

ロールがクライアントロールの場合、map-rolesmap-roles-composite、またはmap-roles-client-scopeスコープに対するクライアントリソースタイプのアクセス許可がある場合、ロールリソースタイプのアクセス許可よりも優先されます。

レルムへの管理者権限の有効化

レルムできめ細かい管理者権限を有効にするには、次の手順に従います。

  • 管理コンソールにログインします。

  • Realm settings (レルム設定)」をクリックします。

  • 管理者権限を有効にして、保存をクリックします。

Fine grain enable

有効にすると、管理コンソールの左側のメニューにアクセス許可セクションが表示されます。

Fine grain permissions tab

このセクションから、レルムリソースのアクセス許可を管理できます。

アクセス許可の管理

アクセス許可タブには、レルム内のすべてのアクティブなアクセス許可の概要が表示されます。 ここから、管理者はアクセス許可を作成、更新、削除、または検索できます。 作成したアクセス許可を事前に評価して、レルムリソースへのアクセスが期待どおりに強制されているかどうかを確認することもできます。 詳細については、アクセス許可の評価を参照してください。

アクセス許可を作成するには、アクセス許可を作成ボタンをクリックし、保護するリソースタイプを選択します。

Selecting a resource type to protect

リソースタイプを選択すると、選択したタイプの1つ以上のリソースセットに対してアクセスをどのように強制するかを定義できます。

Creating a permission

アクセス許可を管理する際には、次の設定を定義できます。

  • 名前: アクセス許可の一意の名前。 名前は、ポリシー名とも競合しないようにする必要があります。

  • 説明: アクセス許可の内容をより詳細に説明するためのオプションの説明。

  • 認証スコープ: 選択したリソースタイプに対して保護する操作を表す1つ以上のスコープのセット。 管理者が対応するアクションを実行するには、各操作に対して明示的なアクセス許可が割り当てられている必要があります。 たとえば、viewなしでmanageのみを割り当てると、ユーザーは表示されなくなります。

  • アクセスを強制する対象: アクセス許可を、選択したタイプのすべてのリソースに強制するか、レルム内の特定のリソースに強制するかを定義します。

  • ポリシー: 選択したリソースへのアクセスを許可または拒否するために評価される1つ以上のポリシーのセットを定義します。

アクセス許可を作成すると、選択した(すべての)リソースとスコープへのアクセスを強制するときに自動的に有効になります。 本番環境でアクセス許可を作成および更新する際には、その事実に留意してください。

レルムリソースを表示するためのアクセス許可の定義

この機能は、レルム管理者がレルムリソースを一覧表示および表示する際に、レルム管理者が持つアクセス許可を部分的に評価する部分評価メカニズムに依存しています。 このメカニズムは、レルム管理者が直接的または間接的に参照されているビュー関連スコープに設定されたすべてのアクセス許可をプリフェッチします。

特定のタイプのリソースのviewアクセス権を付与するアクセス許可は、クエリから利用できるようにするために、次のいずれかのポリシーを使用する必要があります。

  • ユーザー

  • グループ

  • ロール

上記のポリシーのいずれかを使用することにより、Keycloakは、レルム管理者が表示できるリソースのセットを、レルム管理者への直接参照(ユーザーポリシーを使用する場合)または間接参照(ロールまたはグループポリシーを使用する場合)を探すことによって事前に計算できます。 したがって、部分評価メカニズムには、データベースレベルで実行されるアクセス制御でクエリを装飾することが含まれます。 この機能は主に、リソースのページネーションを適切に許可し、クエリによって返されるレルムリソースごとにアクセス許可を評価する際のサーバー側の追加オーバーヘッドを回避するために重要です。

部分評価とフィルタリングは、機能がレルムに対して有効になっており、ユーザーにview-usersview-clientsなどのビュー関連の管理ロールが付与されていない場合にのみ発生します。 たとえば、adminロールが付与された通常のサーバー管理者には発生しません。

リソースをクエリする場合、部分評価メカニズムは次のように機能します。

  • レルム管理者を参照する特定のリソースタイプのすべてのアクセス許可を解決します。

  • 各アクセス許可を事前に評価して、レルム管理者がアクセス許可に関連付けられたリソースへのアクセス権を持っているかどうかを確認します。

  • 許可または拒否されたリソースに基づいてデータベースクエリを装飾します。

その結果、クエリの結果セットには、レルム管理者がビュー関連スコープのいずれかへのアクセス権を持つレルムリソースのみが含まれます。

アクセス許可の検索

管理コンソールには、アクセス許可を検索するためのいくつかの方法が用意されており、次の機能をサポートしています。

  • 名前に特定の文字列を含むアクセス許可を検索する。

  • ユーザーなど、特定のリソースタイプに対するアクセス許可を検索する。

  • 特定のリソース(ユーザーmyadminユーザーリソースタイプなど)に適用される特定のリソースタイプのアクセス許可を検索する。

  • 特定のスコープを持つ特定のリソースタイプのアクセス許可(manageスコープを持つユーザーリソースタイプアクセス許可など)を検索する。

  • 特定のリソースに適用され、特定のスコープを持つ特定のリソースタイプのアクセス許可(ユーザーmyadminmanageスコープを持つユーザーリソースタイプアクセス許可など)を検索する。

きめ細かいアクセス許可検索

Fine grained permissions search

これらの機能により、サーバー管理者はアクセス許可の範囲に対してクエリを実行し、どのアクセス許可が1つ以上のレルムリソースとそのスコープへのアクセスを強制しているかを特定できます。 評価タブの評価ツールと組み合わせることで、レルム内のアクセス許可を管理するための重要な管理ツールが提供されます。 詳細については、アクセス許可の評価を参照してください。

ポリシーの管理

ポリシータブでは、管理者がレルムリソースに対する操作を実行しようとしている管理者にアクセス許可を付与する必要があるかどうかを判断するために、さまざまなアクセス制御方法を使用して条件を定義できます。 アクセス許可を管理する際には、レルムリソースへのアクセスを許可または拒否するために、少なくとも1つのポリシーを関連付ける必要があります。

ポリシーは基本的に、GRANTまたはDENYのいずれかに評価される条件です。 その結果によって、アクセス許可を付与するか拒否するかが決定されます。

アクセス許可は、関連するすべてのポリシーがGRANTと評価された場合にのみ付与されます。 それ以外の場合、アクセス許可は拒否され、レルム管理者は保護されたリソースにアクセスできなくなります。

Keycloakは、選択できる組み込みポリシーのセットを提供します。

Selecting a policy type

レルムに対して明確に定義された安定したアクセス許可モデルが確立されると、ポリシーを作成する必要性は少なくなります。 代わりに、既存のポリシーを再利用して、より多くのアクセス許可を作成できます。

各ポリシータイプの詳細については、ポリシーの管理を参照してください。

アクセス許可の評価

評価タブは、管理者がアクセス許可が期待どおりにアクセスを強制していることを検証できるテスト環境を提供します。 管理者は、特定のリソースへのアクセスを強制する際にどのようなアクセス許可が関与しているか、および結果がどうなるかを確認できます。

評価を実行するには、一連のフィールドを指定する必要があります。

  • ユーザー: リソースにアクセスしようとしているレルム管理者またはサブジェクト。

  • リソースタイプ: 評価するリソースタイプ。

  • リソースセレクター: 選択したリソースタイプに応じて、ユーザー、グループ、クライアントなどの特定レルムリソースを選択するように求められます。

  • Authorization scope(認可スコープ)、評価したいスコープまたは操作です。指定しない場合、選択したリソースタイプのすべてのスコープに対して評価が実行されます。

きめ細かいパーミッション評価タブ

Fine grained permissions evaluation tab

Evaluate(評価)ボタンをクリックすると、選択したUser(ユーザー)が管理コンソールまたはAdmin APIを使用している場合と同様に、選択したリソースとスコープに関連付けられたすべてのパーミッションがサーバーによって評価されます。

たとえば、上記の例では、ユーザーmyadminがユーザーuser-1manage(管理)できることがわかります。これは、Allow managing all realm users(すべてのレルムユーザーの管理を許可)パーミッションがPERMIT(許可)と判定され、manage(管理)スコープへのアクセスが許可されたためです。ただし、他のすべてのスコープは拒否されました。

Permissions(パーミッション)タブの検索機能と組み合わせることで、期待どおりに動作しないパーミッションを特定するためのトラブルシューティングを実行できます。

パーミッションを評価する際には、次のルールが適用されます。

  • リソース固有のパーミッションからの結果は、特定タイプのリソースすべてへのアクセスを許可する、より広範なパーミッションよりも優先されます。

  • 特定のリソースに対するパーミッションが存在しない場合、特定タイプのリソースすべてへのアクセスを許可するパーミッションに基づいてアクセスが許可されます。

  • 特定のリソースへのアクセスを強制する異なるパーミッションからの結果は、それらすべてがリソースへのアクセスを許可する場合にのみアクセスを許可します。

パーミッションの競合の解決

パーミッションには、複数のポリシーを関連付けることができます。認可モデルが進化するにつれて、1つのパーミッション内、または特定のリソースに関連する異なるパーミッション間でポリシーが競合することがよくあります。

いずれかのパーミッションが「DENY」(拒否)と評価された場合、評価結果は「denied」(拒否)になります。同じリソースに関連する複数のパーミッションがある場合、結果が「granted」(許可)になるためには、それらのすべてがアクセスを許可する必要があります。

きめ細かい管理者パーミッションを使用すると、個々のリソースまたはリソースタイプ自体(すべてのユーザー、すべてのグループなど)に対するパーミッションを設定できます。特定のリソースに関連するパーミッションが1つ以上存在する場合、「all-resource」(全リソース)パーミッションは評価中に考慮されません。特定のリソースに対するパーミッションが存在しない場合、フォールバックは「all-resource」(全リソース)パーミッションになります。このアプローチは、realm-admins(レルム管理者)グループのメンバーがレルムグループのメンバーを管理できるようにする一方で、realm-admins(レルム管理者)グループ自体のメンバーを管理できないようにするなどのシナリオに対処するのに役立ちます。

レルム管理者としてレルム管理コンソールにアクセスする

レルム管理者は、割り当てられたレルム内のリソースを管理できる専用のレルム固有の管理コンソールにアクセスできます。このコンソールは、サーバー管理者によって一般的に使用されるメインのKeycloak管理コンソールとは別です。

専用レルム管理コンソールと利用可能なロールの詳細については、「専用管理コンソール」を参照してください。

管理コンソールにアクセスするには、レルム管理者は、管理する必要があるリソースに応じて、次のロールの少なくとも1つが割り当てられている必要があります。

  • query-users – レルムユーザーのクエリに必要です。

  • query-groups – レルムグループのクエリに必要です。

  • query-clients – レルムクライアントのクエリに必要です。

これらのロールのいずれかをレルムユーザーに付与すると、管理コンソールにアクセスできるようになりますが、付与されたロールに対応する領域のみに限定されます。たとえば、query-usersロールを割り当てると、レルム管理者は管理コンソール内のUsers(ユーザー)セクションのみにアクセスできるようになります。管理者が複数のリソースタイプ(ユーザーとグループの両方など)を担当している場合は、対応するすべての「query-*」ロールを割り当てる必要があります。

これらのロールは、リソースをクエリするための基本的なアクセスを有効にしますが、それらを表示または変更するパーミッションは付与しません。レルムリソースへのアクセスを許可または拒否するには、各リソースタイプから利用可能な任意の操作に対するパーミッションを設定する必要があります。詳細については、「パーミッションの管理」を参照してください。

ロールとパーミッションの関係

きめ細かいパーミッションは、追加のパーミッションを付与するために使用されます。組み込みの管理者ロールのデフォルトの動作をオーバーライドすることはできません。レルム管理者に1つ以上の管理者ロールが割り当てられている場合、パーミッションの評価は実行されません。これは、対応する管理者ロールがレルム管理者に割り当てられている場合、パーミッション評価がバイパスされ、アクセスが許可されることを意味します。

管理者ロール 説明

query-users (ユーザー照会)

レルム管理者は、管理コンソールでUsers(ユーザー)セクションを表示し、レルム内のユーザーを検索できます。ユーザーをview(表示)する機能は付与されません。

query-groups (グループ照会)

レルム管理者は、管理コンソールでGroups(グループ)セクションを表示し、レルム内のグループを検索できます。グループをview(表示)する機能は付与されません。

query-clients (クライアント照会)

レルム管理者は、管理コンソールでClients(クライアント)セクションを表示し、レルム内のクライアントを検索できます。クライアントをview(表示)する機能は付与されません。

view-users (ユーザー表示)

レルム管理者は、レルム内のすべてのユーザーとグループをview(表示)できます。

manage-users (ユーザー管理)

レルム管理者は、レルム内のすべてのユーザーをview(表示)、map-roles(ロールをマッピング)、manage-group-membership(グループメンバーシップを管理)、およびmanage(管理)できます。また、レルム内のグループをview(表示)、manage-membership(メンバーシップを管理)、およびmanage(管理)できます。

impersonation (なりすまし)

レルム管理者は、レルム内のすべてのユーザーをimpersonate(偽装)できます。

view-clients (クライアント表示)

レルム管理者は、レルム内のすべてのクライアントをview(表示)できます。

manage-clients (クライアント管理)

レルム管理者は、レルム内のすべてのクライアントとクライアントスコープをview(表示)およびmanage(管理)できます。

一般的なユースケースの理解

管理者のグループに、管理者グループに属するユーザーを除く、レルム内のすべてのユーザーを管理することを許可したい状況を考えてみましょう。この例には、testレルムとtest-adminsグループが含まれています。

管理者のグループによるユーザーの管理を許可する

test-adminsグループのメンバーに対して、レルム内のすべてのユーザーの表示と管理を許可するユーザーパーミッションを作成します。

  • 管理コンソールでPermissions(パーミッション)タブに移動します。

  • Create permission(パーミッションの作成)をクリックし、Users(ユーザー)リソースタイプを選択します。

  • Disallow managing test-admins(test-adminsの管理を拒否)など、名前を入力します。

  • view(表示)およびmanage(管理)認可スコープを選択し、All Users(すべてのユーザー)をチェックしたままにします。

  • Create new policy(新しいポリシーの作成)をクリックして、アクセス権を取得するために満たす必要のある条件を作成します。

  • 名前Allow test-admins(test-adminsを許可)を入力し、Policy type(ポリシータイプ)としてGroup(グループ)を選択します。

  • Add groups(グループの追加)ボタンをクリックし、test-adminsグループを選択して、Save(保存)をクリックします。

  • Create permission(パーミッションの作成)ページでSave(保存)をクリックします。

管理者グループによるユーザーの管理を許可するが、グループメンバーは許可しない

グループ自体のメンバーを除外して、test-adminsが他の管理者を管理できないようにしましょう。

  • Create permission(パーミッションの作成)をクリックして、新しいパーミッションを作成します。

  • 今回は、Groups(グループ)リソースタイプを選択します。

  • Disallow managing test-admins(test-adminsの管理を拒否)など、名前を入力します。

  • manage-members(メンバーの管理)認可スコープを選択します。

  • Specific Groups(特定のグループ)を選択し、test-adminsグループを選択します。

  • タイプGroup(グループ)のCreate new policy(新しいポリシーの作成)を行います。

  • 名前Disallow test-admins(test-adminsを拒否)を入力し、test-adminsグループを選択します。

  • ポリシーのNegative Logic(否定ロジック)に切り替え、ポリシーをSave(保存)します。

  • パーミッションをSave(保存)します。

特定のロールが割り当てられたグループのメンバーに対してユーザーの偽装を許可する
  • 偽装を許可する特定のユーザー(またはすべてのユーザー)の「User Permission」(ユーザーパーミッション)を作成します。

  • test-adminsのメンバーへのアクセスを許可する「Group Policy」(グループポリシー)を作成します。

  • impersonation-adminロールが割り当てられたユーザーへのアクセスを許可する「Role Policy」(ロールポリシー)を作成します。

  • 両方のポリシーをパーミッションに割り当てます。

特定のユーザーを偽装対象からブラックリストに登録する
  • 偽装を防止する特定のユーザーのUser Permission(ユーザーパーミッション)を作成します。

  • (ユーザーが選択されていないユーザーポリシーなど)拒否と評価される任意のポリシーを作成します。

  • 選択したユーザーの偽装を効果的にブロックするために、ポリシーをパーミッションに割り当てます。

定義されたロールが割り当てられた管理者に対してユーザーの表示を許可するが、管理は許可しない
  • すべてのユーザーに対してview(表示)スコープを持つ「User Permission」(ユーザーパーミッション)を作成します。

  • 特定のロールが割り当てられたユーザーへのアクセスを許可する「Role Policy」(ロールポリシー)を作成します。

  • ユーザーの詳細の変更を防止するために、manage(管理)スコープを割り当てないでください

グループのメンバーに対してユーザーとロールの割り当てを管理することを許可する
  • すべてのユーザーに対してmanage(管理)、map-roles(ロールをマッピング)スコープを持つ「User Permission」(ユーザーパーミッション)を作成します。

  • test-adminsのメンバーへのアクセスを許可する「Group Policy」(グループポリシー)を作成します。

グループのメンバーを表示および管理することを許可するが、そのサブグループのメンバーは許可しない
  • 特定のグループmygroupに対してview-members(メンバーの表示)およびmanage-members(メンバーの管理)スコープを持つ「Group Permission」(グループパーミッション)を作成します。

  • test-adminsを対象とする「Group Policy」(グループポリシー)を割り当てます。

  • 別の「Group Permission」(グループパーミッション)を、view-members(メンバーの表示)およびmanage-members(メンバーの管理)スコープで作成し、mygroupのすべてのサブグループを選択します。

  • test-adminsの否定的な「Group Policy」(グループポリシー)を作成し、「subgroups」(サブグループ)パーミッションに割り当てます。

特定のグループのメンバーの偽装を許可する
  • 特定のグループmygroupに対してimpersonate-members(メンバーの偽装)を持つ「Group Permission」(グループパーミッション)を作成します。

  • mygroup-helpdeskを対象とする「Group Policy」(グループポリシー)を割り当てます。

パフォーマンスに関する考慮事項

レルムに対して機能を有効にすると、レルム管理者がサポートされているリソースタイプのいずれかを管理するときに、追加のオーバーヘッドが発生します。これは、主に次の操作を実行する場合に当てはまります。

  • リスト表示と検索

  • 更新または削除

この機能では、定義したパーミッションに基づいてアクセスを強制するために、レルムリソースをリスト表示または管理するたびに、追加のチェックが導入されます。これは主にレルムリソースをクエリするときに当てはまります。これは、レルム管理者のパーミッションを部分的に評価して結果をフィルタリングおよびページネーションするための追加のオーバーヘッドが発生するためです。

レルム管理者ユーザーを参照するパーミッションと、アクセスできるほとんどのリソースが少ない方が優れています。たとえば、レルム管理者にユーザーを管理するアクセス権を委任する場合は、それらのユーザーをグループのメンバーにすることをお勧めします。そうすることで、パーミッションを評価する際のパフォーマンスが向上するだけでなく、管理しやすいパーミッションモデルを作成することもできます。

アクセス強制の主な影響は、レルムリソースをクエリするときです。レルム管理者が、たとえば、ユーザー、ロール、またはグループポリシーを通じて数千のパーミッションで参照されている場合、レルムリソースをクエリするときに発生する部分評価メカニズムは、データベースからそれらのすべてのパーミッションをクエリします。より簡潔で最適化されたモデルは、より少ないパーミッションをフェッチするのに役立ちますが、レルムリソースへのアクセスを許可または拒否するのに十分です。

たとえば、レルム管理者へのレルム内のユーザーの表示と管理のアクセス許可を付与する場合は、レルム内の個々のユーザーごとに個別のパーミッションを作成するよりも、グループパーミッションを使用する方が適切です。同様に、直接参照(ユーザーポリシー)または間接参照(ロールまたはグループポリシー)のいずれかでレルム管理者を参照するパーミッションに関連付けられたポリシーが、リソースタイプに関係なく、複数(数千)のパーミッションにまたがらないようにしてください。

例として、レルムに3人のユーザーがいて、レルム管理者のbobにそれらをview(表示)およびmanage(管理)することを許可したいとします。最適でないパーミッションモデルでは、ユーザーごとに3つの異なるパーミッションが作成され、ユーザーポリシーがbobへのアクセスを許可します。代わりに、同じユーザーポリシーを使用してbobへのアクセスを許可しながら、それらの3人のユーザーをグループ化する単一のグループパーミッション、または単一のユーザーパーミッションを持つことができます。

同じことは、それらの3人のユーザーへのアクセス権をより多くのレルム管理者に付与する場合にも当てはまります。個別のポリシーを作成する代わりに、グループまたはロールポリシーを使用することを検討できます。パーミッションモデルはユースケースに固有のものですが、これらの推奨事項は、管理性を向上させるだけでなく、レルムリソースを管理する際のサーバーの全体的なパフォーマンスを向上させるためにも重要です。

サーバー構成の観点から、レルムのサイズと、持つパーミッションとポリシーの数に応じて、次のキャッシュのサイズを大きくするためにキャッシュ構成の変更を検討する場合があります。

  • レルム

  • ユーザー

  • 認可

デプロイメントのサイズを決定する際に最適な値を見つけるために、これらのキャッシュのサーバーメトリクスを確認することを検討してください。

リソースをフィルタリングする場合、部分評価メカニズムは最終的にSQLステートメントのIN句に依存して結果をフィルタリングします。データベースによっては、IN句のパラメーター数に制限がある場合があります。これは、Oracleデータベースの古いバージョンに当てはまり、1000パラメーターのハードリミットがあります。このような問題を回避するには、単一のレルム管理者にアクセスを許可または拒否するパーミッションの数に関する上記の考慮事項に留意してください。

きめ細かい管理者パーミッションV1

きめ細かい管理者パーミッションV1は、新しいバージョンに置き換えられました。機能のバージョン1はまだプレビューとしてマークされており、利用可能ですが、将来的に非推奨となり、削除される可能性があります。有効にするには、--features=admin-fine-grained-authz:v1を指定してサーバーを起動します。

manage-realm(レルムの管理)やmanage-users(ユーザーの管理)などのロールは粒度が粗すぎる場合があり、よりきめ細かいパーミッションを持つ制限付き管理者アカウントを作成したい場合があります。Keycloakでは、レルムを管理するための制限付きアクセス ポリシーを定義および割り当てることができます。たとえば、次のようなものです。

  • 特定のクライアントの管理

  • 特定のグループに属するユーザーの管理

  • グループのメンバーシップの管理

  • 制限付きユーザー管理。

  • きめ細かい偽装制御

  • 特定の制限付きロールセットをユーザーに割り当てることができる。

  • 特定の制限付きロールセットをコンポジットロールに割り当てることができる。

  • 特定の制限付きロールセットをクライアントのスコープに割り当てることができる。

  • ユーザー、グループ、ロール、およびクライアントを表示および管理するための新しい一般的なポリシー。

きめ細かい管理者パーミッションについて注意すべき重要な点がいくつかあります。

  • きめ細かい管理者パーミッションは、Authorization Services(認可サービス)の上に実装されています。きめ細かいパーミッションを詳しく調べる前に、これらの機能についてお読みになることを強くお勧めします。

  • きめ細かいパーミッションは、専用管理コンソールと、それらのレルム内で定義された管理者内でのみ使用できます。クロスレルムのきめ細かいパーミッションを定義することはできません。

  • きめ細かいパーミッションは、追加のパーミッションを付与するために使用されます。組み込みの管理者ロールのデフォルトの動作をオーバーライドすることはできません。

特定のクライアントを1つ管理する

まず、管理者が1つのクライアントのみを管理できるようにする方法を見てみましょう。この例では、testというレルムと、sales-applicationというクライアントがあります。レルムtestでは、そのレルムのユーザーにそのアプリケーションのみを管理するパーミッションを付与します。

クロスレルムのきめ細かいパーミッションは実行できません。masterレルムの管理者は、前の章で定義された事前定義済みの管理者ロールに制限されます。
パーミッション設定

最初に行うべきことは、Admin Consoleにログインして、クライアントのパーミッションを設定することです。パーミッションを詳細に定義したいクライアントの管理セクションに移動します。

クライアント管理

Fine grain client

Permissionsというタブメニュー項目が表示されるはずです。そのタブをクリックしてください。

クライアントパーミッションタブ

Fine grain client permissions tab

デフォルトでは、各クライアントは詳細なパーミッションを実行するように有効になっていません。したがって、Permissions Enabledスイッチをオンにして、パーミッションを初期化してください。

Permissions Enabledスイッチをオフにすると、このクライアントに定義したすべてのパーミッションが削除されます。
クライアントパーミッションタブ

Fine grain permission tab

Permissions Enabledをオンに切り替えると、Authorization Servicesを使用して、さまざまなパーミッションオブジェクトがバックグラウンドで初期化されます。この例では、クライアントのmanageパーミッションに関心があります。それをクリックすると、クライアントのmanageパーミッションを処理するパーミッションにリダイレクトされます。すべての認可オブジェクトは、realm-managementクライアントのAuthorizationタブに含まれています。

クライアント管理パーミッション

Fine grain client manage permission

最初に初期化されたとき、manageパーミッションにはポリシーが関連付けられていません。ポリシーを作成するには、ポリシーのタブに移動する必要があります。そこにすばやく移動するには、上記の画像に示されているClient detailsリンクをクリックします。次に、ポリシーのタブをクリックします。

このページで、Create client policyボタンを探してください。これを使用して、多くのポリシーを定義できます。ロールまたはグループに関連付けられたポリシーを定義したり、JavaScriptでルールを定義したりすることもできます。この簡単な例では、User Policyを作成します。

ユーザーポリシー

Fine grain client user policy

このポリシーは、ユーザーデータベース内のハードコードされたユーザーと一致します。この場合、それはsales-adminユーザーです。次に、sales-applicationクライアントのmanageパーミッションページに戻り、ポリシーをパーミッションオブジェクトに割り当てる必要があります。

ユーザーポリシーの割り当て

Fine grain client assign user policy

これで、sales-adminユーザーはsales-applicationクライアントを管理するパーミッションを持ちます。

もう一つ行うべきことがあります。Usersに移動し、sales-adminユーザーを選択し、Role Mappingsタブに移動して、query-clientsロールをユーザーに割り当てます。

query-clientsの割り当て

Fine grain assign query clients

なぜこれを行う必要があるのでしょうか?このロールは、sales-adminがAdmin Consoleにアクセスしたときにレンダリングするメニュー項目をAdmin Consoleに指示します。query-clientsロールは、Admin Consoleにsales-adminユーザーのクライアントメニューをレンダリングするように指示します。

重要: query-clientsロールを設定しない場合、sales-adminのような制限された管理者は、Admin Consoleにログインしてもメニューオプションが表示されません。

テスト

次に、マスターレルムからログアウトし、sales-adminをユーザー名として使用して、testレルムの専用Admin Consoleに再ログインします。これは/admin/test/consoleにあります。

Sales adminログイン

Fine grain sales admin login

この管理者は、この1つのクライアントを管理できるようになりました。

ユーザーロールマッピングの制限

もう一つ行いたいことは、管理者がユーザーに割り当てることを許可されているロールのセットを制限することです。前の例を続けて、'sales-admin'ユーザーのパーミッションセットを拡張して、このアプリケーションへのアクセスを許可されているユーザーを制御できるようにします。詳細なパーミッションを通じて、sales-adminsales-applicationへの特定のアクセスを許可するロールのみを割り当てることができるようにすることができます。また、管理者がロールのマッピングのみを実行し、他のタイプのユーザー管理を実行できないように制限することもできます。

sales-applicationは、3つの異なるクライアントロールを定義しています。

Sales applicationロール

Fine grain sales application roles

sales-adminユーザーがこれらのロールをシステム内の任意のユーザーにマッピングできるようにしたいと考えています。これを行うための最初のステップは、ロールが管理者によってマッピングされることを許可することです。viewLeadsロールをクリックすると、このロールにPermissionsタブがあることがわかります。

View leadsロールパーミッションタブ

Fine grain view leads role

そのタブをクリックしてPermissions Enabledをオンにすると、ポリシーを適用できるアクションが多数あることがわかります。

View leadsパーミッション

Fine grain view leads permissions

関心のあるものはmap-roleです。このパーミッションをクリックして、前の例で作成したのと同じユーザーポリシーを追加します。

ロールマッピングパーミッション

Fine grain map roles permission

私たちが行ったことは、sales-adminviewLeadsロールをマッピングできると言うことです。私たちが行っていないことは、管理者がこのロールをマッピングすることを許可されているユーザーを指定することです。それを行うには、このレルムのAdmin ConsoleのUsersセクションに移動する必要があります。左側のメニュー項目Usersをクリックすると、レルムのユーザーインターフェイスが表示されます。Permissionsタブが表示されるはずです。それをクリックして有効にします。

ユーザーパーミッション

Fine grain user permissions

関心のあるパーミッションはmap-rolesです。これは、管理者にユーザーへのロールのマッピング機能のみを許可するという制限的なポリシーです。map-rolesパーミッションをクリックして、ここで作成したユーザーポリシーを再度追加すると、sales-adminは任意のユーザーにロールをマッピングできるようになります。

最後に行う必要があることは、view-usersロールをsales-adminに追加することです。これにより、管理者はsales-applicationロールを追加したいレルム内のユーザーを表示できるようになります。

view-usersの追加

Fine grain add view users

テスト

次に、マスターレルムからログアウトし、sales-adminをユーザー名として使用して、testレルムの専用Admin Consoleに再ログインします。これは/admin/test/consoleにあります。

これで、sales-adminがシステム内のユーザーを表示できるようになることがわかります。ユーザーの1人を選択すると、各ユーザーの詳細ページは読み取り専用になりますが、Role Mappingsタブは除きます。このタブに移動すると、sales-applicationロールを参照する場合を除き、管理者がユーザーにマッピングできるAvailableロールがないことがわかります。

viewLeadsの割り当て

Fine grain add view leads

sales-adminviewLeadsロールをマッピングできることのみを指定しました。

クライアントごとのロールマッピングショートカット

sales-applicationが公開したすべてのクライアントロールに対してこれを行う必要がある場合、退屈になります。物事を簡単にするために、管理者がクライアントによって定義された任意のロールをマッピングできることを指定する方法があります。Admin Consoleにマスターレルム管理者として再度ログインし、sales-applicationパーミッションページに戻ると、map-rolesパーミッションが表示されます。

クライアントロールマッピングパーミッション

Fine grain client permissions

この特定のパーミッションへのアクセスを管理者に許可すると、その管理者はクライアントによって定義された任意のロールをマッピングできるようになります。

パーミッションの完全なリスト

特定のクライアントまたはクライアントの特定のロールを管理するだけでなく、詳細なパーミッションでさらに多くのことができます。この章では、レルムに対して記述できるパーミッションタイプの完全なリストを定義します。

ロール

特定のロールのPermissionsタブに移動すると、これらのパーミッションタイプがリスト表示されます。

map-role

管理者がこのロールをユーザーにマッピングできるかどうかを決定するポリシー。これらのポリシーは、ロールをユーザーにマッピングできることのみを指定し、管理者がユーザーロールマッピングタスクを実行することを許可されているわけではありません。管理者は、管理またはロールマッピングパーミッションも持っている必要があります。詳細については、「ユーザーパーミッション」を参照してください。

map-role-composite

管理者がこのロールを別のロールへのコンポジットとしてマッピングできるかどうかを決定するポリシー。管理者は、クライアントのパーミッションを管理する必要がある場合にクライアントのロールを定義できますが、コンポジットとして追加するロールのmap-role-composite特権がない限り、それらのロールにコンポジットを追加することはできません。

map-role-client-scope

管理者がこのロールをクライアントのスコープに適用できるかどうかを決定するポリシー。管理者がクライアントを管理できる場合でも、この特権が付与されない限り、このロールを含むクライアントのトークンを作成するパーミッションはありません。

クライアント

特定のクライアントのPermissionsタブに移動すると、これらのパーミッションタイプがリスト表示されます。

view

管理者がクライアントの設定を表示できるかどうかを決定するポリシー。

manage

管理者がクライアントの設定を表示および管理できるかどうかを決定するポリシー。特権が意図せずにリークされる可能性があるという点で、これにはいくつかの問題があります。たとえば、管理者は、ロールをクライアントのスコープにマッピングする特権を持っていなくても、ロールをハードコードしたプロトコルマッパーを定義する可能性があります。これは現在、プロトコルマッパーの制限であり、ロールのように個々のパーミッションを割り当てる方法がありません。

設定

クライアントを管理するための特権の削減セット。これは、manageスコープに似ていますが、管理者はプロトコルマッパーを定義したり、クライアントテンプレートやクライアントのスコープを変更したりすることは許可されていません。

map-roles

管理者がクライアントによって定義された任意のロールをユーザーにマッピングできるかどうかを決定するポリシー。これは、クライアントによって定義されたすべてのロールに対してポリシーを定義する必要がないようにするためのショートカットであり、使いやすい機能です。

map-roles-composite

管理者がクライアントによって定義された任意のロールを別のロールへのコンポジットとしてマッピングできるかどうかを決定するポリシー。これは、クライアントによって定義されたすべてのロールに対してポリシーを定義する必要がないようにするためのショートカットであり、使いやすい機能です。

map-roles-client-scope

管理者がクライアントによって定義された任意のロールを別のクライアントのスコープにマッピングできるかどうかを決定するポリシー。これは、クライアントによって定義されたすべてのロールに対してポリシーを定義する必要がないようにするためのショートカットであり、使いやすい機能です。

ユーザー

すべてのユーザーのPermissionsタブに移動すると、これらのパーミッションタイプがリスト表示されます。

view

管理者がレルム内のすべてのユーザーを表示できるかどうかを決定するポリシー。

manage

管理者がレルム内のすべてのユーザーを管理できるかどうかを決定するポリシー。このパーミッションは、管理者にユーザーロールマッピングを実行する特権を付与しますが、管理者がマッピングを許可されているロールを指定するものではありません。管理者がマッピングできるようにする各ロールの特権を定義する必要があります。

map-roles

これは、manageスコープによって付与される特権のサブセットです。この場合、管理者はロールのマッピングのみを許可されています。管理者は、他のユーザー管理操作を実行することは許可されていません。また、manageと同様に、管理者が適用することを許可されているロールは、クライアントロールを扱う場合は、ロールごとまたはロールセットごとに指定する必要があります。

manage-group-membership

map-rolesと同様ですが、グループメンバーシップに関連しています。ユーザーを追加または削除できるグループです。これらのポリシーは、管理者にグループメンバーシップを管理するパーミッションを付与するだけであり、管理者がメンバーシップを管理することを許可されているグループを指定するものではありません。各グループのmanage-membersパーミッションのポリシーを指定する必要があります。

impersonate

管理者が他のユーザーを偽装することを許可されているかどうかを決定するポリシー。これらのポリシーは、管理者の属性とロールマッピングに適用されます。

ユーザー偽装

偽装できるユーザーを決定するポリシー。これらのポリシーは、偽装されているユーザーに適用されます。たとえば、管理者特権を持つユーザーを誰も偽装することを禁止するポリシーを定義することができます。

グループ

特定のグループのPermissionsタブに移動すると、これらのパーミッションタイプがリスト表示されます。

view

管理者がグループに関する情報を表示できるかどうかを決定するポリシー。

manage

管理者がグループの設定を管理できるかどうかを決定するポリシー。

view-members

管理者がグループのメンバーのユーザー詳細を表示できるかどうかを決定するポリシー。

manage-members

管理者がこのグループに所属するユーザーを管理できるかどうかを決定するポリシー。

manage-membership

管理者がグループのメンバーシップを変更できるかどうかを決定するポリシー。グループのメンバーを追加または削除します。

組織の管理

顧客やビジネスパートナーなどのサードパーティと統合する場合、他のユーザーとは別にIDを管理し、レルムと対話するときにビジネスエコシステム全体で統一された安全なエクスペリエンスを構築したい場合があります。

レルムでは、組織はこれらのサードパーティを表します。これにより、レルムまたは組織の管理者は、組織ごとに、メンバーのライフサイクル全体と、レルムに対する認証および認可の方法を管理できます。

組織は、KeycloakのIAM機能の使用を開始して、企業間取引(B2B)ユースケースにも対応するためのエントリポイントです。レルム内でのマルチテナンシーを可能にするため、ユーザーはレルムから保護されたリソースにアクセスできますが、より制限され制御されたコンテキスト(所属する組織)を使用します。

Keycloak Organizationsは、Keycloakでの組織のサポートを可能にする機能です。現時点では、次のような組織の管理に必要なコア機能の一部を提供します。

  • メンバーの管理

  • 招待リンクを使用した組織メンバーのオンボーディング

  • アイデンティティブローカリングによるIDフェデレーションによる組織メンバーのオンボーディング

  • 組織のスコープで認証する際のIDファーストログインと組織固有のステップ

  • 認可目的でトークンを介して組織固有のクレームをアプリケーションに伝播

Keycloakで組織を有効にする

組織を使用するには、現在のレルムで機能を有効にする必要があります。

手順
  1. メニューのレルム設定をクリックします。

  2. OrganizationsOnに切り替えます。

  3. 保存をクリックします。

組織の有効化

Enabling Organizations

機能が有効になると、メニューから利用できるOrganizationsセクションを通じて組織を管理できるようになります。

組織の管理

組織セクションから、レルム内のすべての組織を管理できます。

組織の管理

Managing organizations

組織の作成

手順
  1. 組織の作成をクリックします。

組織の作成

Creating organization

組織には以下の設定があります。

名前

組織のわかりやすい名前。レルム内で一意である必要があります。

エイリアス

この組織のエイリアス。組織を内部的に参照するために使用されます。エイリアスはレルム内で一意であり、URLフレンドリーである必要があります。そのため、通常URLで使用できない文字はエイリアスには使用できません。設定しない場合、Keycloakは名前をエイリアスとして使用しようとします。名前がURLフレンドリーでない場合は、エラーが発生し、エイリアスを指定するように求められます。エイリアスを定義すると、後で変更することはできません。

リダイレクトURL

登録を完了するか、メールで送信された組織への招待を承諾すると、ユーザーは指定されたリダイレクトURLに自動的にリダイレクトされます。空のままにすると、ユーザーはデフォルトでアカウントコンソールにリダイレクトされます。

ドメイン

この組織に属する1つ以上のドメインのセット。ドメインは、レルム内の異なる組織間で共有できません。

説明

組織を説明するためのフリーテキストフィールド。

組織を作成すると、以下のセクションで説明されている追加設定を管理できます。

組織ドメインについて

組織を管理する場合、組織に関連付けられたドメインは、組織メンバーがレルムに対して認証する方法と、そのプロファイルが検証される方法において重要な役割を果たします。

ドメインの重要な役割の1つは、ユーザーがメンバーである組織を特定するのに役立つことです。メールアドレスを見ると、Keycloakは同じドメインを使用して対応する組織を照合し、最終的に組織の要件に基づいて認証フローを変更します。

ドメインを使用すると、組織は、ユーザーが組織に関連付けられたドメイン以外のドメインをメールで使用することを許可しないように強制することもできます。この制限は、ユーザーとそのIDが組織に関連付けられたアイデンティティプロバイダーからフェデレーションされ、メールアドレスに特定のメールドメインを強制したい場合に特に役立ちます。

組織の無効化

組織を無効にするには、有効オフに切り替えます。

組織の無効化

Disabling organization

組織が無効になっている場合でも、管理インターフェースを介して管理できますが、組織メンバーは、組織に関連付けられたアイデンティティプロバイダーを介した認証を含め、レルムに対して認証できません。アイデンティティプロバイダーも自動的に無効になるためです。

ただし、組織の非管理メンバーはレルムユーザーでもあるため、レルムに対して認証できますが、トークンには無効になっている組織との関係に関するメタデータは保持されません。

管理対象および非管理対象ユーザーの詳細については、「管理対象および非管理対象メンバー」セクションを参照してください。

組織の削除

組織を削除するには、リストページまたは組織の編集時に、対応する組織の削除アクションをクリックします。

組織の削除

Deleting organization

組織を削除すると、関連付けられたすべてのデータが削除されます。これには、管理対象メンバーも含まれます。

非管理対象ユーザーとアイデンティティプロバイダーはレルムに残りますが、組織にはリンクされなくなります。

管理対象および非管理対象ユーザーの詳細については、「管理対象および非管理対象メンバー」を参照してください。

属性の管理

管理者は、属性を使用して組織に関する追加のメタデータを保存できます。組織属性は、複数の文字列値を保持できるキーと値のペアです。

そのためには、属性タブをクリックし、キーと値を指定して必要な属性を設定します。

同じ属性とキーに複数の値を指定するには、同じキーで別の値を持つ別の属性を追加するだけです。

組織属性の管理

Managing organization attributes

メンバーの管理

組織メンバーは基本的にレルムユーザーですが、単一の組織へのリンクがあります。組織に属するユーザーを正確に把握できるように、レルム内の他のユーザーとは論理的に分離されています。

組織にメンバーを追加またはオンボーディングするには、さまざまな方法があります。

  • 既存のレルムユーザーをメンバーとして追加する

  • 組織に関連付けられたアイデンティティプロバイダー経由

  • 新しいアカウントを作成するための招待状を送信する

  • 既存のユーザーを組織に参加させるための招待状を送信する

組織のメンバーになると、そのユーザーのアカウントは、メニューのユーザーセクションにアクセスして、レルム内の通常のアカウントと同様に管理できます。

ただし、組織を管理する際にメンバータブにアクセスすると、組織に関連付けられたユーザーのみにユーザーを絞り込むことができます。このタブには、すべての組織メンバーのリストと、新しいメンバーを追加したり、既存のメンバーを編集および削除したりするアクションがあります。

組織メンバーの管理

Managing organization members

管理対象および非管理対象メンバー

メンバーを管理する場合、組織との関係がアカウントのライフサイクルにどのように影響するかを考慮してください。メンバーはさまざまなフローを介して組織に参加でき、各フローはアカウントと組織間のリンクの強さを示します。

メンバーには2つのタイプがあります。

  • 管理対象

  • 非管理対象

管理対象メンバーは組織によって管理されるメンバーであり、組織の外部に存在することはできません。たとえば、組織に関連付けられたアイデンティティプロバイダーを介して作成されたアカウントを考えてみてください。そのアカウントは、組織からフェデレーションされたため、レルムに属していません。この場合、IDの唯一の信頼できるソースは組織であり、そのライフサイクルは組織によって制御されます。組織またはメンバーを削除すると、アカウントもレルムから削除されます。

一方、非管理対象メンバーは、組織なしで存在できるメンバーです。たとえば、既存のレルムユーザーを組織に追加する場合、アカウントはまず第一にレルムに属し、最終的に組織にリンクされます。この場合、組織またはメンバーを削除しても、レルムからアカウントは削除されません。レルムはIDの唯一の信頼できるソースです。

既存のレルムユーザーをメンバーとして追加する

既存のレルムユーザーは、リストからそのユーザーを選択し、ユーザーを組織に追加することで、組織に参加できます。

手順
  1. メンバーを追加をクリックします。

  2. レルムユーザーを追加をクリックします。

  3. 1人または複数のユーザーを選択し、追加をクリックして組織に追加します。

レルムユーザーの追加

Adding a realm user

ユーザーが組織のメンバーになると、そのユーザーは通常ユーザーと同様にレルムに対して認証でき、レルムでサポートされている任意の資格情報を使用できます。

ユーザーの招待

管理者は、ユーザーにメールを送信して組織に参加させることができます。

手順
  1. メンバーを追加をクリックします。

  2. メンバーを招待をクリックします。

  3. メールアドレスを入力します

  4. 送信をクリックします

メンバーの招待

Inviting members

オプションで、フィールドとフィールドに値を指定して、メールを受信する人の名と姓を使用した挨拶メッセージを使用して、よりパーソナライズされたメールメッセージを提供することもできます。

招待状は基本的に、組織に参加するために必要な手順を実行するためにクリックする必要があるリンクが記載されたメールです。これらの手順は、その人がレルムにアカウントを既に持っているか、組織に参加する前に新しいアカウントを作成する必要があるかによって異なります。

メールがレルム内の既存のユーザーにマップされている場合、ユーザーが従う手順は基本的に、組織に参加する意思を確認することです。

一方、指定されたメールアドレスに関連付けられたユーザーがいない場合、手順にはレルムの自己登録フローを介して新しいアカウントを作成することが含まれます。この場合、ユーザーは招待状の送信に使用したのと同じメールアドレスを指定する必要があります。

アイデンティティプロバイダーを使用したメンバーのオンボーディング

組織は、IDの唯一の信頼できるソースとして独自のアイデンティティプロバイダーを持っている場合があります。この場合、アイデンティティプロバイダーからフェデレーションされたユーザーは、組織のメンバーとして自動的に追加されます。

ユーザーが組織に関連付けられたアイデンティティプロバイダーを介して組織に参加すると、自動的に管理対象メンバーとしてマークされます。この場合、レルムで構成されたブローカーログインフローを通過し、認証に成功するとすぐに組織に参加します。

アイデンティティプロバイダーを介した新しいメンバーのオンボーディングは、ユーザーを組織のアイデンティティプロバイダーに自動的にリダイレクトするか、ログインページでアイデンティティプロバイダーを選択することで実行できます。

どちらの場合も、ユーザーがメールアドレスを提供すると、Keycloakはメールドメインに基づいて組織を照合しようとします。メールドメインが組織と一致し、アイデンティティプロバイダーが同じドメインに関連付けられており、メールアドレスが一致する場合にリダイレクト設定が有効になっている場合、ユーザーはアイデンティティプロバイダーに自動的にリダイレクトされます。ユーザーがアイデンティティプロバイダーで認証し、最初のブローカーログインフローを完了すると、ユーザーは組織メンバーとして自動的に追加されます。

一方、メールアドレスが一致する場合にリダイレクトが有効になっていないが、アイデンティティプロバイダーがログインページで非表示に構成されていない場合、ユーザーはアイデンティティプロバイダーを選択してから、アイデンティティプロバイダーにリダイレクトされてオンボーディングプロセスを続行できます。

詳細については、「アイデンティティプロバイダーの管理」を参照してください。

メンバーの削除

組織からメンバーを削除できます。

削除するメンバーの横にあるアクションメニューから、削除をクリックします。

組織からメンバーを削除する場合、ユーザーが管理対象メンバーであるか非管理対象メンバーであるかに応じて、ユーザーがレルムから削除される場合と削除されない場合があることに注意してください。

詳細については、「管理対象および非管理対象メンバー」を参照してください。

フェデレーションメンバーのサポート

フェデレーションプロバイダーからのユーザーも組織のメンバーとして追加できます。唯一の例外は、インポートモードが無効になっているLDAPプロバイダーからのユーザーです。組織メンバーは、外部プロバイダーと同期されない内部グループに追加されるため、LDAPプロバイダーにモードがLDAP_ONLYのグループマッパーがある場合でも、インポートされていないユーザーを組織のメンバーとして追加することはできません。メンバーシップがLDAPサーバーと同期されないためです。

言い換えれば、インポートされていないLDAPユーザーは、メンバーシップがローカルDBにもLDAPサーバーにも保存されないため、組織に参加できません。したがって、LDAPユーザーに組織に参加させたい場合は、LDAPプロバイダーのインポートモードが有効になっていることを確認してください。

アイデンティティプロバイダーの管理

組織は、IDの唯一の信頼できるソースとして独自のアイデンティティプロバイダーを持っている場合があります。この場合、組織のアイデンティティプロバイダーを使用してユーザーを認証し、IDをフェデレーションし、最終的に組織のメンバーとして追加するように組織を構成する必要があります。

組織は、ユーザーをさまざまなソースから認証し、それぞれに異なる制約を適用できるように、1つまたは複数のアイデンティティプロバイダーを関連付けることができます。

組織にアイデンティティプロバイダーをリンクするには、まずメニューのIdentity Providers(アイデンティティプロバイダー)セクションからレルムレベルで組織を作成します。レルムで利用可能な組み込みのソーシャルおよびアイデンティティプロバイダーは、組織にリンクできます。

組織へのアイデンティティプロバイダーのリンク

アイデンティティプロバイダーは、Identity providers(アイデンティティプロバイダー)タブから組織にリンクできます。すでにアイデンティティプロバイダーが存在する場合は、それらのリストと、組織から検索、編集、またはリンク解除するためのオプションが表示されます。

組織のアイデンティティプロバイダー

Organization identity providers

手順
  1. Link identity provider(アイデンティティプロバイダーをリンク)をクリックします

  2. Identity provider(アイデンティティプロバイダー)を選択します

  3. 適切な設定を行います

  4. 保存をクリックします。

アイデンティティプロバイダーのリンク

Linking identity provider

アイデンティティプロバイダーには、次の設定があります。

アイデンティティプロバイダー

組織にリンクしたいアイデンティティプロバイダー。1つのアイデンティティプロバイダーは、単一の組織にのみリンクできます。

ドメイン

アイデンティティプロバイダーとリンクしたい組織のドメイン。

ログインページで非表示

ユーザーが組織のスコープ内で認証しているときに、このアイデンティティプロバイダーをログインページで非表示にするかどうか。

メールアドレスのドメインが一致した場合にリダイレクト

メンバーのメールアドレスのドメインが、アイデンティティプロバイダーに設定されたドメインと一致した場合に、自動的にアイデンティティプロバイダーにリダイレクトするかどうか。ドメインがAnyに設定されている場合、メールアドレスのドメインがいずれかの組織ドメインに一致するメンバーは、アイデンティティプロバイダーにリダイレクトされます。

組織が複数のアイデンティティプロバイダーにリンクされている場合、組織の認証機能は、自動リダイレクトのためにユーザーのメールアドレスのドメインに一致するプロバイダーを優先します。一致するものが見つからない場合は、Anyに設定されているプロバイダーを探します。

組織にリンクされると、アイデンティティプロバイダーは、メニューのIdentity Providers(アイデンティティプロバイダー)セクションにアクセスすることで、レルム内の他のプロバイダーと同様に管理できます。ただし、ここで説明するオプションは、組織のスコープ内でアイデンティティプロバイダーを管理する場合にのみ使用できます。唯一の例外は、Hide on login page(ログインページで非表示)オプションで、これは便宜上ここに存在します。

リンクされたアイデンティティプロバイダーの編集

リンクされたアイデンティティプロバイダーの組織関連の設定は、いつでも編集できます。

手順
  1. メニューでOrganizations(組織)をクリックし、Identity providers(アイデンティティプロバイダー)タブに移動します。

  2. リストでidentity provider(アイデンティティプロバイダー)を見つけます。

    このステップでは、検索オプションを使用できます。

  3. 行の末尾にあるアクションボタン(3つの点)をクリックします。

  4. Edit(編集)をクリックします。

  5. 必要な変更を加えます。

  6. 保存をクリックします。

リンクされたアイデンティティプロバイダーの編集

Editing linked identity provider

組織からのアイデンティティプロバイダーのリンク解除

アイデンティティプロバイダーが組織からリンク解除されると、組織に関連付けられなくなったレルムレベルのプロバイダーとして引き続き利用できます。リンク解除されたプロバイダーを削除するには、メニューのIdentity Providers(アイデンティティプロバイダー)セクションを使用します。

手順
  1. メニューでOrganizations(組織)をクリックし、Identity providers(アイデンティティプロバイダー)タブに移動します。

  2. リストでidentity provider(アイデンティティプロバイダー)を見つけます。

    このステップでは、検索機能を使用できます。

  3. 行の末尾にあるアクションボタン(3つの点)をクリックします。

  4. Unlink provider(プロバイダーのリンク解除)をクリックします。

アイデンティティプロバイダーのリンク解除

Unlinking identity provider

メンバーの認証

レルムで組織を有効にすると、ユーザー認証が変更されます。ユーザーが組織のコンテキスト内で認証していると認識されると、認証フローは組織ごとに変更されます。

レルムが作成されると、組織メンバーを認証およびオンボーディングするための特定の手順を有効にするために、認証フローが自動的に更新されます。更新される認証フローは次のとおりです。

  • browser (ブラウザ)

  • first broker login (初回ブローカーログイン)

browserフローの主な変更点は、デフォルトでID優先ログインになることです。これにより、ユーザーは資格情報の入力を求められる前に識別されます。初回ブローカーログインフローに関する主な変更点は、組織に関連付けられたアイデンティティプロバイダーを介して認証し、フローを正常に完了すると、ユーザーが組織メンバーとして自動的に追加されることです。

ID優先ログインを使用するかどうかの選択は、レルムに組織が存在するかどうかに依存します。組織が存在しない場合、ユーザーは通常の手順に従って、ユーザー名とパスワード、またはbrowserフローで構成されたその他の手順を使用して認証を行います。それ以外の場合、ユーザーはレルムへの認証を続行するために、最初にユーザー名またはメールアドレスを求められます。

ID優先ログインの主な目標は、ユーザーを識別することです。

  • ユーザーは既存ユーザーですか、それとも新規ユーザーですか?

  • ユーザーはレルム内の組織のメンバーですか?

  • 組織メンバーの場合、ユーザーは組織に関連付けられたアイデンティティプロバイダーにリンクされていますか?

ユーザーを識別する際の結果に応じて、認証フローは、ユーザーの資格情報を求めることによって認証を続行するか、または最終的にユーザーを自動的にリダイレクトして、アイデンティティプロバイダーを介して組織のセキュリティ境界内で認証するように変更されます。

ID優先ログインについて

ユーザー名が提供されたらユーザーを識別することに加えて、ID優先ログインは次の役割も担っています。

  • メールアドレスのドメインを組織に一致させること。

  • 提供されたユーザー名のアカウントがすでに存在する場合に、認証フローを続行するかどうかを決定すること

  • ドメインとアイデンティティプロバイダーが組織にどのように構成されているかに応じて、ユーザーをどのように認証するかを決定すること

  • メールアドレスのドメインがアイデンティティプロバイダーに設定されたドメインと一致する場合に、組織に関連付けられたアイデンティティプロバイダーを介してユーザーをシームレスに認証すること

ID優先ログインは、ユーザー名とパスワードフィールドを備えた通常のログインページが提供するのと同じ機能を提供します。ユーザーは、登録リンクをクリックするか、レルム内の組織にリンクされていないアイデンティティまたはソーシャルブローカーを選択することで、自己登録できます。

ID優先ログインページ

Identity-first login page

存在しないユーザーの場合、そのユーザーが組織ドメインに一致するメールアドレスのドメインを使用して認証しようとすると、ID優先ログインページが再度表示され、提供されたユーザー名が無効であるというメッセージが表示されます。この時点で、ユーザーに資格情報を求める必要はありません。

ユーザーが存在しない場合のID優先ログイン

Identity-first login error

ユーザーを登録して、そのユーザーがレルムに対して認証を行い、組織に参加できるようにするためのオプションがいくつかあります。

レルムで自己登録設定が有効になっている場合、ユーザーはID優先ログインページでRegister(登録)リンクをクリックして、レルムにアカウントを作成できます。その後、管理者はユーザーに招待リンクを送信するか、ユーザーを組織のメンバーとして手動で追加できます。詳細については、「メンバーの管理」を参照してください。

組織にドメインのないアイデンティティプロバイダーがあり、Hide on login page(ログインページで非表示)設定がOFFになっている場合、ユーザーはID優先ログインページでアイデンティティプロバイダーリンクをクリックして、アイデンティティプロバイダーを介して認証すると、自動的にアカウントを作成して組織に参加することもできます。詳細については、「アイデンティティプロバイダーの管理」を参照してください。

前のセクションと同様の状況で、組織は組織ドメインの1つで設定されたアイデンティティプロバイダーを持っている場合があります。この状況では、ユーザーのメールアドレスが組織の特定のドメインと一致する場合、ユーザーはアイデンティティプロバイダーにリダイレクトされます。フローが完了すると、アカウントが作成され、ユーザーは組織に参加します。

既存の認証フローの構成

新しいレルムについて前述したように、認証フローは、組織をサポートし、そのメンバーを認証するために必要な手順で自動的に更新されます。既存のレルムの場合、レルムで組織を有効にすることに加えて、既存の(カスタム)認証フローを手動で更新する必要があります。

次の手順に従ってbrowserフローを変更します

手順
  1. 現在使用しているフローを壊さないように、Browser flow(ブラウザフロー)バインディングタイプにバインドされた現在のフローを複製します。

  2. Add sub-flow(サブフローを追加)をクリックし、My Organization(私の組織)などの名前を付けます。

  3. 新しく追加されたMy Organization(私の組織)サブフローを、Identity Provider Redirector(アイデンティティプロバイダーリダイレクター)実行ステップの直後に実行するように移動します。ここでの主なポイントは、サブフローが、レルムでサポートする資格情報を使用してユーザーを認証する他のサブフローまたは実行ステップの前に発生する必要があるということです。追加したら、Requirement(要件)Alternative(代替)に変更します。

  4. My Organization(私の組織)サブフローでAdd sub-flow(サブフローを追加)をクリックし、My Organization - Conditional(私の組織 - 条件付き)などの名前を付けます。追加したら、Requirement(要件)Conditional(条件付き)に変更します。

  5. My Organization - Conditional(私の組織 - 条件付き)サブフローでAdd condition(条件を追加)をクリックし、Condition - user configured(条件 - ユーザー構成済み)を選択します。追加したら、Requirement(要件)Required(必須)に変更します。

  6. My Organization - Conditional(私の組織 - 条件付き)サブフローでAdd step(ステップを追加)をクリックし、*Organization Identity-First Login

    • 実行ステップを選択します。追加したら、Requirement(要件)Alternative(代替)に変更します。

  7. 認証フローをBrowser(ブラウザ)バインディングタイプにバインドします。

組織のbrowserフロー

Organizations browser flow

レルムに対してOrganizations(組織)設定を有効にし、少なくとも1つの組織を作成すると、ID優先ログインページが表示され、レルムで組織の使用を開始できるようになります。

次の手順に従ってfirst broker loginフローを変更します

手順
  1. 現在使用しているフローを壊さないように、First broker login flow(初回ブローカーログインフロー)バインドタイプにバインドされた現在のフローを複製します。

  2. Add sub-flow(サブフローを追加)をクリックし、Organization Member - Conditional組織メンバー - 条件付き)などの名前を付けます。追加したら、Requirement(要件)Conditional(条件付き)に変更します。

  3. Organization Member - Conditional(組織メンバー - 条件付き)サブフローでAdd condition(条件を追加)をクリックし、Condition - user configured(条件 - ユーザー構成済み)を選択します。追加したら、Requirement(要件)Required(必須)に変更します。

  4. Organization Member - Conditional(組織メンバー - 条件付き)サブフローでAdd step(ステップを追加)をクリックし、Organization Member Onboard(組織メンバーオンボード)実行ステップを選択します。追加したら、Requirement(要件)Required(必須)に変更します。

  5. 認証フローをFirst broker login(初回ブローカーログイン)バインディングタイプにバインドします。

組織のfirst broker flow

Organizations first broker flow

これで、組織に関連付けられた任意のアイデンティティプロバイダーを使用して認証し、ユーザーが最初のbrowserログインフローを完了するとすぐに組織にメンバーとして参加させることができるはずです。

ユーザーの認証方法の構成

フローが組織をサポートしている場合、一部のステップを構成して、ユーザーがレルムに対して認証する方法を変更できます。

たとえば、一部のユースケースでは、ユーザーがレルム内の任意の組織または特定の組織のメンバーである場合にのみ、レルムに対して認証することを要求します。

この動作を有効にするには、`Organization Identity-First Login`(`組織ID優先ログイン`)実行ステップの設定をクリックして、`Requires user membership`(`ユーザーメンバーシップが必要`)設定を有効にする必要があります。

有効にすると、ユーザーがID優先ログインページでユーザー名またはメールアドレスを提供した後、サーバーは既存のメンバーシップを調べるか、クライアントによって要求された場合はorganization(組織)スコープのセマンティクスに基づいて、ユーザーがメンバーである組織を解決しようとします。組織のメンバーでない場合は、エラーページが表示されます。

組織クレームのマッピング

組織固有のクレームをトークンにマッピングするには、クライアントはサーバーに認証リクエストを送信するときにorganizationスコープをリクエストする必要があります。組織のコンテキスト内で認証する場合、クライアントはユーザーがメンバーである組織に関する情報をマッピングするために、organizationスコープをリクエストできます。

その結果、トークンには次のようなクレームが含まれます。

"organization": {
  "testcorp": {
    "id": "42c3e46f-2477-44d7-a85b-d3b43f6b31fa",
    "attr1": [
      "value1"
    ]
  }
}

organizationクレームは、クライアント(IDトークンなどから)およびリソースサーバー(アクセストークンなどから)によって、ユーザーがメンバーである組織に基づいて保護されたリソースへのアクセスを承認するために使用できます。

organizationスコープは、レルムに組み込まれているオプションのクライアントスコープです。したがって、このスコープは、デフォルトでレルムに作成されたすべてのクライアントに追加されます。また、組織メンバーシップ情報がトークンにどのようにマッピングされるかを制御するOrganization Membershipマッパーも定義します。

デフォルトでは、組織IDと属性はorganizationクレームに含まれていません。それらを含めるには、マッパーを編集し、Add organization id(組織IDを追加)オプションとAdd organization attributes(組織属性を追加)オプションをそれぞれ有効にします。
組織クレームに属性を含める

Including attributes in the organization claim

organizationスコープは、さまざまな形式を使用してリクエストされます。

形式 説明

organization

ユーザーが単一の組織のメンバーである場合は、単一の組織にマッピングされます。それ以外の場合、複数の組織のメンバーである場合は、レルムへの認証時に組織を選択するように求められます。

organization:<エイリアス>

指定されたエイリアスを持つ単一の組織にマッピングされます。

organization:*

ユーザーがメンバーであるすべての組織にマッピングされます。

OpenID ConnectおよびSAMLクライアントの管理

クライアントとは、ユーザーの認証を要求できるエンティティです。クライアントには2つの形式があります。最初のタイプのクライアントは、シングルサインオンに参加したいアプリケーションです。これらのクライアントは、Keycloakにセキュリティを提供してほしいだけです。もう一方のタイプのクライアントは、認証されたユーザーに代わって他のサービスを呼び出すことができるようにアクセストークンを要求するクライアントです。このセクションでは、クライアントの設定に関するさまざまな側面と、そのさまざまな方法について説明します。

OpenID Connect クライアントの管理

OpenID Connect は、アプリケーションを保護するために推奨されるプロトコルです。これは、Webフレンドリーになるようにゼロから設計されており、HTML5/JavaScript アプリケーションで最適に動作します。

OpenID Connect クライアントの作成

OpenID Connect プロトコルを使用するアプリケーションを保護するには、クライアントを作成します。

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. クライアントを作成 をクリックします。

    クライアントを作成

    Create Client

  3. クライアントタイプOpenID Connect に設定したままにします。

  4. クライアント ID を入力します。

    この ID は、OIDC リクエストおよび Keycloak データベースでクライアントを識別するために使用される英数字文字列です。

  5. クライアントの 名前 を指定します。

    この名前をローカライズする場合は、置換文字列値を設定します。たとえば、${myapp} のような文字列値です。詳細については、サーバー開発者ガイド を参照してください。

  6. 保存をクリックします。

この操作によりクライアントが作成され、基本設定 を実行できる 設定 タブが表示されます。

基本設定

設定 タブには、このクライアントを設定するための多くのオプションが含まれています。

設定タブ

Settings tab

一般設定
クライアントID

OIDC リクエストおよび Keycloak データベースでクライアントを識別するために使用される英数字 ID 文字列。

名前

Keycloak UI 画面でのクライアントの名前。名前をローカライズするには、置換文字列値を設定します。たとえば、${myapp} のような文字列値です。詳細については、サーバー開発者ガイド を参照してください。

説明

クライアントの説明。この設定もローカライズできます。

コンソールに常に表示

ユーザーがアクティブなセッションを持っていない場合でも、アカウントコンソールに常にこのクライアントをリスト表示します。

アクセス設定
ルート URL

Keycloak が設定された相対 URL を使用する場合、この値はそれらの先頭に付加されます。

ホーム URL

認証サーバーがクライアントにリダイレクトまたはリンクバックする必要がある場合のデフォルト URL を提供します。

有効なリダイレクト URI

必須フィールド。URL パターンを入力し、+ をクリックして追加し、- をクリックして既存の URL を削除し、保存 をクリックします。有効なリダイレクト URI を比較するには、厳密な(大文字と小文字を区別する)文字列マッチングが使用されます。

URL パターンの最後にワイルドカードを使用できます。たとえば、http://host.com/path/* などです。セキュリティ上の問題を回避するために、渡されたリダイレクト URI に userinfo 部分が含まれている場合、またはその パス が親ディレクトリ (/../) へのアクセスを管理している場合、ワイルドカード比較は実行されず、標準的で安全な厳密な文字列マッチングが実行されます。

完全なワイルドカード * の有効なリダイレクト URI を設定して、任意の http または https リダイレクト URI を許可することもできます。本番環境では使用しないでください。

排他的なリダイレクト URI パターンは、通常より安全です。詳細については、非特定のリダイレクト URI を参照してください。

Web オリジン

URL パターンを入力し、+ をクリックして追加し、- をクリックして既存の URL を削除します。[保存] をクリックします。

このオプションは、Cross-Origin Resource Sharing (CORS) を処理します。ブラウザ JavaScript が、JavaScript コードの送信元とは異なるドメインのサーバーに AJAX HTTP リクエストを試行する場合、リクエストは CORS を使用する必要があります。サーバーは CORS リクエストを処理する必要があります。そうしないと、ブラウザはリクエストを表示または処理することを許可しません。このプロトコルは、XSS、CSRF、およびその他の JavaScript ベースの攻撃から保護します。

ここにリストされているドメイン URL は、クライアントアプリケーションに送信されるアクセストークン内に埋め込まれています。クライアントアプリケーションは、この情報を使用して、CORS リクエストを呼び出すことを許可するかどうかを決定します。Keycloak クライアントアダプターのみがこの機能をサポートしています。詳細については、アプリケーションの保護ガイド を参照してください。

管理者 URL

クライアントのコールバックエンドポイント。サーバーは、この URL を使用して、失効ポリシーのプッシュ、バックチャネルログアウト、その他の管理操作などのコールバックを行います。Keycloak サーブレットアダプターの場合、この URL はサーブレットアプリケーションのルート URL にすることができます。詳細については、アプリケーションの保護ガイド を参照してください。

機能設定
クライアント認証

OIDC クライアントのタイプ。

  • オン

    ブラウザログインを実行し、アクセストークンリクエストを行うときにクライアントシークレットを必要とするサーバーサイドクライアントの場合。この設定は、サーバーサイドアプリケーションに使用する必要があります。

  • オフ

    ブラウザログインを実行するクライアントサイドクライアントの場合。クライアントサイドクライアントでシークレットを安全に保つことができることを保証することはできないため、正しいリダイレクト URI を設定してアクセスを制限することが重要です。

Authorization

このクライアントのきめ細かい承認サポートを有効または無効にします。

標準フロー

有効にすると、このクライアントは OIDC 認証コードフロー を使用できます。

ダイレクトアクセス許可

有効にすると、このクライアントは OIDC ダイレクトアクセス許可 を使用できます。

暗黙的フロー

有効にすると、このクライアントは OIDC 暗黙的フロー を使用できます。

サービスアカウントロール

有効にすると、このクライアントは Keycloak に対して認証を行い、このクライアント専用のアクセストークンを取得できます。OAuth2 仕様の観点から見ると、これによりこのクライアントに対する Client Credentials Grant のサポートが有効になります。

標準トークン交換

有効にすると、このクライアントは 標準トークン交換 を使用できます。

Auth 2.0 デバイス認証許可

有効にすると、このクライアントは OIDC デバイス認証許可 を使用できます。

OIDC CIBA 許可

有効にすると、このクライアントは OIDC クライアント開始バックチャネル認証許可 を使用できます。

ログイン設定
ログインテーマ

ログイン、OTP、許可登録、およびパスワード忘れページに使用するテーマ。

同意が必要

有効にすると、ユーザーはクライアントアクセスに同意する必要があります。

ブラウザログインを実行するクライアントサイドクライアントの場合。クライアントサイドクライアントでシークレットを安全に保つことができることを保証することはできないため、正しいリダイレクト URI を設定してアクセスを制限することが重要です。

画面にクライアントを表示

このスイッチは、同意が必要オフ の場合に適用されます。

  • オフ

    同意画面には、設定されたクライアントスコープに対応する同意のみが含まれます。

  • オン

    同意画面には、このクライアント自体に関する項目も1つ表示されます。

クライアント同意画面テキスト

同意が必要 および 画面にクライアントを表示 が有効になっている場合に適用されます。このクライアントのアクセス許可に関する同意画面に表示されるテキストが含まれています。

ログアウト設定
フロントチャネルログアウト

フロントチャネルログアウト が有効になっている場合、アプリケーションは OpenID Connect Front-Channel Logout 仕様に従って、フロントチャネルを介してユーザーをログアウトできる必要があります。有効にする場合は、フロントチャネルログアウト URL も指定する必要があります。

フロントチャネルログアウト URL

Keycloak がフロントチャネルを介してクライアントにログアウトリクエストを送信するために使用する URL。指定しない場合は、デフォルトでホーム URL になります。このオプションは、フロントチャネルログアウト オプションがオンの場合にのみ適用できます。

フロントチャネルログアウトセッション必須

フロントチャネルログアウト URL が使用されている場合に、ログアウトリクエストに sid (セッション ID) パラメーターと iss (発行者) パラメーターを含めるかどうかを指定します。

バックチャネルログアウト URL

ログアウトリクエストがこのレルム(end_session_endpoint 経由)に送信されたときにクライアント自体をログアウトさせる URL。ログアウトは、OIDC バックチャネルログアウト仕様で指定されているようにログアウトトークンを送信することによって行われます。省略した場合、ログアウトリクエストは、Keycloak アダプターに固有の形式で、指定された 管理者 URL (設定されている場合) に送信される場合があります。管理者 URL も設定されていない場合でも、ログアウトリクエストはクライアントに送信されません。このオプションは、フロントチャネルログアウト オプションがオフの場合にのみ適用できます。

バックチャネルログアウトセッション必須

バックチャネルログアウト URL が使用されている場合に、ログアウトトークンにセッション ID クレームを含めるかどうかを指定します。

バックチャネルログアウトオフラインセッションの取り消し

バックチャネルログアウト URL が使用されている場合に、revoke_offline_access イベントをログアウトトークンに含めるかどうかを指定します。Keycloak は、このイベントを含むログアウトトークンを受信すると、オフラインセッションを取り消します。

詳細設定

設定 タブのフィールドに入力したら、他のタブを使用して詳細設定を実行できます。たとえば、ロール または クライアントスコープ タブを使用して、クライアントに定義されたクライアントロールを設定したり、クライアントのクライアントスコープを管理したりできます。また、その他の機能については、この章の残りのセクションを参照してください。

詳細タブ

詳細設定 タブをクリックすると、追加のフィールドが表示されます。特定のフィールドの詳細については、そのフィールドの疑問符アイコンをクリックしてください。ただし、特定のフィールドについては、このセクションで詳しく説明します。

きめ細かい OpenID Connect 設定

ロゴ URL

クライアントアプリケーションのロゴを参照する URL。

ポリシー URL

プロファイルデータの使用方法について読むために、証明書利用者クライアントがエンドユーザーに提供する URL。

利用規約 URL

証明書利用者の利用規約について読むために、証明書利用者クライアントがエンドユーザーに提供する URL。

署名および暗号化された ID トークンのサポート

Keycloak は、Json Web Encryption (JWE) 仕様に従って ID トークンを暗号化できます。管理者は、ID トークンが各クライアントに対して暗号化されるかどうかを決定します。

ID トークンの暗号化に使用されるキーは、コンテンツ暗号化キー (CEK) です。Keycloak とクライアントは、どの CEK を使用するか、およびその配信方法についてネゴシエートする必要があります。CEK を決定するために使用される方法は、キー管理モードです。Keycloak がサポートするキー管理モードは、キー暗号化です。

キー暗号化の場合

  1. クライアントは、非対称暗号化キーペアを生成します。

  2. 公開キーは、CEK を暗号化するために使用されます。

  3. Keycloak は、ID トークンごとに CEK を生成します

  4. Keycloak は、この生成された CEK を使用して ID トークンを暗号化します

  5. Keycloak は、クライアントの公開キーを使用して CEK を暗号化します。

  6. クライアントは、暗号化された CEK を秘密キーを使用して復号化します

  7. クライアントは、復号化された CEK を使用して ID トークンを復号化します。

クライアント以外の当事者は、ID トークンを復号化できません。

クライアントは、CEK を暗号化するための公開キーを Keycloak に渡す必要があります。Keycloak は、クライアントから提供された URL から公開キーをダウンロードすることをサポートしています。クライアントは、Json Web Keys (JWK) 仕様に従って公開キーを提供する必要があります。

手順は次のとおりです

  1. クライアントの キー タブを開きます。

  2. JWKS URL をオンに切り替えます。

  3. クライアントの公開キー URL を JWKS URL テキストボックスに入力します。

キー暗号化のアルゴリズムは、Json Web Algorithm (JWA) 仕様で定義されています。Keycloak は以下をサポートしています

  • RSAES-PKCS1-v1_5(RSA1_5)

  • デフォルトパラメータを使用した RSAES OAEP (RSA-OAEP)

  • SHA-256 および MFG1 を使用した RSAES OAEP 256 (RSA-OAEP-256)

アルゴリズムを選択する手順は次のとおりです

  1. クライアントの 詳細設定 タブを開きます。

  2. きめ細かい OpenID Connect 設定 を開きます。

  3. ID トークン暗号化コンテンツ暗号化アルゴリズム プルダウンメニューからアルゴリズムを選択します。

OpenID Connect 互換モード

このセクションは、下位互換性のために存在します。各フィールドの詳細については、疑問符アイコンをクリックしてください。

OAuth 2.0 Mutual TLS 証明書バインドアクセストークンが有効

Mutual TLS は、TLS ハンドシェイク中に交換されるクライアント証明書とともに、アクセストークンとリフレッシュトークンをバインドします。このバインディングにより、攻撃者が盗まれたトークンを使用することを防ぎます。

このタイプのトークンは、ホルダーオブレシートークンです。ベアラートークンとは異なり、ホルダーオブレシートークンの受信者は、トークンの送信者が正当であるかどうかを確認できます。

この設定がオンの場合、ワークフローは次のようになります

  1. トークンリクエストは、認証コードフローまたはハイブリッドフローのトークンエンドポイントに送信されます。

  2. Keycloak はクライアント証明書を要求します。

  3. Keycloak はクライアント証明書を受信します。

  4. Keycloak はクライアント証明書を正常に検証します。

検証に失敗した場合、Keycloak はトークンを拒否します。

次の場合、Keycloak は、アクセストークンまたはリフレッシュトークンを送信するクライアントを検証します。

  • ホルダーオブリフレッシュトークンを使用して、トークンエンドポイントにトークンリフレッシュリクエストが送信されます。

  • ホルダーオブキーアクセストークンを使用して、UserInfo エンドポイントに UserInfo リクエストが送信されます。

  • ホルダーオブリフレッシュトークンを使用して、非 OIDC 準拠の Keycloak 独自のログアウトエンドポイントにログアウトリクエストが送信されます。

詳細については、OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens の Mutual TLS Client Certificate Bound Access Tokens を参照してください。

Keycloak クライアントアダプターは、ホルダーオブキートークン検証をサポートしていません。Keycloak アダプターは、アクセストークンとリフレッシュトークンをベアラートークンとして扱います。

OAuth 2.0 アプリケーション層での Proof-of-Possession (DPoP) の実証

DPoP は、アクセストークンとリフレッシュトークンをクライアントのキーペアの公開鍵部分と結び付けます。このバインディングにより、攻撃者が盗まれたトークンを使用することを防ぎます。

このタイプのトークンは、ホルダーオブレシートークンです。ベアラートークンとは異なり、ホルダーオブレシートークンの受信者は、トークンの送信者が正当であるかどうかを確認できます。

クライアントスイッチ Require Demonstrating Proof of Possession (DPoP) header in token requests がオンの場合、ワークフローは次のようになります。

  1. トークンリクエストは、認証コードフローまたはハイブリッドフローのトークンエンドポイントに送信されます。

  2. Keycloak は DPoP proof をリクエストします。

  3. Keycloak は DPoP proof を受信します。

  4. Keycloak は DPoP proof を正常に検証します。

検証に失敗した場合、Keycloak はトークンを拒否します。

スイッチ Require Demonstrating Proof of Possession (DPoP) header in token requests がオフの場合でも、クライアントはトークンリクエストで DPoP proof を送信できます。その場合、Keycloak は DPoP proof を検証し、トークンにサムプリントを追加します。ただし、スイッチがオフの場合、DPoP バインディングはこのクライアントに対して Keycloak サーバーによって強制されません。特定のクライアントが常に DPoP バインディングを使用するようにしたい場合は、このスイッチをオンにすることをお勧めします。

次の場合、Keycloak は、アクセストークンまたはリフレッシュトークンを送信するクライアントを検証します。

  • ホルダーオブリフレッシュトークンを使用して、トークンエンドポイントにトークンリフレッシュリクエストが送信されます。この検証は、DPoP 仕様で説明されているように、パブリッククライアントに対してのみ行われます。コンフィデンシャルクライアントの場合、正当なクライアントからのリクエストであることを保証するために、適切なクライアントクレデンシャルを使用したクライアント認証が適切に行われているため、検証は行われません。パブリッククライアントの場合、アクセストークンとリフレッシュトークンの両方が DPoP バインドされます。コンフィデンシャルクライアントの場合、アクセストークンのみが DPoP バインドされます。

  • ホルダーオブキーアクセストークンを使用して、UserInfo エンドポイントに UserInfo リクエストが送信されます。

  • ホルダーオブリフレッシュトークンを使用して、非 OIDC 準拠の Keycloak 独自のログアウトエンドポイントである Logout エンドポイントにログアウトリクエストが送信されます。この検証は、上記で説明したように、パブリッククライアントに対してのみ行われます。

詳細については、OAuth 2.0 Demonstrating Proof of Possession (DPoP) を参照してください。

Keycloak クライアントアダプターは、DPoP ホルダーオブキートークン検証をサポートしていません。Keycloak アダプターは、アクセストークンとリフレッシュトークンをベアラートークンとして扱います。

DPoP は プレビュー であり、完全にはサポートされていません。この機能はデフォルトで無効になっています。

有効にするには、--features=preview または --features=dpop でサーバーを起動します。

OIDC の詳細設定

OpenID Connect の詳細設定では、セッションとトークンのタイムアウト のクライアントレベルでのオーバーライドを設定できます。

Advanced Settings

構成 説明

アクセストークンの有効期間

この値は、同じ名前のレルムオプションをオーバーライドします。

クライアントセッションアイドル

この値は、同じ名前のレルムオプションをオーバーライドします。値は、グローバルな SSO セッションアイドル よりも短くする必要があります。

クライアントセッション最大

この値は、同じ名前のレルムオプションをオーバーライドします。値は、グローバルな SSO セッション最大 よりも短くする必要があります。

クライアントオフラインセッションアイドル

この設定により、クライアントのより短いオフラインセッションアイドルタイムアウトを設定できます。タイムアウトは、Keycloak がオフライン トークンを取り消す前にセッションがアイドル状態になる時間です。設定されていない場合、レルムの オフラインセッションアイドル が使用されます。

クライアントオフラインセッション最大

この設定により、クライアントのより短いオフラインセッション最大有効期間を設定できます。有効期間は、Keycloak が対応するオフライン トークンを取り消すまでの最大時間です。このオプションには、レルムでグローバルに有効になっている オフラインセッション最大制限 が必要であり、デフォルトは オフラインセッション最大 です。

コード交換コードチャレンジメソッドの Proof Key

攻撃者が正当なクライアントの認可コードを盗んだ場合、Proof Key for Code Exchange (PKCE) は、攻撃者がコードに適用されるトークンを受信することを防ぎます。

管理者は、これらのオプションのいずれかを選択できます

(空白)

クライアントが適切な PKCE パラメーターを Keycloak 認証エンドポイントに送信しない限り、Keycloak は PKCE を適用しません。

S256

Keycloak は、コードチャレンジメソッドが S256 であるクライアント PKCE に適用されます。

plain

Keycloak は、コードチャレンジメソッドが plain であるクライアント PKCE に適用されます。

詳細については、RFC 7636 Proof Key for Code Exchange by OAuth Public Clients を参照してください。

ACR から認証レベル (LoA) へのマッピング

クライアントの詳細設定では、どの Authentication Context Class Reference (ACR) 値をどの Level of Authentication (LoA) にマッピングするかを定義できます。このマッピングは、ACR から LoA へのマッピング で説明されているように、レルムレベルでも指定できます。ベストプラクティスは、レルムレベルでこのマッピングを設定することです。これにより、複数のクライアント間で同じ設定を共有できます。

Default ACR Values は、acr_values パラメーターなしで、および acr クレームが添付された claims パラメーターなしで、このクライアントから Keycloak にログインリクエストが送信された場合のデフォルト値を指定するために使用できます。公式 OIDC 動的クライアント登録仕様 を参照してください。

デフォルトの ACR 値はデフォルトレベルとして使用されることに注意してください。ただし、特定のレベルでのログインを強制するために確実に使用することはできません。たとえば、Default ACR Values をレベル 2 に設定するとします。すると、デフォルトでは、ユーザーはレベル 2 で認証する必要があります。ただし、ユーザーが acr_values=1 などのパラメーターをログインリクエストに明示的に添付すると、レベル 1 が使用されます。その結果、クライアントが実際にレベル 2 を必要とする場合、クライアントは ID トークン内の acr クレームの存在を確認し、要求されたレベル 2 が含まれていることを再確認することをお勧めします。Keycloak 側で特定の ACR の使用を実際に強制するには、Minimum ACR Value 設定を使用します。これにより、管理者は、トークン内の要求された acr クレームを検証できないアプリケーションでも ACR を強制できます。

ACR to LoA mapping

詳細については、ステップアップ認証および公式 OIDC 仕様を参照してください。

コンフィデンシャルクライアントクレデンシャル

クライアントの クライアント認証ON に設定されている場合、クライアントのクレデンシャルは Credentials タブで構成する必要があります。

Credentials タブ

Credentials Tab

クライアント認証 ドロップダウンリストは、クライアントに使用するクレデンシャルのタイプを指定します。

クライアント ID とシークレット

この選択はデフォルト設定です。シークレットは自動的に生成されます。必要に応じてシークレットを再作成するには、再生成 をクリックします。

Signed JWT

Signed JWT

Signed JWT は「署名付き JSON Web Token」です。

この認証機能では、クライアントが使用する 署名アルゴリズム (デフォルトでは任意のアルゴリズムが有効) と、JWT トークンに許可される 最大有効期限 (この期間後に受信したトークンは古すぎるため受け入れられません。トークンは認証の直前に発行する必要があり、デフォルトでは 60 秒です) を強制できます。

このクレデンシャルタイプを選択する場合は、Keys タブでクライアントの秘密鍵と証明書も生成する必要があります。秘密鍵は JWT に署名するために使用され、証明書はサーバーが署名を検証するために使用されます。

キータブ

Keys tab

新しいキーを生成 ボタンをクリックして、このプロセスを開始します。

キーを生成

generate client keys

  1. 使用するアーカイブ形式を選択します。

  2. キーパスワード を入力します。

  3. ストアパスワード を入力します。

  4. 生成 をクリックします。

キーを生成すると、Keycloak は証明書を保存し、クライアントの秘密鍵と証明書をダウンロードします。

外部ツールを使用してキーを生成し、証明書をインポート をクリックしてクライアントの証明書をインポートすることもできます。

証明書をインポート

Import Certificate

  1. 証明書のアーカイブ形式を選択します。

  2. ストアパスワードを入力します。

  3. ファイルをインポート をクリックして証明書ファイルを選択します。

  4. インポート をクリックします。

JWKS URL を使用 をクリックする場合、証明書をインポートする必要はありません。この場合、公開鍵が JWK 形式で公開されている URL を指定できます。このオプションを使用すると、キーが変更された場合、Keycloak はキーを再インポートします。

Keycloak アダプターによって保護されたクライアントを使用している場合、https://myhost.com/myapp がクライアントアプリケーションのルート URL であると仮定して、この形式で JWKS URL を構成できます。

https://myhost.com/myapp/k_jwks

詳細については、サーバー開発者ガイド を参照してください。

クライアントシークレットを使用した Signed JWT

このオプションを選択すると、秘密鍵の代わりにクライアントシークレットによって署名された JWT を使用できます。

クライアントシークレットは、クライアントによって JWT に署名するために使用されます。

Signed JWT 認証機能と同様に、JWT トークンの 署名アルゴリズム最大有効期限 を構成できます。

X509 証明書

Keycloak は、クライアントが TLS ハンドシェイク中に適切な X509 証明書を使用しているかどうかを検証します。

X509 証明書

x509 client auth

バリデーターは、構成された正規表現検証式を使用して証明書の Subject DN フィールドもチェックします。ユースケースによっては、すべての証明書を受け入れるだけで十分な場合があります。その場合は、(.*?)(?:$) 式を使用できます。

Keycloak がリクエストからクライアント ID を取得する方法は 2 つあります。

  • クエリ内の client_id パラメーター (OAuth 2.0 仕様 のセクション 2.2 で説明)。

  • client_id をフォームパラメーターとして指定します。

クライアントシークレットローテーション

クライアントシークレットローテーションのサポートは開発中であることに注意してください。この機能は実験的に使用してください。

コンフィデンシャル クライアント認証 を使用するクライアントの場合、Keycloak は クライアントポリシー を介したクライアントシークレットのローテーション機能をサポートしています。

クライアントシークレットローテーションポリシーは、シークレット漏洩などの問題を軽減するために、より高いセキュリティを提供します。有効にすると、Keycloak はクライアントごとに最大 2 つの同時アクティブシークレットをサポートします。ポリシーは、次の設定に従ってローテーションを管理します。

  • シークレットの有効期限: [秒] - シークレットがローテーションされるとき、これは新しいシークレットの有効期限です。シークレットの作成日に追加される時間 (秒単位)。ポリシー実行時に計算されます。

  • ローテーションされたシークレットの有効期限: [秒] - シークレットがローテーションされるとき、この値は古いシークレットの残りの有効期限です。この値は、常にシークレットの有効期限よりも小さくする必要があります。値が 0 の場合、古いシークレットはクライアントのローテーション中にすぐに削除されます。シークレットのローテーション日に追加される時間 (秒単位)。ポリシー実行時に計算されます。

  • 更新中のローテーションの残り有効期限: [秒] - 動的クライアントの更新がクライアントシークレットローテーションを実行する必要がある期間。ポリシー実行時に計算されます。

クライアントシークレットローテーションが発生すると、新しいメインシークレットが生成され、古いクライアントメインシークレットが新しい有効期限を持つセカンダリシークレットになります。

クライアントシークレットローテーションのルール

ローテーションは、自動的に、またはバックグラウンドプロセスを介して発生しません。ローテーションを実行するには、クライアントに対する更新アクションが必要です。これは、Keycloak 管理コンソールを介して シークレットの再生成 の機能を使用するか、クライアントのクレデンシャルタブまたは Admin REST API を使用して実行できます。クライアント更新アクションを呼び出すと、ルールに従ってシークレットローテーションが発生します。

  • シークレットの有効期限 の値が現在の日付よりも小さい場合。

  • 動的クライアント登録クライアント更新リクエスト中に、更新中のローテーションの残り有効期限 の値が現在の日付と シークレットの有効期限 の間の期間と一致する場合、クライアントシークレットは自動的にローテーションされます。

さらに、Admin REST API を使用して、いつでもクライアントシークレットローテーションを強制できます。

新しいクライアントの作成中に、クライアントシークレットローテーションポリシーがアクティブな場合、動作が自動的に適用されます。

既存のクライアントにシークレットローテーションの動作を適用するには、ポリシーを定義した後でそのクライアントを更新して、動作が適用されるようにします。

OIDC クライアントシークレットローテーションポリシーの作成

次に、シークレットローテーションポリシーを定義する例を示します。

手順
  1. メニューのレルム設定をクリックします。

  2. Client Policies タブをクリックします。

  3. Profiles ページで、Create client profile をクリックします。

    プロファイルを作成

    Create Client Profile

  4. 名前 に任意の名前を入力します。

  5. 説明 にプロファイルの目的を識別するのに役立つ説明を入力します。

  6. 保存をクリックします。

    このアクションはプロファイルを作成し、executor を構成できるようにします。

  7. executor を追加 をクリックして、このプロファイルの executor を構成します。

    プロファイル executor を作成

    Client Profile Executor

  8. Executor Typesecret-rotation を選択します。

  9. シークレットの有効期限 に各シークレットの最大期間 (秒単位) を入力します。

  10. ローテーションされたシークレットの有効期限 に、ローテーションされた各シークレットの最大期間 (秒単位) を入力します。

    ローテーションされたシークレットの有効期限の値は、常にシークレットの有効期限より短くする必要があることに注意してください。
  11. 更新アクション後にクライアントの 残りの有効期限 を更新するまでの時間を秒単位で入力します。

  12. 追加をクリックします。

    上記の例では

    • 各シークレットは1週間有効です。

    • ローテーションされたシークレットは2日後に期限切れになります。

    • 動的クライアントを更新するためのウィンドウは、シークレットが期限切れになる1日前に開始されます。

  13. クライアントポリシー タブに戻ります。

  14. ポリシー をクリックします。

  15. クライアントポリシーを作成 をクリックします。

    クライアントシークレットローテーションポリシーを作成します

    Client Rotation Policy

  16. 名前 に任意の名前を入力します。

  17. 説明 に、ポリシーの目的を特定するのに役立つ説明を入力します。

  18. 保存をクリックします。

    このアクションはポリシーを作成し、ポリシーをプロファイルに関連付けることを可能にします。また、ポリシー実行の条件を設定することもできます。

  19. 条件の下で、条件を追加 をクリックします。

    クライアントシークレットローテーションポリシー条件を作成します

    Client Rotation Policy Condition

  20. すべてのコンフィデンシャルクライアントに動作を適用するには、条件タイプ フィールドで client-access-type を選択します

    特定のクライアントグループに適用するには、別の方法として、条件タイプ フィールドで client-roles タイプを選択します。これにより、特定のロールを作成し、各ロールにカスタムローテーション設定を割り当てることができます。

  21. クライアントアクセスタイプ フィールドに confidential を追加します。

  22. 追加をクリックします。

  23. ポリシー設定に戻り、クライアントプロファイル の下で、クライアントプロファイルを追加 をクリックし、リストから Weekly Client Secret Rotation Profile を選択し、追加 をクリックします。

    クライアントシークレットローテーションポリシー

    Client Rotation Policy

既存のクライアントにシークレットローテーション動作を適用するには、次の手順に従います

管理コンソールの使用
  1. メニューの「Clients (クライアント)」をクリックします。

  2. クライアントをクリックします。

  3. Credentialsタブをクリックします。

  4. クライアントシークレットの 再生成 をクリックします。


クライアント REST サービスを使用すると、2つの方法で実行できます
  • クライアントの更新操作を通じて

  • クライアントシークレットエンドポイントの再生成を通じて

サービスアカウントの使用

各 OIDC クライアントには、組み込みのサービスアカウントがあります。このサービスアカウントを使用して、アクセス トークンを取得します。

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. クライアントを選択します。

  3. 設定 タブをクリックします。

  4. クライアント認証オン に切り替えます。

  5. サービスアカウントロール を選択します。

  6. 保存をクリックします。

  7. クライアントクレデンシャルを設定します。

  8. スコープタブをクリックします。

  9. ロールがあることを確認するか、フルスコープ許可オン に切り替えます。

  10. サービスアカウントロール タブをクリックします

  11. クライアントのこのサービスアカウントで利用可能なロールを設定します。

アクセス トークンからのロールは、以下の共通部分です

  • クライアントのロールスコープマッピングと、リンクされたクライアントスコープから継承されたロールスコープマッピングを組み合わせたもの。

  • サービスアカウントロール。

呼び出す REST URL は /realms/{realm-name}/protocol/openid-connect/token です。この URL は POST リクエストとして呼び出す必要があり、リクエストとともにクライアントクレデンシャルをポストする必要があります。

デフォルトでは、クライアントクレデンシャルは Authorization: Basic ヘッダーのクライアントの clientId と clientSecret によって表されますが、署名付き JWT アサーションまたはその他のカスタムメカニズムを使用してクライアントを認証することもできます。

OAuth2 仕様に従って、grant_type パラメーターを "client_credentials" に設定する必要もあります。

たとえば、サービスアカウントを取得するための POST 呼び出しは次のようになります

    POST /realms/demo/protocol/openid-connect/token
    Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
    Content-Type: application/x-www-form-urlencoded

    grant_type=client_credentials

レスポンスは、OAuth 2.0 仕様の アクセストークンレスポンス と同様になります。

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"bearer",
    "expires_in":60
}

デフォルトでは、アクセストークンのみが返されます。リフレッシュトークンは返されず、デフォルトでは認証が成功しても Keycloak 側でユーザーセッションは作成されません。リフレッシュトークンがないため、アクセストークンが期限切れになると再認証が必要になります。ただし、デフォルトではセッションが作成されないため、この状況は Keycloak サーバーに追加のオーバーヘッドを意味するものではありません。

この状況では、ログアウトは不要です。ただし、発行されたアクセストークンは、OpenID Connect エンドポイント セクションで説明されているように、OAuth2 失効エンドポイントにリクエストを送信することで取り消すことができます。

追加リソース

詳細については、クライアントクレデンシャルグラント を参照してください。

トークン内のロールマッピング

ユーザーが認証すると、アクセストークンに追加されるロールがいくつかあります。デフォルトでは、レルムロール はアクセストークンの realm_access クレームに追加されます。クライアントロール はデフォルトで resource_access クレームに追加されます。

トークンに追加されるロールは、以下の共通部分です

ユーザーに割り当てられたロール

ユーザーに割り当てられたロールは、このセクションで説明されているロールマッピングで定義できます。詳細をいくつか示します

  • ユーザーがいくつかの グループ のメンバーである場合、これらのグループのすべてのロールも適用されます。

  • ロールが コンポジットロール である場合、コンポジットロールの子ロールも適用されます。トークンでは、ロールのリストが展開され、すべてのロールが含まれます。

  • 認証されたユーザーが通常のユーザーではなく、クライアントを表す サービスアカウント である場合、サービスアカウントロールが使用されます。サービスアカウントロールは、特定のクライアントの サービスアカウントロール タブで定義されます。

ロールプロトコルマッパー

他のクレームと同様に、ロールは専用の プロトコルマッパー によってクライアントに発行されたアクセストークンに追加されます。レルムで定義された 組み込みクライアントスコープ roles があります。これは レルムデフォルトクライアントスコープ であるため、すべてのレルムクライアントに対してデフォルトで デフォルトクライアントスコープ として定義されています。管理コンソールの クライアントスコープ タブを見て、roles クライアントスコープを探すことで、このクライアントスコープを確認できます。このクライアントスコープには、デフォルトでこれらのプロトコルマッパーが含まれています

  • プロトコルマッパー レルムロール - このプロトコルマッパーは、レルムロールをトークンクレームに追加するために使用されます。デフォルトでは、構成は次のようになります

レルムロールマッパー

mapper oidc realm roles

  • プロトコルマッパー クライアントロール - このプロトコルマッパーは、クライアントロールをトークンクレームに追加するために使用されます。デフォルトでは、構成は次のようになります

クライアントロールマッパー

mapper oidc client roles

  • プロトコルマッパー オーディエンス解決 - このプロトコルマッパーは、適用されたクライアントロールに基づいて、アクセストークンの aud クレームを埋めるために使用されます。このマッパーの詳細については、オーディエンス解決セクション を参照してください。

レルムロールとクライアントロールマッパーの構成でわかるように、次の構成が可能です

  • ロールがアクセストークンのみに追加されるか、ID トークンなどの他のトークンにも追加されるか。デフォルトでは、ロールはアクセストークンとイントロスペクションエンドポイントに追加されます。

  • ロールが追加されるクレームは何ですか。デフォルトでは、レルムロールは realm_access クレームに追加されます。したがって、たとえば、2 つのレルムロール role1role2 を含む JWT トークンのクレームは、次のようになります

    "realm_access": {
      "roles": [ "role1", "role2" ]
    }

    クライアントロールは、デフォルトで resource_access トークンクレームに追加されます。このクレームは、クライアント account のクライアントロール manage-accountmanage-account-links、およびクライアント target-client1 のクライアントロール target-client1-role を含むトークンで次のようになります

    "resource_access": {
      "target-client1": {
        "roles": [ "target-client1-role" ]
      },
      "account": {
        "roles": [ "manage-account", "manage-account-links" ]
      }
    }

ロールプロトコルマッパーの トークンクレーム名 構成オプションを調整することにより、これらのロールが構成されたクレームのトークンに追加されるように指定できます。

特定のクライアント (たとえば、クライアント foorealm_access クレームの代わりに my-realm-roles クレームでレルムロールを予期する場合) に対してのみロールクレームを更新したい場合は、クライアントからデフォルトクライアントスコープ roles を削除し、代わりにクライアントの 専用クライアントスコープ でレルム/クライアントプロトコルマッパーを構成することができます。

オーディエンスに関するドキュメント には、ロールマッピングとトークンに追加されたオーディエンス (クレーム aud) に関する詳細な例が含まれています。また、クライアントスコープ評価 を試して、特定のクライアントのトークンを発行する際に使用される有効なスコープ、プロトコルマッパー、およびロールスコープマッピングと、ユーザー、クライアント、および適用されたクライアントスコープの特定の組み合わせに対して JWT トークンがどのように見えるかを確認することも役立ちます。

オーディエンスサポート

通常、Keycloak がデプロイされる環境は、認証に Keycloak を使用する一連の コンフィデンシャル または パブリック クライアントアプリケーションで構成されています。これらのクライアントは フロントエンドクライアント であり、ブラウザ認証をリクエストするためにユーザーを Keycloak に直接リダイレクトする場合があります。特定のクライアントは、認証が成功するとトークンのセットを受け取ります。

サービス (OAuth 2 仕様リソースサーバー) も利用可能で、クライアントアプリケーションからのリクエストを処理し、これらのアプリケーションにリソースを提供します。これらのサービスでは、リクエストを認証するために、フロントエンドアプリケーション または他のサービスから アクセストークン (ベアラートークン) を送信する必要があります。

アクセストークンに制限された権限があり、特定のアクセストークンがサービスによって悪用されて他のサードパーティサービスにアクセスできないように注意する必要があります。サービス間の信頼が低い環境では、次のシナリオ例が発生する可能性があります

  1. フロントエンドクライアントアプリケーション frontend-client は、Keycloak に対する認証を必要とします。

  2. Keycloak はユーザーを認証します。

  3. Keycloak はアプリケーション frontend-client にトークンを発行します。

  4. frontend-client アプリケーションは、トークンを使用してサービス service1 を呼び出します。

  5. service1 サービスは、アプリケーションに応答を返します。ただし、このサービスがトークンを悪用して、さらに使用するために保持しようとすると仮定します。

  6. 次に、service1 は、以前に送信されたアプリケーションのトークンを使用して別のサービス service2 を呼び出します。service2 は、トークンが呼び出すために使用されるべきではないことを確認せず、リクエストを処理して成功した応答を返します。これにより、service1 がクライアントアプリケーション frontend-client に代わって他のサービスにアクセスするためにトークンを悪用したため、セキュリティが侵害されます。

このシナリオは、サービス間の信頼レベルが高い環境では起こりにくいですが、信頼レベルが低い環境では起こり得ます。

アクセストークンの悪用を防ぐために、アクセストークンにはオーディエンスを表すクレーム aud を含めることができます。クレーム aud は通常、トークンが使用されるすべてのサービスのクライアント ID を表す必要があります。サービス間の信頼が低い環境では、次のようにすることをお勧めします

  • アクセストークンに制限された数のオーディエンスのみが含まれるように、トークンのオーディエンスを制限します。

  • トークンのオーディエンスを検証するようにサービスを構成します。

上記の例の service1 がトークンを悪用するのを防ぐために、フローの安全なバリアントは代わりに次のようになります

  1. フロントエンドアプリケーション frontend-client は、Keycloak に対して認証を行います。

  2. Keycloak はユーザーを認証します。

  3. Keycloak は frontend-client アプリケーションにトークンを発行します。frontend-clientservice1 を呼び出す必要があることを認識しているため、Keycloak に送信された認証リクエストに scope=service1-scope を配置します。スコープ service1-scopeクライアントスコープ であり、管理者によって作成する必要がある場合があります。以下のセクション には、そのようなクライアントスコープを設定する方法のオプションがいくつかあります。トークンクレームは次のようになります

    "aud": "service1"

    これは、クライアントがこのアクセストークンを使用して service1 を呼び出すことができることを宣言します。

  4. frontend-client アプリケーションは、トークンを使用してサービス service1 を呼び出します。

  5. service1 は、クライアントアプリケーション frontend-application へのリクエストを処理します。ただし、このサービスがトークンを悪用して、さらに使用するために保持しようとすると仮定します。

  6. 次に、service1 はトークンを使用して service2 を呼び出そうとします。service2 サービスがトークンのオーディエンスをチェックし、そのオーディエンスが service1 のみであることを検出するため、呼び出しは成功しません。したがって、service2 はリクエストを拒否し、service1 にエラーを返します。この動作は予期されており、セキュリティは侵害されていません。

サービスが別のサービスを呼び出す機能

一部の環境では、service1 が元のクライアントアプリケーション frontend-client にデータを返すために、service2 から追加データを取得する必要がある場合があります。これを可能にするために、いくつかの可能性があります

  • frontend-client に発行された最初のアクセストークンに、service1service2 の両方がオーディエンスとして含まれていることを確認してください。適切なクライアントスコープが設定されていると仮定すると、frontend-clientscope パラメーターの値として scope=service1-scope service2-scope を使用できる可能性があります。発行されたトークンには、次のような aud クレームが含まれます

    "aud": [ "service1", "service2" ]

    このようなアクセストークンは、service1 または service2 の両方を呼び出すために使用できます。したがって、service1 はそのようなトークンを正常に使用して service2 を呼び出し、追加データを取得できます。

  • 以前のトークンオーディエンスに両方のサービスを含めるアプローチでは、service1service2 を呼び出すことが許可されていました。しかし、それは frontend-client も自身のアアクセストークンを直接使用して service2 を呼び出すことができることを意味します。これは場合によっては望ましくないかもしれません。service1 には service2 を呼び出すことを許可したいが、同時に frontend-client には service2 を直接呼び出すことを許可したくない場合があります。そのようなシナリオの解決策は、トークン交換の使用かもしれません。その場合、最初のトークンは依然として service1 のみをオーディエンスとして持つでしょう。しかし、トークンが service1 に送信されると、service1 はトークン交換リクエストを送信して、service2 をオーディエンスとする別のトークンと交換することができます。使用方法の詳細については、トークン交換ドキュメントを参照してください。

セットアップ

オーディエンスチェックのセットアップ時

  • サービスが、送信されたアクセストークンのオーディエンスをチェックするように設定されていることを確認してください。これは、OIDCクライアントアプリケーションを保護するために使用しているクライアントOIDCアダプターに固有の方法で行うことができます。

  • Keycloakによって発行されたアクセストークンに、必要なすべてのオーディエンスが含まれていることを確認してください。

    オーディエンスは2つの方法でトークンに追加できます。

クライアントロールに基づいてオーディエンスを自動的に追加する

オーディエンス解決プロトコルマッパーは、デフォルトクライアントスコープrolesで定義されています。このマッパーは、現在のトークンで少なくとも1つのクライアントロールが利用可能なクライアントをチェックします。次に、そのような各クライアントのクライアントIDがオーディエンスとして追加されます。これは、サービスクライアントがクライアントロールに依存している場合に役立ちます。サービスクライアントは通常、フローが有効になっていないクライアントである可能性があり、トークンが直接発行されない場合があります。これは、OAuth 2 リソースサーバーを表します。

トークンロールマッピングセクションには、クライアントロールがトークンにどのように追加されるかの詳細が含まれています。以下の例も参照してください。

例 - トークンロールマッピングとオーディエンスクレーム

クライアントロールを使用してトークンに aud クレームを追加する手順の例を以下に示します。

  1. OIDCクライアント service1 を作成します。これはサービスクライアントであり、自身で直接認証することは決してない可能性があるため、このクライアントの標準フローまたは他のフローを無効にすることが可能です。上記の通り、必要な場合は標準トークン交換スイッチが例外となる可能性があります。

  2. そのクライアントのロールタブに移動し、クライアントロール service1-role を作成します。

  3. 同じレルムにユーザー john を作成し、前の手順で作成したクライアント service1 のクライアントロール service1-role を割り当てます。このセクションには、その方法の詳細が含まれています。

  4. service1-scope という名前のクライアントスコープを作成します。これは、トークンスコープに含めるオンにすることができます。このセクションで、新しいクライアントスコープの作成と設定方法の詳細を参照してください。

  5. service1-scopeスコープタブに移動し、クライアント service1 のロール service1-role をこのクライアントスコープのロールスコープマッピングに追加します。

  6. レルムに別のクライアント frontend-client を作成します。

  7. このクライアントのクライアントスコープタブをクリックし、最初の専用クライアントスコープ frontend-client-dedicated を選択してから、スコープタブに移動し、フルスコープを許可スイッチを無効にします。

  8. このクライアントのクライアントスコープタブに戻り、クライアントスコープを追加をクリックして、service1-scopeオプションとしてリンクします。詳細については、クライアントスコープのリンクセクションを参照してください。

  9. このセクションで説明されているように、クライアントスコープのサブタブ評価をクリックします。ユーザー john とサブタブ生成されたアクセストークンを入力すると、生成されたトークンの例にはクライアントロールがないため、aud クレームがないことがわかります。ただし、スコープフィールドにスコープ service1-scope も追加すると、service1-scopeロールスコープマッピングとユーザー john のロールマッピングにあるクライアントロール service1-role があることがわかります。そのため、aud クレームにも service1 が含まれます。

オーディエンス解決の例

audience resolving evaluate

frontend-client クライアントに発行されたトークンに常に service1 オーディエンスを適用したい場合(パラメータ scope=service1-scope を使用せずに)、代わりに次のいずれかを実行するとよいでしょう。

  • service1-scopeオプションクライアントスコープではなくデフォルトクライアントスコープとして割り当てる。

  • クライアントの専用クライアントスコープに、service1-role のロールスコープマッピングを直接追加します。この場合、service1-scope はまったく必要ありません。

このアプローチはクライアントロールに基づいているため、ユーザー自身(上記の例のユーザー john)がクライアント service1 のクライアントロールのメンバーである必要もあることに注意してください。それ以外の場合、クライアントロールが割り当てられていない場合、オーディエンス service1 は含まれません。クライアントロールに関係なくオーディエンスを含めたい場合は、代わりにハードコードされたオーディエンスセクションを参照してください。

フロントエンドクライアント自体はアクセストークンオーディエンスに自動的に追加されないため、アクセストークンとIDトークンを簡単に区別できます。アクセストークンには、トークンが発行されたクライアントがオーディエンスとして含まれないためです。

クライアント自体をオーディエンスとして必要とする場合は、ハードコードされたオーディエンスオプションを参照してください。ただし、同じクライアントをフロントエンドとRESTサービスの両方として使用することはお勧めしません。

ハードコードされたオーディエンス

サービスがレルムロールに依存している場合、またはトークン内のロールにまったく依存していない場合は、ハードコードされたオーディエンスを使用すると便利です。ハードコードされたオーディエンスはプロトコルマッパーであり、指定されたサービスクライアントのクライアントIDをオーディエンスとしてトークンに追加します。クライアントIDとは異なるオーディエンスを使用したい場合は、任意のカスタム値(たとえばURL)を使用できます。

プロトコルマッパーをフロントエンドクライアントに直接追加できます。プロトコルマッパーが直接追加されると、オーディエンスも常に追加されます。

プロトコルマッパーをより詳細に制御するには、専用クライアントスコープ(たとえば service2)にプロトコルマッパーを作成できます。

ハードコードされたオーディエンスの手順例を以下に示します。

  1. クライアント service2 を作成します。

  2. クライアントスコープ service2-scope を作成します。

  3. そのクライアントスコープのマッパータブで、新しいマッパーの構成を選択し、オーディエンスを選択します。

  4. 含まれるクライアントオーディエンスとして service2 を選択し、マッパーを保存します。

    オーディエンスプロトコルマッパー

    audience mapper

  5. 新しく作成したクライアントスコープを、何らかのクライアントにリンクします。たとえば、前の例で作成したクライアント frontend-clientオプションクライアントスコープとしてリンクできます。

  6. オプションで、クライアントスコープがリンクされているクライアント(たとえば frontend-client)のクライアントスコープの評価を行い、アクセストークンの例を生成できます。service2-scope がオプションクライアントスコープとして割り当てたときにscopeパラメータに含まれている場合、オーディエンス service2 が生成されたアクセストークンのオーディエンスに追加されます。

機密クライアントアプリケーションでは、scopeパラメータが使用されていることを確認してください。service2 にアクセスするためのトークンを発行する場合は、scope=service2-scope のような値を含める必要があります。

アプリケーションがjavascriptアダプターを使用している場合は、Keycloak JavaScriptアダプターセクションで、目的の値を持つscopeパラメータを送信する方法を参照してください。

リクエストに scope パラメータを含めたくない場合は、代わりに service2-scopeデフォルトクライアントスコープとしてリンクするか、このマッパーを構成するクライアント専用スコープを使用できます。これは、OIDCクライアント frontend-client のすべての認証リクエストに常にオーディエンスを適用したい場合に役立ちます。

オーディエンスオーディエンス解決プロトコルマッパーはどちらも、デフォルトではアクセストークンにのみオーディエンスを追加します。IDトークンには通常、OpenID Connect仕様の要件である、トークンが発行されたクライアントIDという単一のオーディエンスのみが含まれています。ただし、オーディエンスマッパーが追加しない限り、アクセストークンにはトークンが発行されたクライアントIDが必ずしも含まれているとは限りません。

SAMLクライアントの作成

Keycloakは、登録済みアプリケーションのSAML 2.0をサポートしています。POSTおよびリダイレクトバインディングがサポートされています。クライアント署名検証を必須にすることを選択できます。サーバーに応答の署名および/または暗号化をさせることもできます。

手順
  1. メニューの「Clients (クライアント)」をクリックします。

  2. クライアントを作成をクリックして、クライアントを作成ページに移動します。

  3. クライアントタイプSAMLに設定します。

    クライアントを作成

    add client saml

  4. クライアントのクライアントIDを入力します。これは多くの場合URLであり、アプリケーションから送信されたSAMLリクエストで予期される発行者値です。

  5. 保存をクリックします。このアクションによりクライアントが作成され、設定タブが表示されます。

次のセクションでは、このタブの各設定について説明します。

設定タブ

設定 タブには、このクライアントを設定するための多くのオプションが含まれています。

クライアント設定

client settings saml

一般設定
クライアントID

OIDCリクエストおよびKeycloakデータベースでクライアントを識別するために使用される英数字ID文字列。この値は、AuthN SAMLリクエストで送信される発行者値と一致する必要があります。Keycloakは、Authn SAMLリクエストから発行者をプルし、この値でクライアントと一致させます。

名前

Keycloak UI画面でのクライアントの名前。名前をローカライズするには、置換文字列値を設定します。たとえば、${myapp}のような文字列値です。詳細については、サーバー開発者ガイドを参照してください。

説明

クライアントの説明。この設定もローカライズできます。

コンソールに常に表示

ユーザーがアクティブなセッションを持っていない場合でも、アカウントコンソールに常にこのクライアントをリスト表示します。

アクセス設定
ルート URL

Keycloakが設定された相対URLを使用する場合、この値がURLの先頭に追加されます。

ホーム URL

Keycloakがクライアントにリンクする必要がある場合、このURLが使用されます。

有効なリダイレクト URI

URLパターンを入力し、+記号をクリックして追加します。-記号をクリックして削除します。保存をクリックして、これらの変更を保存します。ワイルドカード値は、URLの末尾でのみ許可されます。たとえば、http://host.com/*$$。このフィールドは、正確なSAMLエンドポイントが登録されておらず、KeycloakがリクエストからAssertion Consumer URLをプルする場合に使用されます。

IDP開始SSO URL名

IDP開始SSOを実行する場合にクライアントを参照するためのURLフラグメント名。これを空のままにすると、IDP開始SSOが無効になります。ブラウザから参照するURLは、server-root/realms/{realm-name}/protocol/saml/clients/{client-url-name} になります。

IDP開始SSOリレーステート

IDP開始SSOを実行する場合にSAMLリクエストとともに送信するリレーステート。

マスターSAML処理URL

このURLはすべてのSAMLリクエストに使用され、応答はSPに送信されます。これは、Assertion Consumer Service URLおよびSingle Logout Service URLとして使用されます。

ログインリクエストにAssertion Consumer Service URLが含まれている場合、それらのログインリクエストが優先されます。このURLは、登録済みの有効なリダイレクトURIパターンによって検証される必要があります。

SAML機能
名前ID形式

サブジェクトの名前ID形式。この形式は、リクエストで名前IDポリシーが指定されていない場合、または[名前ID形式を強制]属性が[オン]に設定されている場合に使用されます。

名前ID形式を強制

リクエストに名前IDポリシーがある場合、それを無視し、[管理コンソール]の[名前ID形式]で構成された値を使用します。

POSTバインディングを強制

デフォルトでは、Keycloakは元のリクエストの最初のSAMLバインディングを使用して応答します。POSTバインディングを強制を有効にすると、Keycloakは元のリクエストがリダイレクトバインディングを使用した場合でも、SAML POSTバインディングを使用して応答します。

アーティファクトバインディングを強制

有効にすると、応答メッセージはSAML ARTIFACTバインディングシステムを介してクライアントに返されます。

AuthnStatementを含める

SAMLログイン応答は、パスワードなどの認証方法、およびログインとセッションの有効期限のタイムスタンプを指定できます。AuthnStatementを含めるはデフォルトで有効になっているため、ログイン応答にAuthnStatement要素が含まれます。これをオフに設定すると、クライアントが最大セッション長を判断できなくなり、期限切れにならないクライアントセッションが作成される可能性があります。

OneTimeUse Conditionを含める

有効にすると、OneTimeUse Conditionがログイン応答に含まれます。

REDIRECT署名キーのルックアップを最適化

オンに設定すると、SAMLプロトコルメッセージにKeycloakネイティブ拡張機能が含まれます。この拡張機能には、署名キーIDのヒントが含まれています。SPは、キーを使用して署名を検証しようとする代わりに、署名検証に拡張機能を使用します。

このオプションは、署名がクエリパラメーターで転送され、この情報が署名情報に見つからないREDIRECTバインディングに適用されます。これは、キーIDが常にドキュメント署名に含まれるPOSTバインディングメッセージとは対照的です。

このオプションは、KeycloakサーバーとアダプターがIDPとSPを提供する場合に使用されます。このオプションは、ドキュメント署名がONに設定されている場合にのみ関連します。

署名と暗号化
ドキュメント署名

ONに設定すると、Keycloakはレルムのプライベートキーを使用してドキュメントに署名します。

アサーション署名

アサーションは署名され、SAML XML Authレスポンスに埋め込まれます。

署名アルゴリズム

SAMLドキュメントの署名に使用されるアルゴリズム。SHA1ベースのアルゴリズムは非推奨であり、将来のリリースで削除される可能性があります。*_SHA1の代わりに、より安全なアルゴリズムを使用することをお勧めします。また、*_SHA1アルゴリズムでは、SAMLクライアントがJava 17以降で実行されている場合、署名の検証は機能しません。

SAML 署名鍵名

POSTバインディングを使用して送信される署名付きSAMLドキュメントには、KeyName要素に署名キーの識別情報が含まれています。この動作は、SAML署名キー名オプションで制御できます。このオプションは、Keynameの内容を制御します。

  • KEY_ID KeyNameにはキーIDが含まれます。このオプションはデフォルトのオプションです。

  • CERT_SUBJECT KeyNameには、レルムキーに対応する証明書のサブジェクトが含まれます。このオプションは、Microsoft Active Directory Federation Servicesで想定されています。

  • NONE KeyNameヒントはSAMLメッセージから完全に省略されます。

正規化メソッド

XML署名の正規化メソッド。

ログイン設定
ログインテーマ

ログイン、OTP、許可登録、およびパスワード忘れページに使用するテーマ。

同意が必要

有効にすると、ユーザーはクライアントアクセスに同意する必要があります。

ブラウザログインを実行するクライアントサイドクライアントの場合。クライアントサイドクライアントでシークレットを安全に保つことができることを保証することはできないため、正しいリダイレクト URI を設定してアクセスを制限することが重要です。

画面にクライアントを表示

このスイッチは、同意が必要オフ の場合に適用されます。

  • オフ

    同意画面には、設定されたクライアントスコープに対応する同意のみが含まれます。

  • オン

    同意画面には、このクライアント自体に関する項目も1つ表示されます。

クライアント同意画面テキスト

同意が必要 および 画面にクライアントを表示 が有効になっている場合に適用されます。このクライアントのアクセス許可に関する同意画面に表示されるテキストが含まれています。

ログアウト設定
フロントチャネルログアウト

フロントチャネルログアウトが有効になっている場合、アプリケーションはログアウトを実行するためにブラウザのリダイレクトを必要とします。たとえば、アプリケーションは、リダイレクトによってのみ実行できるクッキーのリセットを必要とする場合があります。フロントチャネルログアウトが無効になっている場合、KeycloakはバックグラウンドSAMLリクエストを呼び出してアプリケーションからログアウトします。

キータブ

アサーションの暗号化

SAMLドキュメント内のアサーションをレルムのプライベートキーで暗号化します。AESアルゴリズムは、128ビットのキーサイズを使用します。

クライアント署名必須

クライアント署名必須が有効になっている場合、クライアントから送信されるドキュメントは署名されていることが期待されます。Keycloakは、キータブで設定されたクライアントの公開鍵または証明書を使用してこの署名を検証します。

ECPフローを許可

trueの場合、このアプリケーションは認証にSAML ECPプロファイルを使用することが許可されます。

詳細設定タブ

このタブには、特定の状況に対応するための多くのフィールドがあります。一部のフィールドは他のトピックで説明されています。他のフィールドの詳細については、クエスチョンマークアイコンをクリックしてください。

詳細SAMLエンドポイント設定
ロゴ URL

クライアントアプリケーションのロゴを参照する URL。

ポリシー URL

プロファイルデータの使用方法について読むために、証明書利用者クライアントがエンドユーザーに提供する URL。

利用規約 URL

証明書利用者の利用規約について読むために、証明書利用者クライアントがエンドユーザーに提供する URL。

Assertion Consumer Service POSTバインディングURL

Assertion Consumer ServiceのPOSTバインディングURL。

Assertion Consumer Service RedirectバインディングURL

Assertion Consumer ServiceのリダイレクトバインディングURL。

ログアウトサービスPOSTバインディングURL

ログアウトサービスのPOSTバインディングURL。

ログアウトサービスRedirectバインディングURL

ログアウトサービスのリダイレクトバインディングURL。

ログアウトサービスArtifactバインディングURL

ログアウトサービスのArtifactバインディングURL。Artifactバインディングを強制オプションと一緒に設定すると、ログインフローとログアウトフローの両方でArtifactバインディングが強制されます。このプロパティが設定されていない限り、Artifactバインディングはログアウトには使用されません。

ログアウトサービスSOAPバインディングURL

ログアウトサービスのリダイレクトバインディングURL。バックチャネルログアウトが使用されている場合にのみ適用可能です。

ArtifactバインディングURL

HTTPアーティファクトメッセージを送信するURL。

Artifact Resolution Service

ArtifactResolveメッセージを送信するクライアントSOAPエンドポイントのURL。

IDP開始ログイン

IDP開始ログインは、特定のアプリケーション/クライアントにログインするためのエンドポイントをKeycloakサーバーに設定できる機能です。クライアントの設定タブで、IDP開始SSO URL名を指定する必要があります。これは、空白を含まないシンプルな文字列です。その後、次のURLでクライアントを参照できます。root/realms/{realm-name}/protocol/saml/clients/{url-name}

IDP開始ログインの実装では、REDIRECTバインディングよりもPOSTを優先します(詳細についてはSAMLバインディングを確認してください)。したがって、最終的なバインディングとSP URLは次の方法で選択されます。

  1. 特定のAssertion Consumer Service POSTバインディングURLが定義されている場合(クライアント設定の詳細SAMLエンドポイント設定セクション内)、POSTバインディングはそのURLを通じて使用されます。

  2. 一般的なマスターSAML処理URLが指定されている場合、POSTバインディングはこの一般的なURL全体で再度使用されます。

  3. 最後の手段として、Assertion Consumer Service RedirectバインディングURLが構成されている場合(詳細SAMLエンドポイント設定内)、REDIRECTバインディングがこのURLで使用されます。

クライアントが特別なリレー状態を必要とする場合は、設定タブのIDP開始SSOリレー状態フィールドでこれを構成することもできます。または、ブラウザはRelayStateクエリパラメーターでリレー状態を指定できます。例:root/realms/{realm-name}/protocol/saml/clients/{url-name}?RelayState=thestate

アイデンティティブローカリングを使用する場合、外部IDPからクライアントへのIDP開始ログインを設定できます。実際のクライアントは、上記のようにブローカーIDPでIDP開始ログイン用に設定されます。外部IDPは、ブローカーへの特別なURLを指し、ブローカーIDPで選択されたクライアントのIDP開始ログインエンドポイントを表すアプリケーションIDP開始ログイン用にクライアントを設定する必要があります。これは、外部IDPのクライアント設定で次のことを意味します。

  • IDP開始SSO URL名は、IDP開始ログインの開始点として公開される名前に設定されます。

  • 詳細SAMLエンドポイント設定セクションのAssertion Consumer Service POSTバインディングURLは、次のURLに設定する必要があります。broker-root/realms/{broker-realm}/broker/{idp-name}/endpoint/clients/{client-id}。ここで、

    • broker-rootはベースブローカーURL

    • broker-realmは外部IDPが宣言されているブローカーのレルムの名前

    • idp-nameはブローカーでの外部IDPの名前

    • client-idはブローカーで定義されたSAMLクライアントのIDP開始SSO URL名属性の値です。外部IDPからのIDP開始ログインに使用可能になるのは、このクライアントです。

ブローカーIDPから外部IDPのクライアント設定に基本的なクライアント設定をインポートできることに注意してください。ブローカーIDPのアイデンティティプロバイダーの設定から利用可能なSP記述子を使用し、エンドポイントURLにclients/client-idを追加するだけです。

エンティティ記述子を使用したクライアントの作成

SAML 2.0クライアントを手動で登録する代わりに、標準のSAMLエンティティ記述子XMLファイルを使用してクライアントをインポートできます。

クライアントページには、クライアントのインポートオプションが含まれています。

クライアントを追加

Import SAML client

手順
  1. 参照をクリックします。

  2. XMLエンティティ記述子情報を含むファイルをロードします。

  3. 情報を見直して、すべてが正しく設定されていることを確認します。

mod-auth-mellonなどの一部のSAMLクライアントアダプターは、IDPのXMLエンティティ記述子を必要とします。この記述子は、次のURLにアクセスすると見つけることができます。

root/realms/{realm-name}/protocol/saml/descriptor

ここで、realmはクライアントのレルムです。

あるクライアントから別のクライアントにリンクするために、Keycloakはリダイレクトエンドポイント/realms/realm_name/clients/{client-id}/redirectを提供します。

クライアントがHTTP GETリクエストを使用してこのエンドポイントにアクセスすると、Keycloakは、レスポンスのLocationヘッダーにHTTP 307(一時的なリダイレクト)の形式で、提供されたクライアントとレルム用に構成されたベースURLを返します。この結果、クライアントはレルム名とクライアントIDのみを知っていれば、それらにリンクできます。この間接参照により、クライアントベースURLのハードコーディングが回避されます。

例として、レルムmasterとクライアントIDaccountが与えられた場合

http://host:port/realms/master/clients/account/redirect

このURLは一時的にhttp://host:port/realms/master/accountにリダイレクトします。

OIDCトークンおよびSAMLアサーションマッピング

IDトークン、アクセストークン、またはSAMLアサーションを受信するアプリケーションは、異なるロールとユーザーメタデータを必要とする場合があります。

Keycloakを使用して次のことができます。

  • ロール、クレーム、およびカスタム属性をハードコードします。

  • ユーザーメタデータをトークンまたはアサーションにプルします。

  • ロールの名前を変更します。

これらのアクションは、管理コンソールのマッパータブで実行します。

マッパータブ

mappers oidc

新しいクライアントには組み込みマッパーはありませんが、クライアントスコープから一部のマッパーを継承できます。詳細については、クライアントスコープセクションを参照してください。

プロトコルマッパーは、アイテム(たとえば、メールアドレスなど)をアイデンティティトークンおよびアクセストークン内の特定のクレームにマッピングします。マッパーの機能は、その名前から自明であるはずです。組み込みを追加をクリックして、事前構成済みのマッパーを追加します。

各マッパーには、共通設定のセットがあります。マッパータイプに応じて、追加の設定も利用できます。マッパーの横にある編集をクリックして、これらの設定を調整するための構成画面にアクセスします。

マッパー構成

mapper config

各オプションの詳細については、そのツールチップにカーソルを合わせると表示できます。

ほとんどのOIDCマッパーを使用して、クレームの配置場所を制御できます。IDトークンに追加スイッチとアクセストークンに追加スイッチを調整することにより、クレームをidトークンおよびaccessトークンに含めるか除外するかを選択できます。

マッパータイプは、次の方法で追加できます。

手順
  1. マッパータブに移動します。

  2. 新しいマッパーを構成をクリックします。

    マッパーを追加

    add mapper

  3. リストボックスからマッパータイプを選択します。

優先順序

マッパー実装には優先順序があります。優先順序は、マッパーの構成プロパティではありません。それはマッパーの具体的な実装のプロパティです。

マッパーは、マッパーリストの順序でソートされます。トークンまたはアサーションの変更は、その順序で適用され、最も低いものが最初に適用されます。したがって、他の実装に依存する実装は、必要な順序で処理されます。

たとえば、トークンに含まれるロールを計算するには、

  1. これらのロールに基づいてオーディエンスを解決します。

  2. トークンですでに利用可能なロールとオーディエンスを使用するJavaScriptスクリプトを処理します。

OIDCユーザーセッションノートマッパー

ユーザーセッションの詳細はマッパーを使用して定義され、クライアントで機能を使用または有効にすると自動的に含まれます。セッションの詳細を含めるには、組み込みを追加をクリックします。

偽装されたユーザーセッションは、次の詳細を提供します。

  • IMPERSONATOR_ID:偽装ユーザーのID。

  • IMPERSONATOR_USERNAME:偽装ユーザーのユーザー名。

サービスアカウントセッションは、次の詳細を提供します。

  • clientId:サービスアカウントのクライアントID。

  • client_id:サービスアカウントのクライアントID。

  • clientAddress:サービスアカウントの認証済みデバイスのリモートホストIP。

  • clientHost:サービスアカウントの認証済みデバイスのリモートホスト名。

スクリプトマッパー

スクリプトマッパーを使用して、ユーザー定義のJavaScriptコードを実行することにより、クレームをトークンにマッピングします。サーバーへのスクリプトのデプロイの詳細については、JavaScriptプロバイダーを参照してください。

スクリプトがデプロイされると、デプロイされたスクリプトを使用可能なマッパーのリストから選択できるようになるはずです。

ペアワイズサブジェクト識別子マッパー

サブジェクトクレームsubは、デフォルトのクライアントスコープbasicサブジェクト(sub)プロトコルマッパーによってデフォルトでマッピングされます。

ペアワイズサブジェクト識別子などのプロトコルマッパーを使用してペアワイズサブジェクト識別子を使用するには、basicクライアントスコープからサブジェクト(sub)プロトコルマッパーを削除できます。ただし、サブジェクト(sub)プロトコルマッパーはペアワイズサブジェクト識別子マッパーの前に実行されるため、ペアワイズ値はサブジェクトマッパーによって追加された値をオーバーライドするため、厳密には必要ありません。これは、サブジェクトマッパーの優先度によるものです。したがって、組み込みのサブジェクト(sub)マッパーを削除することの唯一の利点は、効果がない可能性のあるプロトコルマッパーの使用を回避することにより、パフォーマンスを少し節約することである可能性があります。

軽量アクセストークンの使用

Keycloak のアクセストークンには、個人識別情報 (PII) を含む機密情報が含まれています。したがって、リソースサーバーがクライアントなどのサードパーティエンティティにこのタイプの情報を開示したくない場合、Keycloak はアクセストークンから PII を削除する軽量アクセストークンをサポートしています。さらに、リソースサーバーがアクセストークンから削除された PII を取得する場合、アクセストークンを Keycloak のトークンイントロスペクションエンドポイントに送信することで PII を取得できます。

軽量アクセストークンから削除できない情報

プロトコルマッパーは、アクセストークンにどのような情報を付与するかを制御でき、軽量アクセストークンはプロトコルマッパーを使用します。したがって、以下の情報は軽量アクセスから削除できません。
expiatjtiisstypazpsidscopecnf

Keycloak での軽量アクセストークンの使用

クライアントポリシーuse-lightweight-access-token エグゼキューターをクライアントに適用することにより、クライアントはアクセストークンの代わりに軽量アクセストークンを受信できます。軽量アクセストークンには、プロトコルマッパーによって制御されるクレームが含まれており、その設定 Add to lightweight access token (デフォルト OFF) が ON になっています。また、プロトコルマッパーの Add to token introspection 設定を ON にすることで、クライアントはアクセストークンを Keycloak のトークンイントロスペクションエンドポイントに送信してクレームを取得できます。

イントロスペクションエンドポイント

場合によっては、Accept: application/json の代わりに HTTP ヘッダー Accept: application/jwt を使用してトークンイントロスペクションエンドポイントをトリガーすると便利な場合があります。これは特に軽量アクセストークンに役立ちます。詳細については、セキュアリングアプリセクションのトークンイントロスペクションエンドポイントを参照してください。

クライアントアダプター構成の生成

Keycloak は、アプリケーションのデプロイ環境にクライアントアダプターをインストールするために使用できる構成ファイルを生成できます。OIDC および SAML 用に多数のアダプタータイプがサポートされています。

  1. アクションメニューをクリックし、アダプター構成のダウンロードオプションを選択します。

    client installation

  2. 構成を生成するフォーマットオプションを選択します。

OIDC および SAML 用のすべての Keycloak クライアントアダプターがサポートされています。標準の SAML エンティティ記述子ファイルだけでなく、SAML 用の mod-auth-mellon Apache HTTPD アダプターもサポートされています。

クライアントスコープ

Keycloak を使用して、クライアントスコープと呼ばれるエンティティで共有クライアント構成を定義します。クライアントスコープは、複数のクライアントに対してプロトコルマッパーロールスコープマッピングを構成します。

クライアントスコープは、OAuth 2 scope パラメーターもサポートしています。クライアントアプリケーションはこのパラメーターを使用して、アプリケーションの要件に応じて、アクセストークン内のクレームまたはロールを要求します。

クライアントスコープを作成するには、以下の手順に従います。

  1. メニューのクライアントスコープをクリックします。

    クライアントスコープリスト

    client scopes list

  2. 作成をクリックします。

  3. クライアントスコープに名前を付けます。

  4. 保存をクリックします。

クライアントスコープには、通常のクライアントと同様のタブがあります。プロトコルマッパーロールスコープマッピングを定義できます。これらのマッピングは、他のクライアントによって継承でき、このクライアントスコープから継承するように構成されています。

プロトコル

クライアントスコープを作成するときは、プロトコルを選択します。同じスコープにリンクされているクライアントは、同じプロトコルを持っている必要があります。

各レルムには、メニューに事前定義された組み込みクライアントスコープのセットがあります。

  • SAML プロトコル: role_list。このスコープには、SAML アサーションのロールリスト用のプロトコルマッパーが 1 つ含まれています。

  • OpenID Connect プロトコル: いくつかのクライアントスコープが利用可能です。

    • ロール

      このスコープは、OpenID Connect 仕様で定義されておらず、アクセストークンの scope クレームに自動的に追加されません。このスコープにはマッパーがあり、ユーザーのロールをアクセストークンに追加し、少なくとも 1 つのクライアントロールを持つクライアントのオーディエンスを追加するために使用されます。これらのマッパーの詳細については、トークンロールマッピングセクションおよびオーディエンスセクションで説明されています。

    • web-origins

      このスコープも OpenID Connect 仕様で定義されておらず、アクセストークンの scope クレームに追加されません。このスコープは、許可された Web オリジンをアクセストークンの allowed-origins クレームに追加するために使用されます。

    • microprofile-jwt

      このスコープは、MicroProfile/JWT Auth 仕様で定義されているクレームを処理します。このスコープは、upn クレームのユーザープロパティマッパーと、groups クレームのレルムロールマッパーを定義します。これらのマッパーは、MicroProfile/JWT 固有のクレームを作成するために異なるプロパティを使用するように変更できます。

    • offline_access

      このスコープは、クライアントがオフライン トークンを取得する必要がある場合に使用されます。オフライン トークンの詳細については、オフラインアクセスセクションおよびOpenID Connect 仕様で確認できます。

    • profile

    • メール

    • address

    • phone

クライアントスコープ profileemailaddress、および phone は、OpenID Connect 仕様で定義されています。これらのスコープには、ロールスコープマッピングは定義されていませんが、プロトコルマッパーは定義されています。これらのマッパーは、OpenID Connect 仕様で定義されているクレームに対応しています。

たとえば、phone クライアントスコープを開き、マッパータブを開くと、スコープ phone の仕様で定義されているクレームに対応するプロトコルマッパーが表示されます。

クライアントスコープマッパー

client scopes phone

phone クライアントスコープがクライアントにリンクされると、クライアントは phone クライアントスコープで定義されたすべてのプロトコルマッパーを自動的に継承します。このクライアントに発行されたアクセストークンには、ユーザーが電話番号を定義していると仮定して、ユーザーの電話番号情報が含まれます。

組み込みクライアントスコープには、仕様で定義されているプロトコルマッパーが含まれています。クライアントスコープを自由に編集したり、プロトコルマッパーまたはロールスコープマッピングを作成、更新、または削除したりできます。

クライアントスコープには、同意画面に関連するオプションが含まれています。これらのオプションは、リンクされたクライアントでクライアントの同意が必要が有効になっている場合に役立ちます。

同意画面に表示

同意画面に表示が有効になっており、同意が必要なクライアントにスコープが追加されている場合、同意画面テキストで指定されたテキストが同意画面に表示されます。このテキストは、ユーザーが認証され、Keycloak からクライアントにリダイレクトされる前に表示されます。同意画面に表示が無効になっている場合、このクライアントスコープは同意画面に表示されません。

同意画面テキスト

同意が必要なクライアントにこのクライアントスコープが追加されたときに同意画面に表示されるテキストは、デフォルトでクライアントスコープの名前になります。このテキストの値は、${var-name} 文字列を使用した置換変数 を指定することでカスタマイズできます。カスタマイズされた値は、テーマのプロパティファイル内で構成されます。カスタマイズの詳細については、サーバー開発者ガイドを参照してください。

トークンスコープに含める

クライアントスコープには、トークンスコープに含めるスイッチがあります。オンの場合、このクライアントスコープの名前は、アクセストークンプロパティスコープ、およびトークンレスポンスとトークンイントロスペクションエンドポイントレスポンスのクレーム scope に追加されます。オフの場合、このクライアントスコープはトークンとトークンイントロスペクションエンドポイントレスポンスから省略されます。前述のように、一部の組み込みクライアントスコープではこのスイッチが無効になっています。つまり、特定の要求に適用されていても、scope クレームには含まれません。

クライアントスコープとクライアントのリンク

クライアントスコープとクライアント間のリンクは、クライアントのクライアントスコープタブで構成されます。クライアントアプリケーション myclient の場合は次のようになります。

クライアントへのクライアントスコープのリンク

client scopes default

クライアントスコープとクライアント間のリンクには 2 つの方法があります。

デフォルトクライアントスコープ

この設定は、OpenID Connect および SAML クライアントに適用できます。デフォルトクライアントスコープは、クライアントの OpenID Connect トークンまたは SAML アサーションを発行するときに適用されます。クライアントは、クライアントスコープで定義されているプロトコルマッパーとロールスコープマッピングを継承します。OpenID Connect プロトコルの場合、マッパーとロールスコープマッピングは、OpenID Connect 認証リクエストの scope パラメーターに使用される値に関係なく、常に適用されます。

オプションのクライアントスコープ

この設定は、OpenID Connect クライアントにのみ適用できます。オプションのクライアントスコープは、このクライアントのトークンを発行するときに適用されますが、OpenID Connect 認証リクエストの scope パラメーターによって要求された場合にのみ適用されます。

この例では、クライアントに profileemail がデフォルトクライアントスコープとしてリンクされており、phoneaddress がオプションのクライアントスコープとしてリンクされていると仮定します。クライアントは、OpenID Connect 認証エンドポイントにリクエストを送信するときに scope パラメーターの値を使用します。

scope=openid phone

scope パラメーターには、スコープ値をスペースで区切った文字列が含まれています。値 openid は、すべての OpenID Connect リクエストに使用されるメタ値です。トークンには、デフォルトクライアントスコープ profileemail、および scope パラメーターによって要求されたオプションのクライアントスコープ phone からのマッパーとロールスコープマッピングが含まれます。

専用クライアントスコープ

すべてのクライアントにリンクされている特別なクライアントスコープがあります。これは専用クライアントスコープであり、特定のクライアントのクライアントスコープタブをクリックすると、常に最初のクライアントスコープとして表示されます。たとえば、クライアント myclient の場合、クライアントスコープは myclient-dedicated として表示されます。このクライアントスコープは、クライアント自体に直接リンクされているプロトコルマッパーとロールスコープマッピングを表します。

専用クライアントスコープをクライアントからリンク解除することはできません。また、この専用クライアントスコープを別のクライアントにリンクすることもできません。言い換えれば、専用クライアントスコープは、単一のクライアントに固有のプロトコルマッパーとロールスコープマッピングにのみ役立ちます。複数のクライアント間で同じプロトコルマッパー構成を共有する場合は、通常、レルムタブのクライアントスコープでクライアントスコープを作成し、この共有クライアントスコープをこの共有構成を適用する必要があるすべてのクライアントにリンクすると便利です。

専用クライアントスコープのスコープタブでは、このクライアントに適用可能なロールスコープマッピングを定義できます。このタブには、フルスコープ許可スイッチも表示されます。このスイッチの詳細については、このセクションおよびこのセクションで説明されています。

管理 REST API および内部 Keycloak ストレージでは、専用クライアントスコープは存在しません。そのプロトコルマッパーとロールスコープマッピングは内部的にクライアント自体にリンクされているためです。専用クライアントスコープは、実際には管理コンソール UI の抽象化にすぎません。

クライアントスコープの評価

マッパータブにはプロトコルマッパーが、スコープタブにはこのクライアントに対して宣言されたロールスコープマッピングが含まれています。これらには、クライアントスコープから継承されたマッパーとスコープマッピングは含まれていません。クライアントのトークンを生成するときに使用される有効なプロトコルマッパー (クライアント自体で定義されたプロトコルマッパーと、リンクされたクライアントスコープから継承されたプロトコルマッパー) と有効なロールスコープマッピングを確認できます。

手順
  1. クライアントのクライアントスコープタブをクリックします。

  2. 評価サブタブを開きます。

  3. 適用するオプションのクライアントスコープを選択します。

これにより、scope パラメーターの値も表示されます。このパラメーターは、アプリケーションから Keycloak OpenID Connect 認証エンドポイントに送信する必要があります。

アプリケーションがKeycloak JavaScript アダプターを使用している場合は、目的の値を持つ scope パラメーターを送信する方法について、そのセクションを参照してください。

特定の選択されたユーザーと、audience パラメーターの特定の値に対して、このクライアントに発行されたアクセストークン、ID トークン、または UserInfo レスポンスがどのように見えるかをシミュレートすることもできます。audience パラメーターは、現在、トークンエクスチェンジグラントでのみサポートされていることに注意してください。他のグラントをシミュレートする場合は、空のままにしておくことをお勧めします。

クライアントスコープの評価

client scopes evaluate

すべての例は、特定のユーザーに対して生成され、特定のクライアントに対して発行され、scope パラメーターの指定された値で発行されます。例には、使用されるすべてのクレームとロールマッピングが含まれています。

クライアントスコープの権限

ユーザーにトークンを発行する場合、クライアントスコープはユーザーが使用することを許可されている場合にのみ適用されます。

クライアントスコープにロールスコープマッピングが定義されていない場合、すべてのユーザーはこのクライアントスコープを使用することが許可されています。ただし、クライアントスコープにロールスコープマッピングが定義されている場合、ユーザーは少なくとも 1 つのロールのメンバーである必要があります。ユーザーロールとクライアントスコープのロールの間には共通部分が必要です。複合ロールは、この共通部分を評価する際に考慮されます。

ユーザーがクライアントスコープを使用することを許可されていない場合、トークンを生成するときにプロトコルマッパーまたはロールスコープマッピングは使用されません。クライアントスコープは、トークンの scope 値に表示されません。

レルムのデフォルトクライアントスコープ

レルムのデフォルトクライアントスコープを使用して、新しく作成されたクライアントに自動的にリンクされるクライアントスコープのセットを定義します。

レルムのデフォルトクライアントスコープを確認するには、管理コンソールの左側にあるクライアントスコープタブをクリックします。割り当てタイプ列で、特定のクライアントスコープを新規作成されたクライアントにデフォルトクライアントスコープまたはオプションクライアントスコープとして追加するかどうかを指定できます。デフォルトおよびオプションクライアントスコープの詳細については、こちらのセクションを参照してください。

クライアントの作成時に、必要に応じてデフォルトクライアントスコープのリンクを解除できます。これはデフォルトロールの削除と同様です。

スコープについて

スコープという用語は、Keycloak 内および OAuth/OIDC 仕様全体で複数の意味を持っています。以下は、Keycloak で使用されるさまざまなスコープの説明です。

クライアントスコープ

クライアントスコープは、レルムレベルで設定され、クライアントにリンクできる Keycloak のエンティティです。クライアントスコープは、scope パラメーターの対応する値とともに Keycloak 認証エンドポイントにリクエストが送信されるときに、その名前で参照されます。詳細については、クライアントスコープのリンクセクションを参照してください。

ロールスコープマッピング

これは、クライアントまたはクライアントスコープのスコープタブの下にあります。ロールスコープマッピングを使用して、アクセストークンで使用できるロールを制限します。詳細については、ロールスコープマッピングセクションを参照してください。

認可スコープ

認可スコープは、アプリケーションで実行できるアクションを対象としています。詳細については、認可サービスガイドを参照してください。

クライアントポリシー

クライアントアプリケーションを容易にセキュアにするために、以下の点を統一的な方法で実現することが有益です。

  • クライアントが持つことができる設定に関するポリシーの設定

  • クライアント設定の検証

  • Financial-grade API (FAPI) や OAuth 2.1 などの必要なセキュリティ標準およびプロファイルへの準拠

これらの点を統一的な方法で実現するために、クライアントポリシーの概念が導入されました。

ユースケース

クライアントポリシーは、以下に言及されている点を実現します。

クライアントが持つことができる設定に関するポリシーの設定

クライアントに関する構成設定は、クライアントの作成/更新時だけでなく、特定のクライアントに関連する Keycloak サーバーへの OpenID Connect リクエスト時にも、クライアントポリシーによって強制できます。Keycloak は、アプリケーションとサービスの保護ガイドクライアント登録サービスで説明されているクライアント登録ポリシーを通じて、同様のことをサポートしています。ただし、クライアント登録ポリシーは、OIDC Dynamic Client Registration のみを対象とすることができます。クライアントポリシーは、クライアント登録ポリシーができることだけでなく、他のクライアント登録および構成方法も対象としています。現在の計画では、クライアント登録はクライアントポリシーに置き換えられる予定です。

クライアント設定の検証

Keycloak は、クライアントが Proof Key for Code Exchange、Request Object Signing Algorithm、Holder-of-Key Token などの設定に準拠しているかどうかを、認証エンドポイント、トークンエンドポイントなどの一部のエンドポイントで検証することをサポートしています。これらは、各設定項目(管理コンソール、スイッチ、プルダウンメニューなど)で指定できます。クライアントアプリケーションをセキュアにするためには、管理者は多くの設定を適切な方法で設定する必要があり、管理者がクライアントアプリケーションをセキュアにすることが困難になっています。クライアントポリシーは、上記で言及したクライアント構成のこれらの検証を実行でき、高度なセキュリティ要件を満たすために一部のクライアント構成スイッチを自動構成するためにも使用できます。将来的には、個々のクライアント構成設定は、必要な検証を直接実行するクライアントポリシーに置き換えられる可能性があります。

FAPI や OAuth 2.1 などの必要なセキュリティ標準およびプロファイルへの準拠

グローバルクライアントプロファイルは、Keycloak でデフォルトで事前構成されているクライアントプロファイルです。これらは、アプリケーションの保護セクションの FAPIOAuth 2.1 などの標準セキュリティプロファイルに準拠するように事前構成されており、管理者にとっては、特定のセキュリティプロファイルに準拠するようにクライアントアプリケーションをセキュアにすることが容易になります。現時点では、Keycloak には FAPI および OAuth 2.1 仕様をサポートするためのグローバルプロファイルがあります。管理者は、どのクライアントが FAPI および OAuth 2.1 に準拠する必要があるかを指定するためにクライアントポリシーを構成するだけで済みます。管理者は、クライアントプロファイルとクライアントポリシーを構成することで、Keycloak クライアントを SPA、ネイティブアプリ、オープンバンキングなどのさまざまな他のセキュリティプロファイルに簡単に準拠させることができます。

プロトコル

クライアントポリシーの概念は、特定のプロトコルに依存しません。Keycloak は現在、特にOpenID Connect (OIDC) プロトコルのクライアントプロファイルをサポートしていますが、SAML プロトコル用のクライアントプロファイルも利用可能です。

アーキテクチャ

クライアントポリシーは、条件、実行者、プロファイル、ポリシーの4つの構成要素で構成されています。

条件

条件は、ポリシーがどのクライアントに採用されるか、およびいつ採用されるかを決定します。一部の条件はクライアントの作成/更新時にチェックされ、他の条件はクライアントリクエスト(OIDC 認証リクエスト、トークンエンドポイントリクエストなど)中にチェックされます。条件は、指定された基準の1つが満たされているかどうかをチェックします。たとえば、一部の条件は、クライアントのアクセスの種類が confidential であるかどうかをチェックします。

条件は単独で使用することはできません。後述するポリシーで使用できます。

条件は、他の構成可能なプロバイダーと同じように構成可能です。構成できる内容は、各条件の性質によって異なります。

以下の条件が提供されています。

クライアントの作成/更新方法
  • Dynamic Client Registration(匿名または初期アクセストークンまたは登録アクセストークンによる認証)

  • Admin REST API(管理コンソールなど)

たとえば、クライアントを作成する場合、初期アクセストークンなしの OIDC Dynamic Client Registration(匿名 Dynamic Client Registration)によってこのクライアントが作成された場合に true と評価されるように条件を構成できます。したがって、この条件は、たとえば、OIDC Dynamic Client Registration を介して登録されたすべてのクライアントが FAPI または OAuth 2.1 に準拠していることを保証するために使用できます。

クライアントの作成者(特定のロールまたはグループへの存在によってチェックされます)

OpenID Connect ダイナミッククライアント登録では、クライアントの作成者は、新しいクライアントを生成するためのアクセストークンを取得するために認証されたエンドユーザーであり、アクセストークンを使用して登録エンドポイントに実際にアクセスする既存のクライアントのサービスアカウントではありません。Admin REST API による登録では、クライアントの作成者は Keycloak の管理者のようなエンドユーザーです。

クライアントアクセスタイプ(confidential、public、bearer-only)

たとえば、クライアントが認証リクエストを送信する場合、このクライアントが confidential であればポリシーが採用されます。Confidential クライアントはクライアント認証が有効になっており、public クライアントはクライアント認証が無効になっています。Bearer-only は非推奨のクライアントタイプです。

クライアントスコープ

クライアントが特定のクライアントスコープを持っている場合(デフォルトとして、または現在のリクエストで使用されるオプションスコープとして)に true と評価されます。これは、たとえば、スコープ fapi-example-scope を持つ OIDC 認証リクエストが FAPI に準拠している必要があることを保証するために使用できます。

クライアントロール

指定された名前のクライアントロールを持つクライアントに適用されます。通常、リクエストされたクライアントに指定された名前のクライアントロールを作成し、それを「マーカーロール」として使用して、指定されたクライアントポリシーがリクエストされたクライアントに適用されるようにすることができます。

ユースケースは、my-client-1my-client-2 などの指定されたクライアントに特定のクライアントポリシーの適用を要求するためにしばしば存在します。この結果を達成するための最良の方法は、ポリシーでクライアントロール条件を使用し、次にリクエストされたクライアントに指定された名前のクライアントロールを作成することです。このクライアントロールは、特定のクライアントに対する特定のクライアントポリシーをマークするためだけに使用される「マーカーロール」として使用できます。
クライアントドメイン名、ホストまたは IP アドレス

クライアントの特定のドメイン名に適用されます。または、管理者が特定のホストまたは IP アドレスからクライアントを登録/更新する場合にも適用されます。

クライアント属性

指定された名前と値のクライアント属性を持つクライアントに適用されます。複数のクライアント属性を指定すると、それらは AND 条件を使用して評価されます。OR 条件を使用して評価する場合は、この条件を複数回設定します。

すべてのクライアント

この条件は常に true と評価されます。これは、たとえば、特定のレルム内のすべてのクライアントが FAPI に準拠していることを保証するために使用できます。

ACR 条件

認証リクエストでリクエストされた ACR 値が条件で構成された値と一致する場合に適用されます。たとえば、リクエストされた ACR 値に基づいて認証フローを選択するために使用できます。詳細については、関連ドキュメントおよび公式 OIDC 仕様を参照してください。

グラントタイプ

特定のグラントタイプが使用されている場合に true と評価されます。たとえば、特定のクライアントスコープがリクエストされたときにトークン交換リクエストをブロックするために、クライアントスコープと組み合わせて使用できます。

実行者

実行者は、ポリシーが採用されたクライアントに対して実行されるアクションを指定します。実行者は、1つまたは複数の指定されたアクションを実行します。たとえば、一部の実行者は、認証リクエストのパラメーター redirect_uri の値が認証エンドポイントで事前登録されたリダイレクト URI の1つと完全に一致するかどうかをチェックし、一致しない場合はこのリクエストを拒否します。

実行者は単独で使用することはできません。後述するプロファイルで使用できます。

実行者は、他の構成可能なプロバイダーと同じように構成可能です。構成できる内容は、各実行者の性質によって異なります。

実行者は、さまざまなイベントに対して動作します。実行者の実装は、特定のタイプのイベントを無視できます(たとえば、OIDC request オブジェクトをチェックする実行者は、OIDC 認証リクエストでのみ動作します)。イベントは次のとおりです。

  • クライアントの作成(ダイナミッククライアント登録による作成を含む)

  • クライアントの更新

  • 認証リクエストの送信

  • トークンリクエストの送信

  • トークンリフレッシュリクエストの送信

  • トークン失効リクエストの送信

  • トークンイントロスペクションリクエストの送信

  • ユーザーインフォリクエストの送信

  • リフレッシュトークンを使用したログアウトリクエストの送信(リフレッシュトークンを使用したログアウトは、仕様でサポートされていない Keycloak 独自の機能であることに注意してください。代わりに、公式 OIDC ログアウトに依存することをお勧めします)。

各イベントで、実行者は複数のフェーズで動作できます。たとえば、クライアントの作成/更新時に、実行者は特定のクライアント設定を自動構成することにより、クライアント構成を変更できます。その後、実行者は検証フェーズでこの構成を検証します。

この実行者のいくつかの目的の1つは、FAPI や OAuth 2.1 などのクライアント準拠プロファイルのセキュリティ要件を実現することです。そのためには、次の実行者が必要です。

  • セキュアなクライアント認証方式がクライアントに使用されていることを強制する

  • Holder-of-key トークンが使用されていることを強制する

  • Proof Key for Code Exchange (PKCE)が使用されていることを強制する

  • 署名付き JWT クライアント認証 (private-key-jwt)にセキュアな署名アルゴリズムが使用されていることを強制する

  • HTTPS リダイレクト URI を強制し、構成されたリダイレクト URI にワイルドカードが含まれていないことを確認する

  • 高度なセキュリティレベルを満たす OIDC request オブジェクトを強制する

  • FAPI 1 仕様で説明されているように、デタッチ署名として使用される ID トークンを含む OIDC ハイブリッドフローの応答タイプを強制する。これは、認証応答から返される ID トークンにユーザープロファイルデータが含まれないことを意味します。

  • CSRF を防止するためのよりセキュアな state および nonce パラメーター処理を強制する

  • クライアント登録時によりセキュアな署名アルゴリズムを強制する

  • CIBA リクエストに binding_message パラメーターが使用されていることを強制する

  • クライアントシークレットローテーションを強制する

  • クライアント登録アクセストークンを強制する

  • UK OpenBanking のように、アクセストークンを取得するための認証コードフローを開始する前にインテントが発行されるユースケースで、クライアントがインテントが発行されたクライアントであるかどうかをチェックすることを強制する

  • 暗黙的およびハイブリッドフローを禁止することを強制する

  • PAR リクエストに認証リクエストによって含まれる必要なパラメーターが含まれているかどうかをチェックすることを強制する

  • DPoP バインドトークンが使用されていることを強制する (dpop 機能が有効になっている場合に使用可能)

  • 軽量アクセストークンの使用を強制する

  • リフレッシュトークンローテーションがスキップされ、リフレッシュトークンレスポンスからリフレッシュトークンが返されないことを強制します。

  • OAuth 2.1 仕様で要求されている有効なリダイレクト URI を強制します。

  • SAML リダイレクトバインディングが使用できないか、SAML リクエストとアサーションが署名されていることを強制します。

もう 1 つの利用可能な executor は auth-flow-enforce であり、認証リクエスト中に認証フローを強制するために使用できます。たとえば、特定のスコープや ACR 値などの特定の条件に基づいてフローを選択するために使用できます。詳細については、関連ドキュメントを参照してください。

プロファイル

プロファイルはいくつかの executor で構成されており、FAPI や OAuth 2.1 などのセキュリティプロファイルを実現できます。プロファイルは、Admin REST API(Admin Console)とその executor とともに構成できます。3 つのグローバルプロファイルが存在し、FAPI 1 Baseline、FAPI 1 Advanced、FAPI CIBA、FAPI 2、および OAuth 2.1 仕様に準拠した事前構成済みの executor とともに Keycloak でデフォルトで構成されています。詳細については、アプリの保護セクションの FAPI および OAuth 2.1 を参照してください。

ポリシー

ポリシーは、いくつかの条件とプロファイルで構成されています。ポリシーは、このポリシーのすべての条件を満たすクライアントに適用できます。ポリシーはいくつかのプロファイルを参照し、これらのプロファイルのすべての executor は、このポリシーが適用されるクライアントに対してタスクを実行します。

構成

ポリシー、プロファイル、条件、executor は Admin REST API(Admin Console も含む)によって構成できます。これを行うには、レルムレルム設定クライアントポリシー タブがあります。これは、管理者がレルムごとにクライアントポリシーを持つことができることを意味します。

グローバルクライアントプロファイルは、各レルムで自動的に利用可能です。ただし、デフォルトではクライアントポリシーは構成されていません。これは、管理者がレルムのクライアントを FAPI 準拠にしたい場合など、常にクライアントポリシーを作成する必要があることを意味します。グローバルプロファイルは更新できませんが、管理者はテンプレートとして簡単に使用して、グローバルプロファイル構成にわずかな変更を加えたい場合に独自のプロファイルを作成できます。Admin Console には JSON エディターがあり、グローバルプロファイルに基づいて新しいプロファイルを簡単に作成できます。

後方互換性

クライアントポリシーは、Securing applications Guidesクライアント登録サービス で説明されているクライアント登録ポリシーを置き換えることができます。ただし、クライアント登録ポリシーも依然として共存しています。これは、たとえば、クライアントを作成/更新するための動的クライアント登録リクエスト中に、クライアントポリシーとクライアント登録ポリシーの両方が適用されることを意味します。

現在の計画では、クライアント登録ポリシー機能を削除し、既存のクライアント登録ポリシーは新しいクライアントポリシーに自動的に移行される予定です。

クライアントシークレットローテーションの例

クライアントシークレットローテーションの構成例を参照してください。

検証可能なクレデンシャル発行者としての Keycloak の構成

これは実験的な機能であり、本番環境で使用すべきではありません。後方互換性は保証されておらず、将来のアップデートで破壊的な変更が導入される可能性があります。

Keycloak は、OpenID for Verifiable Credential Issuance の実験的サポートを提供しています。

はじめに

この章では、OpenID for Verifiable Credential Issuance (OID4VCI) プロトコルを使用して、Keycloak を検証可能なクレデンシャル発行者として構成するためのステップバイステップの手順を説明します。分散型アイデンティティソリューションをサポートし、検証可能なクレデンシャル (VC) を安全に発行および管理するための Keycloak インスタンスのセットアッププロセスを概説します。

検証可能なクレデンシャル (VC) とは何ですか?

検証可能なクレデンシャル (VC) は、人、組織、デバイスなどのエンティティに関する主張を表す、暗号署名された、改ざん防止データ構造です。これらは分散型アイデンティティシステムの基礎であり、中央集権的な権限に依存せずに、安全でプライバシーを保護したアイデンティティ検証を可能にします。VC は、選択的開示やゼロ知識証明などの高度な機能をサポートし、ユーザーのプライバシーとセキュリティを強化します。

OID4VCI とは何ですか?

OpenID for Verifiable Credential Issuance (OID4VCI) は、OpenID Connect (OIDC) プロトコルの拡張機能です。クレデンシャル発行者が VC をホルダーに配信し、ホルダーがそれを検証者に提示できる標準化された相互運用可能なフレームワークを定義します。OID4VCI は、Keycloak の既存の認証および認可機能を活用して、VC 発行を効率化します。

この章の範囲

この章では、次の技術的な構成について説明します。

  • VC 発行専用のレルムの作成。

  • クレデンシャルテスト用のテストユーザーのセットアップ。

  • VC の署名と暗号化のためのカスタム暗号化キーの構成。

  • VC メタデータを指定するためのレルム属性の定義。

  • VC にユーザー属性を含めるためのクライアントスコープとマッパーの確立。

  • VC リクエストを処理するためのクライアントの登録。

  • VC フォーマット用のクレデンシャルビルダーの構成。

  • 発行者メタデータエンドポイントを使用した構成の検証。

前提条件

Keycloak を検証可能なクレデンシャル発行者として構成する前に、次の要件が満たされていることを確認してください。

Keycloak インスタンス

OID4VCI 機能が有効になっている実行中の Keycloak サーバー。

機能を有効にするには、次のフラグを起動コマンドに追加します。

--features=oid4vc-vci

サーバーログで OID4VC_VCI 初期化メッセージをチェックして、アクティベーションを確認します。

認証

API リクエストを認証するには、アクセストークンが必要です。

詳細な手順については、次の Keycloak ドキュメントセクションを参照してください。

構成手順

Keycloak を検証可能なクレデンシャル発行者として構成するには、次の手順に従います。各セクションでは、手順、説明、および該当する場合は例を詳しく説明します。

レルムの作成

Keycloak のレルムは、ユーザー、クライアント、ロール、および認証フローを管理する論理コンテナです。検証可能なクレデンシャル (VC) の発行には、分離を確実にするために専用のレルムを作成し、機能の明確な分離を維持します。

レルムの作成に関する詳細な手順については、Keycloak ドキュメントの レルムの作成 を参照してください。

ユーザーアカウントの作成

テストユーザーは、クレデンシャル発行をシミュレートし、セットアップを検証するために必要です。

ユーザーの作成に関するステップバイステップの手順については、Keycloak ドキュメントの ユーザーの作成 を参照してください。

ユーザーが有効なユーザー名、メールアドレス、およびパスワードを持っていることを確認してください。パスワードを初回ログイン時にリセットしない場合は、パスワード構成中に「一時的」トグルを無効にします。

キー管理構成

Keycloak は、検証可能なクレデンシャル (VC) の署名と暗号化に暗号化キーを使用します。安全で標準に準拠した発行を確実にするために、キーストアを使用して、署名に ECDSA (ES256)署名に RSA (RS256)、および 暗号化に RSA-OAEP を構成します。

レルムキーの構成に関する詳細なガイドについては、Keycloak ドキュメントの レルムキーの管理 を参照してください。

キープロバイダーの構成

VC 発行の暗号化操作を有効にするには

  • ECDSA (ES256) キー: ES256 アルゴリズムで VC に署名するために使用されます。

  • RSA (RS256) キー: RS256 を使用した代替署名メカニズム。

  • RSA-OAEP キー: VC の機密データを暗号化するために使用されます。

各キーは、レルム設定 > キー セクション内で java-keystore プロバイダーとして登録する必要があります。その際、次のことを確認してください。 - キーストアファイルが正しく指定され、安全に保管されていること。 - 適切なアルゴリズム (ES256、RS256、または RSA-OAEP) が選択されていること。 - キーがアクティブで有効になっており、正しい用途 (署名または暗号化) で構成されていること。 - キー間の優先順位を定義するために優先順位の値が設定されていること。

キーストアファイルが 安全に保管 され、Keycloak サーバーからアクセスできることを確認してください。キーストアと秘密鍵の両方を保護するために、強力なパスワードを使用してください。

レルム属性の登録

レルム属性は、有効期限、サポートされている形式、スコープ定義など、検証可能なクレデンシャル (VC) のメタデータを定義します。これらの属性により、Keycloak は事前定義された設定で VC を発行できます。

Keycloak Admin Console は属性の直接作成をサポートしていないため、Keycloak Admin REST API を使用してこれらの属性を構成します。

レルム属性の定義

次の内容で JSON ファイル (例: realm-attributes.json) を作成します。

{
  "realm": "oid4vc-vci",
  "enabled": true,
  "preAuthorizedCodeLifespanS": 120,
  "issuerDid": "https://#:8443/realms/oid4vc-vci",
  "attributes": {
    "vc.IdentityCredential.expiry_in_s": "31536000",
    "vc.IdentityCredential.format": "vc+sd-jwt",
    "vc.IdentityCredential.scope": "identity_credential",
    "vc.IdentityCredential.vct": "https://credentials.example.com/identity_credential",
    "vc.SteuerberaterCredential.expiry_in_s": "31536000",
    "vc.SteuerberaterCredential.format": "vc+sd-jwt",
    "vc.SteuerberaterCredential.scope": "stbk_westfalen_lippe",
    "vc.SteuerberaterCredential.vct": "stbk_westfalen_lippe",
    "vc.SteuerberaterCredential.cryptographic_binding_methods_supported": "jwk"
  }
}

これは 構成例 です。特定の要件に応じて、追加の属性を定義できます。例: - さまざまな VC タイプとスコープ。 - 代替クレデンシャル形式。 - カスタム暗号化設定。

属性の内訳

  • preAuthorizedCodeLifespanS – 事前承認コードの有効期間 (秒単位) を定義します。

  • issuerDid – 発行者の分散型識別子 (DID)。

  • attributes – VC 固有のメタデータを含みます。必要に応じて 拡張可能 です。

  • expiry_in_s – クレデンシャルの有効期限 (秒単位)。

  • format – VC 形式 (例: vc+sd-jwt) を定義します。

  • scope – クレデンシャルのスコープを識別します。

  • vct検証可能なクレデンシャルタイプ (VCT)

  • cryptographic_binding_methods_supported – サポートされている暗号化メソッド (該当する場合) を指定します。

レルム属性のインポート

次の curl コマンドを使用して、属性を Keycloak にインポートします。

curl -X POST "https://#:8443/admin/realms/oid4vc-vci" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @realm-attributes.json
  • $ACCESS_TOKEN を有効な Keycloak Admin API アクセストークン に置き換えます。

  • 本番環境で -k を使用しないでください。代わりに、信頼された TLS 証明書を構成してください。

  • 既存のレルムを更新する場合は、POST の代わりに PUT を使用してください。

マッパーを使用したクライアントスコープの作成

クライアントスコープは、検証可能なクレデンシャル (VC) に含まれる ユーザー属性 を定義します。これらのスコープは、プロトコルマッパー を使用して特定のクレームを VC にマッピングします。

Keycloak Admin Console はマッパーを使用したクライアントスコープの直接作成をサポートしていないため、Keycloak Admin REST API を使用します。

マッパーを使用したクライアントスコープの定義

次の内容で JSON ファイル (例: client-scopes.json) を作成します。

{
  "name": "vc-scope-mapping",
  "protocol": "openid-connect",
  "attributes": {
    "include.in.token.scope": "false",
    "display.on.consent.screen": "false"
  },
  "protocolMappers": [
    {
      "name": "academic_title-mapper-bsk",
      "protocol": "oid4vc",
      "protocolMapper": "oid4vc-static-claim-mapper",
      "config": {
        "subjectProperty": "academic_title",
        "staticValue": "N/A",
        "supportedCredentialTypes": "stbk_westfalen_lippe"
      }
    }
  ]
}

これは 構成例 です。さまざまなクレームマッピングをサポートするために、追加のプロトコルマッパーを定義できます。例: - 静的な値ではなく動的な属性値。 - クレデンシャルタイプごとの複数の属性のマッピング。 - 代替のサポートされるクレデンシャルタイプ。

属性の内訳

  • name – クライアントスコープの名前。

  • protocol – 標準の OAuth2 ワークフローには openid-connect を使用します。

  • attributes – スコープの可視性と同意の動作を定義します。

  • include.in.token.scope: このスコープをアクセストークンに含めるかどうか。

  • display.on.consent.screen: このスコープをユーザー同意画面に表示するかどうか。

  • protocolMappersクレームのマッピング方法を定義します。

  • name – マッパー識別子。

  • protocol – 検証可能なクレデンシャルには oid4vc を使用します。

  • protocolMapper – クレームマッピング戦略 (例: oid4vc-static-claim-mapper) を指定します。

  • config:

  • subjectProperty – マッピングするユーザー属性。

  • staticValue – 属性がない場合に割り当てられる静的な値。

  • supportedCredentialTypes – このクレームをサポートするクレデンシャルタイプ。

クライアントスコープのインポート

次の curl コマンドを使用して、クライアントスコープを Keycloak にインポートします。

curl -X POST "https://#:8443/admin/realms/oid4vc-vci/client-scopes" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @client-scopes.json
  • $ACCESS_TOKEN を有効な Keycloak Admin API アクセストークン に置き換えます。

  • 本番環境で -k を使用しないでください。代わりに、信頼された TLS 証明書を構成してください。

  • 既存のスコープを更新する場合は、POST の代わりに PUT を使用してください。

OID4VC クライアントの作成

VC リクエストを処理するためのクライアントをセットアップし、必要なスコープを割り当てます。

  1. 次の内容で JSON ファイル (例: oid4vc-rest-api-client.json) を作成します。

    {
      "clientId": "oid4vc-rest-api",
      "enabled": true,
      "protocol": "openid-connect",
      "publicClient": false,
      "serviceAccountsEnabled": true,
      "clientAuthenticatorType": "client-secret",
      "redirectUris": ["https://#:8080/*"],
      "directAccessGrantsEnabled": true,
      "defaultClientScopes": ["profile"],
      "optionalClientScopes": ["vc-scope-mapping"],
      "attributes": {
        "client.secret.creation.time": "1719785014",
        "client.introspection.response.allow.jwt.claim.enabled": "false",
        "login_theme": "keycloak",
        "post.logout.redirect.uris": "https://#:8080"
      }
    }
    • clientId: クライアントの一意の識別子。

    • optionalClientScopes: VC リクエスト用の vc-scope-mapping スコープをリンクします。

  2. 次の curl コマンドを使用してクライアントをインポートします。

    curl -k -X POST "https://#:8443/admin/realms/oid4vc-vci/clients" \
      -H "Authorization: Bearer $ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d @oid4vc-rest-api-client.json

クレデンシャルビルダーコンポーネントの作成

クレデンシャルビルダー は、SD-JWT などの検証可能なクレデンシャル (VC) をフォーマットする役割を担います。このコンポーネントは、Admin REST API を使用して Keycloak に登録する必要があります。

クレデンシャルビルダーの登録

次の curl コマンドを使用して、クレデンシャルビルダーを作成します。

curl -X POST "https://#:8443/admin/realms/oid4vc-vci/components" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "sd-jwt-credentialbuilder",
    "providerId": "vc+sd-jwt",
    "providerType": "org.keycloak.protocol.oid4vc.issuance.credentialbuilder.CredentialBuilder"
  }'
  • $ACCESS_TOKEN を有効な Keycloak Admin API アクセストークン に置き換えます。

  • 本番環境で -k を使用しないでください。代わりに、信頼された TLS 証明書を構成してください。

構成の詳細

  • name – クレデンシャルビルダーの識別子。

  • providerIdVC 形式 (例: vc+sd-jwt) を指定します。

  • providerType – VC 発行に使用される Keycloak クレデンシャルビルダー クラス を指します。

これは 構成例 です。さまざまな VC 形式 (例: JWT、JSON-LD など) 用に 複数のクレデンシャルビルダーを登録 できます。

構成の検証

発行者メタデータエンドポイント にアクセスして、セットアップを検証します。

  1. ブラウザを開くか、curl などのツールを使用して、以下にアクセスします。

    https://#:8443/realms/oid4vc-vci/.well-known/openid-credential-issuer

成功したレスポンスは、次の詳細を含む JSON オブジェクトを返します。 - サポートされているクレーム - クレデンシャル形式 - 発行者メタデータ

結論

OID4VCI プロトコルを使用して、Keycloak を検証可能なクレデンシャル発行者として正常に構成しました。このセットアップは、Keycloak の堅牢な アイデンティティ管理機能を活用して、安全で 標準に準拠した VC を発行します。

完全なリファレンス実装については、サンプルプロジェクト Keycloak SSI Deployment を参照してください。

シークレットを取得するための vault の使用

Keycloak は現在、Vault SPI の 2 つの既製実装を提供しています。プレーンテキストのファイルベースの vault と Java KeyStore ベースの vault です。

シークレットを直接入力するのではなく、vault から取得するには、適切なフィールドに次の特別な形式の文字列を入力します。

${vault.key}

ここで、key は vault で認識されるシークレットの名前です。

レルムを越えてシークレットが漏洩するのを防ぐため、Keycloak はレルム名と、Vault 式から取得した key を組み合わせます。この方法により、key は Vault 内のエントリに直接マップされるのではなく、key とレルム名を組み合わせるために使用されるアルゴリズムに従って最終的なエントリ名が作成されます。ファイルベースの Vault の場合、このような組み合わせは特定のファイル名に反映され、Java KeyStore ベースの Vault の場合は特定エイリアス名に反映されます。

Vault からシークレットを取得できるフィールドは次のとおりです。

SMTP パスワード

レルムの SMTP 設定

LDAP バインドクレデンシャル

LDAP ベースのユーザーフェデレーションの LDAP 設定 内。

OIDC アイデンティティプロバイダーシークレット

アイデンティティプロバイダー OpenID Connect Config 内のクライアントシークレット

キーリゾルバー

すべての組み込みプロバイダーは、キーリゾルバーの設定をサポートしています。キーリゾルバーは、${vault.key} 式から取得したキーとレルム名を組み合わせて、Vault からシークレットを取得するために使用される最終的なエントリ名にするためのアルゴリズムまたは戦略を実装します。Keycloak は、プロバイダーが使用するリゾルバーを設定するために keyResolvers プロパティを使用します。値は、リゾルバー名をカンマ区切りでリストしたものです。files-plaintext プロバイダーの設定例を次に示します。

kc.[sh|bat] start --spi-vault-file-key-resolvers=REALM_UNDERSCORE_KEY,KEY_ONLY

リゾルバーは、構成で宣言した順序で実行されます。各リゾルバーについて、Keycloak はリゾルバーが生成する最後のエントリ名を使用します。これは、レルムと Vault キーを組み合わせて Vault のシークレットを検索します。Keycloak がシークレットを見つけた場合、シークレットを返します。そうでない場合、Keycloak は次のリゾルバーを使用します。この検索は、Keycloak が空でないシークレットを見つけるか、リゾルバーがなくなるまで続行されます。Keycloak がシークレットを見つけられない場合、Keycloak は空のシークレットを返します。

前の例では、Keycloak は最初に REALM_UNDERSCORE_KEY リゾルバーを使用します。Keycloak がそのリゾルバーを使用して Vault 内のエントリを見つけた場合、Keycloak はそのエントリを返します。そうでない場合、Keycloak は KEY_ONLY リゾルバーを使用して再度検索します。Keycloak が KEY_ONLY リゾルバーを使用してエントリを見つけた場合、Keycloak はそのエントリを返します。Keycloak がすべてのリゾルバーを使用した場合、Keycloak は空のシークレットを返します。

現在利用可能なリゾルバーのリストを次に示します。

名前 説明

KEY_ONLY

Keycloak はレルム名を無視し、Vault 式からキーを使用します。Keycloak は、キー内のアンダースコアの出現を別のアンダースコア文字でエスケープします。たとえば、キーが my_secret という名前の場合、Keycloak は my__secret という名前の Vault 内のエントリを検索します。これは、デフォルトの REALM_UNDERSCORE_KEY リゾルバーとの競合を防ぐためです。

REALM_UNDERSCORE_KEY

Keycloak は、アンダースコア文字を使用してレルムとキーを組み合わせます。Keycloak は、レルムまたはキー内のアンダースコアの出現を別のアンダースコア文字でエスケープします。たとえば、レルムが master_realm で、キーが smtp_key の場合、結合されたキーは master__realm_smtp__key になります。

REALM_FILESEPARATOR_KEY

Keycloak は、プラットフォームのファイル区切り文字を使用してレルムとキーを組み合わせます。Vault 式では、パスのトラバーサルを引き起こす可能性のある文字の使用が禁止されているため、対応するレルム外のシークレットへのアクセスを防ぎます。

FACTORY_PROVIDED

Keycloak は、Vault プロバイダーファクトリの VaultKeyResolver を使用してレルムとキーを組み合わせ、既存のファクトリを拡張して getFactoryResolver メソッドを実装することにより、カスタムキーリゾルバーの作成を可能にします。

組み込みプロバイダーのリゾルバーを設定していない場合、Keycloak は REALM_UNDERSCORE_KEY を選択します。

イベントを追跡するための監査の設定

Keycloak には、監査機能スイートが含まれています。すべてのログインと管理者アクションを記録し、Admin Console でそれらのアクションを確認できます。Keycloak には、イベントをリッスンしてアクションをトリガーできるリスナー SPI も含まれています。組み込みリスナーの例としては、ログファイルやイベント発生時のメール送信などがあります。

ユーザーイベントの監査

ユーザーに影響を与えるすべてのイベントを記録および表示できます。Keycloak は、ユーザーのログイン成功、ユーザーが不正なパスワードを入力した場合、またはユーザーアカウントの更新などのアクションに対してログインイベントをトリガーします。デフォルトでは、Keycloak はイベントを保存したり、Admin Console に表示したりしません。エラーイベントのみが Admin Console とサーバーのログファイルに記録されます。

手順

ユーザーイベントの監査を開始するには、次の手順を実行します。

  1. メニューのレルム設定をクリックします。

  2. イベント タブをクリックします。

  3. ユーザーイベント設定 タブをクリックします。

  4. イベントを保存ON に切り替えます。

    ユーザーイベント設定

    User events settings

  5. イベントを保存する期間を 有効期限 フィールドで指定します。

  6. 保存するタイプを追加 をクリックして、保存できる他のイベントを表示します。

    タイプを追加

    Add types

  7. 追加をクリックします。

保存されたすべてのイベントを削除する場合は、ユーザーイベントをクリア をクリックします。

手順

これでイベントを表示できます。

  1. メニューの イベント タブをクリックします。

    ユーザーイベント

    Login Events

  2. イベントをフィルタリングするには、ユーザーイベントを検索 をクリックします。

    ユーザーイベントを検索

    Search user event

イベントタイプ

ログインイベント

イベント 説明

ログイン

ユーザーがログインします。

登録

ユーザーが登録します。

ログアウト

ユーザーがログアウトします。

コードからトークンへ

アプリケーションまたはクライアントが、コードをトークンと交換します。

リフレッシュトークン

アプリケーションまたはクライアントが、トークンをリフレッシュします。

ブルートフォース防御

イベント 説明

永続的なロックアウトによるユーザーの無効化

ブルートフォース防御により、ログイン失敗が多すぎるため、ユーザーアカウントが永続的に無効になりました。

一時的なロックアウトによるユーザーの無効化

ブルートフォース防御により、ログイン失敗が多すぎるため、ユーザーアカウントが一時的に無効になりました。

アイデンティティブローカリング

イベント 説明

フェデレーションアイデンティティリンクのオーバーライド

既存のフェデレーションアイデンティティリンクがオーバーライドされました

フェデレーションアイデンティティリンクのオーバーライドエラー

既存のフェデレーションアイデンティティリンクをオーバーライドしようとしたときにエラーが発生しました

OAuth

イベント 説明

OAuth2 拡張グラント

OAuth2 グラントが実行されました

OAuth2 拡張グラントエラー

OAuth2 グラント実行中にエラーが発生しました

アカウントイベント

イベント 説明

ソーシャルリンク

ユーザーアカウントがソーシャルメディアプロバイダーにリンクします。

ソーシャルリンクの削除

ソーシャルメディアアカウントからユーザーアカウントへのリンクが解除されます。

メールアドレスの更新

アカウントのメールアドレスが変更されます。

プロファイルの更新

プロファイルの更新

パスワードリセットの送信

Keycloak がパスワードリセットメールを送信します。

パスワードの更新 (非推奨)

アカウントのパスワードが変更されます。

クレデンシャルの更新

アカウントのパスワードまたは (時間ベースの) ワンタイムパスワード (OTP/TOTP) 設定が変更されます。

TOTP の更新 (非推奨)

アカウントの時間ベースワンタイムパスワード (TOTP) 設定が変更されます。

TOTP の削除 (非推奨)

Keycloak がアカウントから TOTP を削除します。

クレデンシャルの削除

Keycloak がアカウントからクレデンシャルを削除します。

メールアドレスの確認メールを送信

Keycloak がメールアドレスの確認メールを送信します。

メールアドレスの確認

メールアドレスの確認

各イベントには、対応するエラーイベントがあります。

イベントリスナー

イベントリスナーはイベントをリッスンし、そのイベントに基づいてアクションを実行します。Keycloak には、ロギングイベントリスナーとメールイベントリスナーの 2 つの組み込みリスナーが含まれています。

ロギングイベントリスナー

ロギングイベントリスナーが有効になっている場合、このリスナーはエラーイベントが発生したときにログファイルに書き込みます。

ロギングイベントリスナーからのログメッセージの例

11:36:09,965 WARN  [org.keycloak.events] (default task-51) type=LOGIN_ERROR, realmId=master,
                    clientId=myapp,
                    userId=19aeb848-96fc-44f6-b0a3-59a17570d374, ipAddress=127.0.0.1,
                    error=invalid_user_credentials, auth_method=openid-connect, auth_type=code,
                    redirect_uri=https://#:8180/myapp,
                    code_id=b669da14-cdbb-41d0-b055-0810a0334607, username=admin

ロギングイベントリスナーを使用して、ハッカーボット攻撃から保護できます。

  1. ログファイルで LOGIN_ERROR イベントを解析します。

  2. 失敗したログインイベントの IP アドレスを抽出します。

  3. IP アドレスを侵入防止ソフトウェアフレームワークツールに送信します。

ロギングイベントリスナーは、org.keycloak.events ログカテゴリにイベントを記録します。Keycloak は、デフォルトでは、サーバーログにデバッグログイベントを含めません。

サーバーログにデバッグログイベントを含めるには

  1. org.keycloak.events カテゴリのログレベルを変更します。

  2. ロギングイベントリスナーで使用されるログレベルを変更します。

ロギングイベントリスナーで使用されるログレベルを変更するには、次を追加します。

bin/kc.[sh|bat] start --spi-events-listener-jboss-logging-success-level=info --spi-events-listener-jboss-logging-error-level=error

ログレベルの有効な値は、debuginfowarnerror、および fatal です。

メールイベントリスナー

メールイベントリスナーは、イベントが発生したときにユーザーのメールアドレスにメッセージを送信し、次のイベントをサポートします。

  • ログインエラー。

  • パスワードの更新。

  • 時間ベースのワンタイムパスワード (TOTP) の更新。

  • ワンタイムパスワード (OTP) の削除。

  • クレデンシャルの更新。

  • クレデンシャルの削除。

以下は、構成できるオプションのイベントです。

  • 永続的なロックアウトによるユーザーの無効化。

  • 一時的なロックアウトによるユーザーの無効化。

メールを送信するには、次の条件を満たす必要があります。

  • ユーザーにメールアドレスがある。

  • ユーザーのメールアドレスが検証済みとしてマークされている。

前提条件
  • レルムのメール設定が構成されている。

手順

メールリスナーを有効にするには

  1. メニューのレルム設定をクリックします。

  2. イベント タブをクリックします。

  3. イベントリスナー フィールドをクリックします。

  4. email を選択します。

    イベントリスナー

    Event listeners

--spi-events-listener-email-exclude-events 引数を使用すると、イベントを除外できます。例:

kc.[sh|bat] --spi-events-listener-email-exclude-events=UPDATE_CREDENTIAL,REMOVE_CREDENTIAL

オプションのイベントを有効にするには、次のコマンドを使用します。

kc.[sh|bat] --spi-events-listener-email-include-events=USER_DISABLED_BY_TEMPORARY_LOCKOUT_ERROR,USER_DISABLED_BY_PERMANENT_LOCKOUT

管理者イベントの監査

Admin Console で管理者によって実行されるすべてのアクションを記録できます。Admin Console は、Keycloak REST インターフェイスを呼び出すことによって管理アクションを実行し、Keycloak はこれらの REST 呼び出しを監査します。Admin Console で結果のイベントを表示できます。

手順

管理者アクションの監査を開始するには、次の手順を実行します。

  1. メニューのレルム設定をクリックします。

  2. イベント タブをクリックします。

  3. 管理者イベント設定 タブをクリックします。

  4. イベントを保存ON に切り替えます。

    Keycloak に 表現を含める スイッチが表示されます。

  5. 表現を含めるON に切り替えます。

    Include Representation スイッチは、管理者 REST API を介して送信された JSON ドキュメントを含めるため、管理者のアクションを表示できます。

    管理者イベント設定

    Admin events settings

  6. 保存をクリックします。

  7. 保存されたアクションのデータベースをクリアするには、管理者イベントをクリア をクリックします。

手順

これで管理者イベントを表示できます。

  1. メニューの イベント をクリックします。

  2. 管理者イベント タブをクリックします。

    管理者イベント

    Admin events

Include Representation スイッチが ON の場合、データベースに大量の情報が保存される可能性があります。--spi-events-store-jpa-max-field-length 引数を使用すると、表現の最大長を設定できます。この設定は、基盤となるストレージの制限に準拠する場合に役立ちます。例:

kc.[sh|bat] --spi-events-store-jpa-max-field-length=2500

セキュリティの脅威の軽減

セキュリティの脆弱性は、どの認証サーバーにも存在します。詳細については、Internet Engineering Task Force (IETF) の OAuth 2.0 Threat Model および OAuth 2.0 Security Best Current Practice を参照してください。

ホスト

Keycloak は、トークン発行者フィールドやパスワードリセットメールの URL など、いくつかの方法でパブリックホスト名を使用します。

デフォルトでは、ホスト名はリクエストヘッダーから派生します。ホスト名が有効であることを保証するための検証は存在しません。無効なホストヘッダーを防ぐために、Keycloak でロードバランサーまたはプロキシを使用していない場合は、許容されるホスト名を設定します。

ホスト名のサービスプロバイダーインターフェイス (SPI) は、リクエストのホスト名を設定する方法を提供します。この組み込みプロバイダーを使用すると、フロントエンドリクエストに対して固定 URL を設定しながら、リクエスト URI に基づいてバックエンドリクエストを許可できます。組み込みプロバイダーに必要な機能がない場合は、カスタマイズされたプロバイダーを開発できます。

管理者エンドポイントと Admin Console

Keycloak は、管理 REST API と Web コンソールを非管理用途と同じポートで公開します。外部アクセスが不要な場合は、管理エンドポイントを外部に公開しないでください。

パスワード推測ブルートフォース攻撃

ブルートフォース攻撃は、何度もログインを試行することでユーザーのパスワードを推測しようとします。Keycloak にはブルートフォース検出機能があり、ログイン失敗回数が指定されたしきい値を超えると、ユーザーアカウントを永続的または一時的に無効にすることができます。

ユーザーがロックされ、ログインを試みると、Keycloak はデフォルトの ユーザー名またはパスワードが正しくありません エラーメッセージを表示します。このメッセージは、攻撃者がアカウントが無効になっていることに気付かないようにするために、無効なユーザー名または無効なパスワードに対して表示されるメッセージと同じエラーメッセージです。

ブルートフォース検出はデフォルトで無効になっています。ブルートフォース攻撃から保護するには、この機能を有効にします。

この保護を有効にするには

  1. メニューの レルム設定 をクリックします。

  2. セキュリティ防御タブをクリックします。

  3. ブルートフォース検出 タブをクリックします。

  4. 要件に最適な ブルートフォースモード を選択します。

    ブルートフォース検出

    brute force

永続的なロックアウト

Keycloak は、管理者が再度有効にするまで、ユーザーアカウントを無効にします (ログイン試行をブロックします)。

永久ロックアウト

brute force permanently

永続的なロックアウトパラメーター

名前 説明 デフォルト

最大ログイン失敗回数

最大ログイン失敗回数。

30 回の失敗

クイックログインチェック (ミリ秒)

ログイン試行間の最小時間。

1000 ミリ秒

最小クイックログイン待機

ログイン試行がクイックログインチェックミリ秒よりも速い場合、ユーザーが無効になる最小時間。

1 分

永続的ロックアウトフロー

  1. ログイン成功時

    1. count をリセット

  2. ログイン失敗時

    1. count をインクリメント

    2. count最大ログイン失敗回数 以上の場合

      1. ユーザーをロック

    3. それ以外の場合、今回の失敗と前回の失敗の時間間隔がクイックログインチェックミリ秒未満の場合

      1. 最小クイックログイン待機時間で指定された時間だけユーザーをロック

ユーザーアカウントを有効にすると、count がリセットされます。

一時的なロックアウト

Keycloak は、ユーザーアカウントを特定の期間無効にします。アカウントが無効になる期間は、攻撃が続くにつれて長くなります。

一時的なロックアウト

brute force temporarily

一時的なロックアウトのパラメータ

名前 説明 デフォルト

最大ログイン失敗回数

最大ログイン失敗回数。

30 回の失敗

待機時間を増やすための戦略

ユーザーのログイン試行が最大ログイン失敗回数を超えた場合に、ユーザーを一時的に無効にする時間を増やすための戦略。

複数

待機時間増加量

ユーザーのログイン試行が最大ログイン失敗回数を超えた場合に、ユーザーを一時的に無効にする時間に追加される時間。

1 分

最大待機時間

ユーザーが一時的に無効になる最大時間。

15 分

失敗リセット時間

失敗回数がリセットされる時間。タイマーは最後のログイン失敗から開始されます。この数値は常に 最大待機時間 より大きくしてください。そうしないと、実質的な待機時間が 最大待機時間 に設定した値に達することはありません。

12 時間

クイックログインチェック (ミリ秒)

ログイン試行間の最小時間。

1000 ミリ秒

最小クイックログイン待機

ログイン試行がクイックログインチェックミリ秒よりも速い場合、ユーザーが無効になる最小時間。

1 分

一時的なロックアウトアルゴリズム

  1. ログイン成功時

    1. count をリセット

  2. ログイン失敗時

    1. 今回の失敗と前回の失敗の時間間隔が失敗リセット時間より大きい場合

      1. count をリセット

    2. count をインクリメント

    3. 定義されたブルートフォース戦略に従って wait を計算します(以下の「待機時間を設定する戦略」を参照)。

    4. wait が 0 以下で、今回の失敗と前回の失敗の時間間隔がクイックログインチェックミリ秒未満の場合

      1. wait最小クイックログイン待機時間に設定

    5. wait が 0 より大きい場合

      1. wait最大待機時間(秒単位)のうち、小さい方の時間だけユーザーを一時的に無効にする

一時的に無効になっているアカウントがログインに失敗しても、count はインクリメントされません。

待機時間を設定する戦略

Keycloak は、待機時間を計算するための 2 つの戦略を提供します。倍数による戦略と線形戦略です。倍数による戦略は Keycloak で最初に導入された戦略であるため、デフォルトの戦略です。

倍数による戦略では、失敗回数(またはカウント)が 最大ログイン失敗回数 の倍数になると、待機時間が増加します。たとえば、最大ログイン失敗回数5 に、待機時間増加量30 秒に設定した場合、認証試行が複数回失敗した後にアカウントが無効になる実質的な時間は次のようになります。

失敗回数

待機時間増加量

最大ログイン失敗回数

実質的な待機時間

1

30

5

0

2

30

5

0

3

30

5

0

4

30

5

0

5

30

5

30

6

30

5

30

7

30

5

30

8

30

5

30

9

30

5

30

10

30

5

60

5 回目の試行失敗で、アカウントは 30 秒間無効になります。次の 最大ログイン失敗回数 の倍数(この場合は 10)に達すると、時間は 30 秒から 60 秒に増加します。

倍数による戦略では、次の式を使用して待機時間を計算します。待機時間増加量(秒単位) * (count / 最大ログイン失敗回数)。除算は整数除算であり、整数に切り捨てられます。

線形戦略の場合、失敗回数(またはカウント)が 最大ログイン失敗回数 以上になると、待機時間が増加します。たとえば、最大ログイン失敗回数5 に、待機時間増加量30 秒に設定した場合、認証試行が複数回失敗した後にアカウントが無効になる実質的な時間は次のようになります。

失敗回数

待機時間増加量

最大ログイン失敗回数

実質的な待機時間

1

30

5

0

2

30

5

0

3

30

5

0

4

30

5

0

5

30

5

30

6

30

5

60

7

30

5

90

8

30

5

120

9

30

5

150

10

30

5

180

5 回目の試行失敗で、アカウントは 30 秒間無効になります。新しい失敗ごとに、待機時間増加量 で指定された値に従って待機時間が増加します。

線形戦略では、次の式を使用して待機時間を計算します。待機時間増加量(秒単位) * (1 + count - 最大ログイン失敗回数)。

一時的なロックアウト後の永続的なロックアウト

混合モード。指定された回数だけユーザーを一時的にロックアウトした後、ユーザーを永続的にロックアウトします。

一時的なロックアウト後の永久ロックアウト

brute force mixed

一時的なロックアウト後の永続的なロックアウトのパラメータ

名前 説明 デフォルト

最大ログイン失敗回数

最大ログイン失敗回数。

30 回の失敗

最大一時的ロックアウト回数

永続的なロックアウトが発生するまでに許可される一時的なロックアウトの最大回数。

1

待機時間を増やすための戦略

ユーザーのログイン試行が最大ログイン失敗回数を超えた場合に、ユーザーを一時的に無効にする時間を増やすための戦略。

複数

待機時間増加量

ユーザーのログイン試行が最大ログイン失敗回数を超えた場合に、ユーザーを一時的に無効にする時間に追加される時間。

1 分

最大待機時間

ユーザーが一時的に無効になる最大時間。

15 分

失敗リセット時間

失敗回数がリセットされる時間。タイマーは最後のログイン失敗から開始されます。この数値は常に 最大待機時間 より大きくしてください。そうしないと、実質的な待機時間が 最大待機時間 に設定した値に達することはありません。

12 時間

クイックログインチェック (ミリ秒)

ログイン試行間の最小時間。

1000 ミリ秒

最小クイックログイン待機

ログイン試行がクイックログインチェックミリ秒よりも速い場合、ユーザーが無効になる最小時間。

1 分

一時的なロックアウト後の永続的なロックアウトのアルゴリズム

  1. ログイン成功時

    1. count をリセット

    2. 一時的なロックアウト カウンターをリセット

  2. ログイン失敗時

    1. 今回の失敗と前回の失敗の時間間隔が失敗リセット時間より大きい場合

      1. count をリセット

      2. 一時的なロックアウト カウンターをリセット

    2. count をインクリメント

    3. 定義されたブルートフォース戦略に従って wait を計算します(以下の「待機時間を設定する戦略」を参照)。

    4. wait が 0 以下で、今回の失敗と前回の失敗の時間間隔がクイックログインチェックミリ秒未満の場合

      1. wait最小クイックログイン待機時間に設定

      2. クイックログイン失敗true に設定

    5. wait最大一時的ロックアウト回数 が 0 より大きい場合

      1. waitwait最大待機時間(秒単位)のうち、小さい方の時間に設定

    6. クイックログイン失敗false の場合

      1. 一時的なロックアウト カウンターをインクリメント

    7. 一時的なロックアウト カウンターが 最大一時的ロックアウト回数 を超えた場合

      1. ユーザーを永続的にロック

    8. それ以外の場合

      1. wait 値に従ってユーザーを一時的にブロック

一時的に無効になっているアカウントがログインに失敗しても、count はインクリメントされません。

Keycloak ブルートフォース検出の欠点

Keycloak ブルートフォース検出の欠点は、サーバーがサービス拒否攻撃に対して脆弱になることです。サービス拒否攻撃を実装する場合、攻撃者は、既知のアカウントのパスワードを推測してログインを試み、最終的に Keycloak にアカウントを無効にさせることができます。

侵入防止ソフトウェア(IPS)の使用を検討してください。Keycloak は、すべてのログイン失敗とクライアント IP アドレスの失敗をログに記録します。IPS を Keycloak サーバーのログファイルに向けることができ、IPS はファイアウォールを変更して、これらの IP アドレスからの接続をブロックできます。

パスワードポリシー

ユーザーに複雑なパスワードを選択させるために、複雑なパスワードポリシーを必ず設定してください。詳細については、「パスワードポリシー」の章を参照してください。ワンタイムパスワードを使用するように Keycloak サーバーをセットアップして、パスワードの推測を防ぎます。

読み取り専用ユーザー属性

Keycloak に保存されている一般的なユーザーは、ユーザープロファイルに関連するさまざまな属性を持っています。このような属性には、メール、firstName、lastName などがあります。ただし、ユーザーは、一般的なプロファイルデータではなく、メタデータである属性も持つ場合があります。メタデータ属性は通常、ユーザーに対して読み取り専用である必要があり、一般的なユーザーは Keycloak ユーザーインターフェースまたは Account REST API からこれらの属性を更新する方法を決して持つべきではありません。一部の属性は、管理者 REST API でユーザーを作成または更新する場合でも、管理者に対して読み取り専用である必要があります。

メタデータ属性は通常、次のグループの属性です。

  • ユーザーストレージプロバイダーに関連するさまざまなリンクまたはメタデータ。たとえば、LDAP 統合の場合、LDAP_ID 属性には LDAP サーバー内のユーザーの ID が含まれています。

  • ユーザーストレージによってプロビジョニングされたメタデータ。たとえば、LDAP からプロビジョニングされた createdTimestamp は、ユーザーまたは管理者によって常に読み取り専用である必要があります。

  • さまざまな認証に関連するメタデータ。たとえば、KERBEROS_PRINCIPAL 属性には、特定のユーザーの Kerberos プリンシパル名を含めることができます。同様に、usercertificate 属性には、通常 X.509 証明書認証が有効になっている場合に使用される X.509 証明書のデータとユーザーのバインディングに関連するメタデータを含めることができます。

  • アプリケーション/クライアントによるユーザーの識別子に関連するメタデータ。たとえば、saml.persistent.name.id.for.my_app には、クライアントアプリケーション my_app がユーザーの識別子として使用する SAML NameID を含めることができます。

  • 属性ベースのアクセス制御(ABAC)に使用される承認ポリシーに関連するメタデータ。これらの属性の値は、承認決定に使用される場合があります。したがって、これらの属性をユーザーが更新できないことが重要です。

長期的には、Keycloak は適切なユーザープロファイル SPI を持つようになり、すべてのユーザー属性のきめ細かい構成が可能になります。現在、この機能はまだ完全には利用できません。そのため、Keycloak には、ユーザーに対して読み取り専用であり、サーバーレベルで構成された管理者に対して読み取り専用であるユーザー属性の内部リストがあります。

これは、Keycloak デフォルトプロバイダーおよび機能によって内部的に使用される読み取り専用属性のリストであり、したがって常に読み取り専用です。

  • ユーザーの場合:KERBEROS_PRINCIPALLDAP_IDLDAP_ENTRY_DNCREATED_TIMESTAMPcreateTimestampmodifyTimestampuserCertificatesaml.persistent.name.id.for.*ENABLEDEMAIL_VERIFIED

  • 管理者の場合:KERBEROS_PRINCIPALLDAP_IDLDAP_ENTRY_DNCREATED_TIMESTAMPcreateTimestampmodifyTimestamp

システム管理者には、このリストに属性を追加する方法があります。構成は現在、サーバーレベルで利用可能です。

spi-user-profile-declarative-user-profile-read-only-attributes および spi-user-profile-declarative-user-profile-admin-read-only-attributes オプションを使用して、この構成を追加できます。例:

kc.[sh|bat] start --spi-user-profile-declarative-user-profile-read-only-attributes=foo,bar*

この例では、ユーザーと管理者は属性 foo を更新できません。ユーザーは bar で始まる属性を編集できません。たとえば、bar または barrier などです。構成は大文字と小文字を区別しないため、FOOBarRier などの属性もこの例では拒否されます。ワイルドカード文字 * は属性名の末尾でのみサポートされるため、管理者は指定された文字で始まるすべての属性を効果的に拒否できます。属性の中間の * は通常の文字と見なされます。

ユーザー属性の検証

ユーザー属性の管理の機能を使用すると、管理者は、ユーザー登録またはアカウントコンソールなどで、ユーザーが属性に入力するデータを制限できます。

管理者は、攻撃者が無制限の数の属性を追加するのを防ぐために、ユーザーに対して管理されていない属性を許可しないでください。属性には、攻撃者が入力するデータ量を制限する検証が必要です。

ユーザー属性を検証するために正規表現を使用する場合、過剰なメモリまたは CPU を使用する正規表現は避けてください。詳細については、OWASP の正規表現サービス拒否(ReDoS)を参照してください。

クリックジャッキング

クリックジャッキングは、ユーザーが認識しているものとは異なるユーザーインターフェース要素をクリックするようにユーザーをだます手法です。悪意のあるサイトは、ターゲットサイトを透明な iFrame にロードし、ターゲットサイトの重要なボタンの真下に配置されたダミーボタンのセットの上にオーバーレイします。ユーザーが目に見えるボタンをクリックすると、非表示ページのボタンをクリックすることになります。攻撃者は、この方法を使用してユーザーの認証情報を盗み、リソースにアクセスできます。

デフォルトでは、Keycloak によるすべての応答は、このような事態が発生するのを防ぐことができる特定の HTTP ヘッダーを設定します。具体的には、X-Frame-Options および Content-Security-Policy を設定します。これらのヘッダーの定義を確認してください。制御できるきめ細かいブラウザーアクセスが多数あります。

手順

Admin Console で、X-Frame-Options および Content-Security-Policy ヘッダーの値を指定できます。

  1. Realm Settings メニュー項目をクリックします。

  2. セキュリティ防御タブをクリックします。

    セキュリティ防御

    Security Defenses

デフォルトでは、Keycloak は iframe に対して same-origin ポリシーのみを設定します。

SSL/HTTPS 要件

OAuth 2.0/OpenID Connect は、セキュリティにアクセストークンを使用します。攻撃者は、ネットワークをスキャンしてアクセストークンを探し、それらを使用して、トークンに許可されている悪意のある操作を実行できます。この攻撃は、中間者攻撃として知られています。Keycloak 認証サーバーと Keycloak が保護するクライアント間の通信に SSL/HTTPS を使用して、中間者攻撃を防ぎます。

Keycloak には、SSL/HTTPS の 3 つのモードがあります。SSL のセットアップは複雑なため、Keycloak では、localhost、192.168.x.x、およびその他のプライベート IP アドレスなどのプライベート IP アドレス経由での非 HTTPS 通信を許可しています。本番環境では、SSL を有効にし、すべての操作で SSL が必須であることを確認してください。

アダプター/クライアント側では、SSL トラストマネージャーを無効にすることができます。トラストマネージャーは、Keycloak が通信するクライアントの ID が有効であることを保証し、サーバーの証明書に対して DNS ドメイン名を保証します。本番環境では、各クライアントアダプターがトラストストアを使用して、DNS 中間者攻撃を防ぐようにしてください。

CSRF攻撃

クロスサイトリクエストフォージェリ(CSRF)攻撃は、ウェブサイトがすでに認証済みのユーザーからのHTTPリクエストを利用します。Cookieベースの認証を使用しているサイトはすべてCSRF攻撃に対して脆弱です。これらの攻撃は、ステートCookieをポストされたフォームまたはクエリパラメータと照合することで軽減できます。

OAuth 2.0ログイン仕様では、ステートCookieが送信されたステートパラメータと一致することが要求されています。Keycloakはこの仕様のこの部分を完全に実装しているため、すべてのログインは保護されています。

Keycloak管理コンソールは、バックエンドのKeycloak管理REST APIにREST呼び出しを行うJavaScript/HTML5アプリケーションです。これらの呼び出しはすべてベアラートークン認証を必要とし、JavaScript Ajax呼び出しで構成されているため、CSRFは不可能です。管理REST APIを構成して、CORSオリジンを検証できます。

Keycloakのアカウントコンソールは、CSRFに対して脆弱である可能性があります。CSRF攻撃を防ぐために、KeycloakはステートCookieを設定し、このCookieの値を非表示のフォームフィールドまたはアクションリンク内のクエリパラメータに埋め込みます。Keycloakは、クエリ/フォームパラメータをステートCookieと照合して、同じユーザーが呼び出しを行ったことを検証します。

不明確なリダイレクトURI

認可コードフローに対して、登録するリダイレクトURIを可能な限り具体的にしてください。曖昧なリダイレクトURIを登録すると、悪意のあるクライアントがより広範なアクセス権を持つ別のクライアントになりすますことが許可される可能性があります。たとえば、2つのクライアントが同じドメイン下にある場合、なりすましが発生する可能性があります。

レルムにセキュアなリダイレクトURIエンフォーサーエグゼキュータを使用できます。これにより、クライアント管理者は、コンテキストパスにワイルドカードを含めることができないURLや、指定された許可ドメインに制限できるURLなど、さまざまな要件に一致する特定のリダイレクトURIを持つクライアントのみを登録できるようになります。特定のエグゼキュータでクライアントポリシーを構成する方法の詳細については、クライアントポリシーを参照してください。

FAPI準拠

Keycloakサーバーがクライアントをより安全でFAPI準拠であると検証するようにするには、FAPIサポートのクライアントポリシーを構成できます。FAPIの詳細については、アプリケーションのセキュリティ保護セクションで説明されています。とりわけ、これにより、クライアントに必要なSSL、セキュアなリダイレクトURIの使用、および同様のベストプラクティスなど、上記のセキュリティのベストプラクティスがいくつか保証されます。

OAuth 2.1準拠

Keycloakサーバーがクライアントをより安全でOAuth 2.1準拠であると検証するようにするには、OAuth 2.1サポートのクライアントポリシーを構成できます。OAuth 2.1の詳細については、アプリケーションのセキュリティ保護セクションで説明されています。

侵害されたアクセスおよびリフレッシュトークン

Keycloakには、悪意のあるアクターがアクセストークンとリフレッシュトークンを盗むのを防ぐためのいくつかのアクションが含まれています。最も重要なアクションは、Keycloakとそのクライアントおよびアプリケーション間のSSL/HTTPS通信を強制することです。KeycloakはデフォルトでSSLを有効にしていません。

漏洩したアクセストークンによる損害を軽減するためのもう1つのアクションは、トークンの寿命を短縮することです。トークンの寿命は、タイムアウトページ内で指定できます。アクセストークンの寿命を短くすると、クライアントとアプリケーションは短時間後にアクセストークンを更新する必要があります。管理者が漏洩を検出した場合、管理者はすべてのユーザーセッションをログアウトしてこれらのリフレッシュトークンを無効にするか、失効ポリシーを設定できます。

リフレッシュトークンは常にクライアントに対してプライベートであり、決して送信されないようにしてください。

これらのトークンをホルダーオブライントークンとして発行することで、漏洩したアクセストークンとリフレッシュトークンによる損害を軽減できます。詳細については、OAuth 2.0 Mutual TLSクライアント証明書バインドアクセストークンを参照してください。

アクセストークンまたはリフレッシュトークンが侵害された場合は、管理コンソールにアクセスし、すべてのアプリケーションにnot-before失効ポリシーをプッシュします。not-beforeポリシーをプッシュすると、その時間より前に発行されたトークンはすべて無効になります。新しいnot-beforeポリシーをプッシュすると、アプリケーションはKeycloakから新しい公開鍵をダウンロードする必要があり、侵害されたレルム署名鍵による損害を軽減できます。詳細については、鍵の章を参照してください。

特定のアプリケーション、クライアント、またはユーザーが侵害された場合は、それらを無効にできます。

侵害された認可コード

OIDC認証コードフローの場合、Keycloakは認可コードに対して暗号学的に強力なランダム値を生成します。認可コードは、アクセストークンを取得するために一度だけ使用されます。

管理コンソールのタイムアウトページで、認可コードが有効な期間を指定できます。期間が10秒未満であることを確認してください。これは、クライアントがコードからトークンをリクエストするのに十分な長さです。

Proof Key for Code Exchange(PKCE)をクライアントに適用することで、漏洩した認可コードから防御することもできます。

オープンリダイレクタ

オープンリダイレクタは、パラメータ値で指定された場所にユーザーエージェントを検証なしで自動的にリダイレクトするためにパラメータを使用するエンドポイントです。攻撃者は、エンドユーザー認証エンドポイントとリダイレクトURIパラメータを使用して、認証サーバーをオープンリダイレクタとして使用し、ユーザーの認証サーバーへの信頼を利用してフィッシング攻撃を開始できます。

Keycloakでは、登録されたすべてのアプリケーションとクライアントが少なくとも1つのリダイレクトURIパターンを登録する必要があります。クライアントがKeycloakにリダイレクトを実行するように要求すると、KeycloakはリダイレクトURIを有効な登録済みURIパターンのリストと照合して確認します。クライアントとアプリケーションは、オープンリダイレクタ攻撃を軽減するために、可能な限り特定のリダイレクトURIパターンを登録する必要があります。

アプリケーションがhttp(s)以外のカスタムスキームを必要とする場合は、検証パターン(たとえば、custom:/app/*)の明示的な一部にする必要があります。セキュリティ上の理由から、*のような一般的なパターンはhttp(s)以外のスキームをカバーしません。

クライアントポリシーを使用することで、管理者はクライアントが*などのオープンリダイレクトURLを登録できないようにすることができます。

パスワードデータベースの侵害

Keycloakは、パスワードをプレーンテキストではなく、PBKDF2-HMAC-SHA512メッセージダイジェストアルゴリズムを使用してハッシュテキストとして保存します。Keycloakは、セキュリティコミュニティが推奨する反復回数である210,000回のハッシュ反復を実行します。このハッシュ反復回数は、PBKDF2ハッシュが大量のCPUリソースを使用するため、パフォーマンスに悪影響を与える可能性があります。

スコープの制限

デフォルトでは、新しいクライアントアプリケーションには無制限のロールスコープマッピングがあります。そのクライアントのすべてのアクセストークンには、ユーザーが持つすべての権限が含まれています。攻撃者がクライアントを侵害してクライアントのアクセストークンを取得した場合、ユーザーがアクセスできるすべてのシステムが侵害されます。

各クライアントのスコープメニューを使用して、アクセストークンのロールを制限します。または、クライアントスコープレベルでロールスコープマッピングを設定し、クライアントスコープメニューを使用してクライアントにクライアントスコープを割り当てることもできます。

トークンオーディエンスの制限

サービス間の信頼レベルが低い環境では、トークンのオーディエンスを制限します。詳細については、OAuth2脅威モデルおよびオーディエンスのサポートセクションを参照してください。

認証セッションの制限

認証セッションは、認証の状態を追跡します。以下のテキストは、ソースフローに関係なく適用できます。

このセクションでは、認証セッションにInfinispanプロバイダーを使用するデプロイメントについて説明します。

認証セッションは、内部的にRootAuthenticationSessionEntityとして保存されます。各RootAuthenticationSessionEntityは、AuthenticationSessionEntityオブジェクトのコレクションとしてRootAuthenticationSessionEntity内に保存された複数の認証サブセッションを持つことができます。Keycloakは、認証セッションを専用のInfinispanキャッシュに保存します。RootAuthenticationSessionEntityあたりのAuthenticationSessionEntityの数は、各キャッシュエントリのサイズに影響します。認証セッションキャッシュの総メモリフットプリントは、保存されているRootAuthenticationSessionEntityの数と、各RootAuthenticationSessionEntity内のAuthenticationSessionEntityの数によって決まります。

維持されるRootAuthenticationSessionEntityオブジェクトの数は、ブラウザからの未完了のログインフローの数に対応します。RootAuthenticationSessionEntityの数を制御下に保つためには、高度なファイアウォール制御を使用してイングレストラフィックを制限することをお勧めします。

多くのアクティブなRootAuthenticationSessionEntityと多数のAuthenticationSessionEntityが存在するデプロイメントでは、メモリ使用量が増加する可能性があります。ロードバランサーがセッションスティッキーをサポートしていないか、セッションスティッキー用に構成されていない場合、クラスター内のネットワーク上の負荷が大幅に増加する可能性があります。この負荷の理由は、適切な認証セッションを所有していないノードに着信する各リクエストが、オーナーノードで認証セッションレコードを取得および更新する必要があるためであり、取得とストレージの両方に別個のネットワーク送信が伴います。

RootAuthenticationSessionEntityあたりのAuthenticationSessionEntityの最大数は、プロパティauthSessionsLimitを設定することにより、authenticationSessions SPIで構成できます。デフォルト値は、RootAuthenticationSessionEntityあたり300 AuthenticationSessionEntityに設定されています。この制限に達すると、新しい認証セッションリクエストの後、最も古い認証サブセッションが削除されます。

次の例は、RootAuthenticationSessionEntityあたりのアクティブなAuthenticationSessionEntityの数を100に制限する方法を示しています。

bin/kc.[sh|bat] start --spi-authentication-sessions-infinispan-auth-sessions-limit=100

新しいマップストレージの同等のコマンド

bin/kc.[sh|bat] start --spi-authentication-sessions-map-auth-sessions-limit=100

SQLインジェクション攻撃

現在、Keycloakには既知のSQLインジェクション脆弱性はありません。

アカウントコンソール

Keycloakユーザーは、アカウントコンソールを通じてアカウントを管理できます。プロファイルの設定、2要素認証の追加、アイデンティティプロバイダーアカウントの追加、デバイスアクティビティの監視を行うことができます。

追加リソース
  • アカウントコンソールは、外観と言語設定の点で構成できます。例として、個人情報ページに追加の属性を追加することが挙げられます。詳細については、サーバー開発者ガイドを参照してください。

アカウントコンソールへのアクセス

手順
  1. アカウントが存在するKeycloakサーバーのレルム名とIPアドレスをメモしてください。

  2. ウェブブラウザで、URL を次の形式で入力します: server-root/realms/{realm-name}/account。

  3. ログイン名とパスワードを入力します。

アカウントコンソール

Account Console

アカウントコンソール URL を呼び出す際に、scope パラメーターを次の形式で設定することにより、追加のスコープを要求することもできます: server-root/realms/{realm-name}/account?scope=phone。

サインイン方法の設定

このコンソールには、基本認証(ログイン名とパスワード)または二要素認証を使用してサインインできます。二要素認証の場合は、次のいずれかの手順に従ってください。

OTP を使用した二要素認証

前提条件
  • OTP は、レルムで有効な認証メカニズムです。

手順
  1. メニューのアカウントセキュリティをクリックします。

  2. サインインをクリックします。

  3. Authenticator アプリケーションのセットアップをクリックします。

    サインイン

    Signing in

  4. 画面に表示される指示に従って、モバイルデバイスを OTP ジェネレーターとして使用します。

  5. スクリーンショットの QR コードをモバイルデバイスの OTP ジェネレーターでスキャンします。

  6. ログアウトして、再度ログインします。

  7. モバイルデバイスに表示される OTP を入力して、プロンプトに応答します。

WebAuthn を使用した二要素認証

前提条件
  • WebAuthn は、レルムで有効な二要素認証メカニズムです。詳細については、WebAuthn セクションを参照してください。

手順
  1. メニューのアカウントセキュリティをクリックします。

  2. サインインをクリックします。

  3. パスキーの設定をクリックします。

    サインイン

    Signing in with a Passkey

  4. パスキーを準備します。このキーの準備方法は、使用するパスキーのタイプによって異なります。たとえば、USB ベースの YubiKey の場合、キーをラップトップの USB ポートに挿入する必要がある場合があります。

  5. 登録をクリックして、パスキーを登録します。

  6. ログアウトして、再度ログインします。

  7. 認証フローが正しく設定されていると、パスキーをセカンドファクターとして認証するように求めるメッセージが表示されます。

WebAuthn を使用したパスワードレス認証

前提条件
手順
  1. メニューのアカウントセキュリティをクリックします。

  2. サインインをクリックします。

  3. Passwordless セクションのパスキーの設定をクリックします。

    サインイン

    Signing in with a Passkey

  4. パスキーを準備します。このキーの準備方法は、使用するパスキーのタイプによって異なります。たとえば、USB ベースの YubiKey の場合、キーをラップトップの USB ポートに挿入する必要がある場合があります。

  5. 登録をクリックして、パスキーを登録します。

  6. ログアウトして、再度ログインします。

  7. 認証フローが正しく設定されていると、パスキーをセカンドファクターとして認証するように求めるメッセージが表示されます。ログインするためにパスワードを提供する必要はなくなります。

デバイスアクティビティの表示

アカウントにログインしているデバイスを表示できます。

手順
  1. メニューのアカウントセキュリティをクリックします。

  2. デバイスアクティビティをクリックします。

  3. 不審なデバイスがある場合は、ログアウトします。

デバイス

Devices

アイデンティティプロバイダーアカウントの追加

アカウントをアイデンティティブローカーとリンクできます。このオプションは、ソーシャルプロバイダーアカウントをリンクするためによく使用されます。

手順
  1. Admin Console にログインします。

  2. メニューのIdentity providersをクリックします。

  3. プロバイダーを選択し、フィールドに入力します。

  4. Account Console に戻ります。

  5. メニューのアカウントセキュリティをクリックします。

  6. Linked accountsをクリックします。

追加したアイデンティティプロバイダーがこのページに表示されます。

リンク済みアカウント

Linked Accounts

他のアプリケーションへのアクセス

Applications メニュー項目には、アクセスできるアプリケーションがユーザーに表示されます。この場合、Account Console のみ使用可能です。

アプリケーション

Applications

グループメンバーシップの表示

Groups メニューをクリックすると、関連付けられているグループを表示できます。Direct membership チェックボックスをオンにすると、直接関連付けられているグループのみが表示されます。

前提条件
  • Groups メニューを表示できるようにするには、view-groups アカウントロールが必要です。

グループメンバーシップの表示

View group memberships

Admin CLI

Keycloak を使用すると、Admin CLI コマンドラインツールを使用して、コマンドラインインターフェース (CLI) から管理タスクを実行できます。

Admin CLI のインストール

Keycloak は、Admin CLI サーバーディストリビューションと実行スクリプトを bin ディレクトリにパッケージ化しています。

Linux スクリプトは kcadm.sh と呼ばれ、Windows 用のスクリプトは kcadm.bat と呼ばれます。ファイルシステムの任意の場所からクライアントを使用するには、Keycloak サーバーディレクトリを PATH に追加します。

例:

  • Linux

    $ export PATH=$PATH:$KEYCLOAK_HOME/bin
    $ kcadm.sh
  • Windows

    c:\> set PATH=%PATH%;%KEYCLOAK_HOME%\bin
    c:\> kcadm

KEYCLOAK_HOME 環境変数を、Keycloak Server ディストリビューションを抽出したパスに設定する必要があります。

繰り返しを避けるために、このドキュメントの残りの部分では、CLI の違いが kcadm コマンド名だけではない場合にのみ、Windows の例を使用します。

Admin CLI の使用

Admin CLI は、Admin REST エンドポイントに HTTP リクエストを行います。Admin REST エンドポイントへのアクセスには認証が必要です。

特定のエンドポイントの JSON 属性の詳細については、Admin REST API ドキュメントを参照してください。

  1. ログインして、認証されたセッションを開始します。これで、作成、読み取り、更新、および削除 (CRUD) 操作を実行できます。

    例:

    • Linux

      $ kcadm.sh config credentials --server https://#:8080 --realm demo --user admin --client admin
      $ kcadm.sh create realms -s realm=demorealm -s enabled=true -o
      $ CID=$(kcadm.sh create clients -r demorealm -s clientId=my_client -s 'redirectUris=["https://#:8980/myapp/*"]' -i)
      $ kcadm.sh get clients/$CID/installation/providers/keycloak-oidc-keycloak-json
    • Windows

      c:\> kcadm config credentials --server https://#:8080 --realm demo --user admin --client admin
      c:\> kcadm create realms -s realm=demorealm -s enabled=true -o
      c:\> kcadm create clients -r demorealm -s clientId=my_client -s "redirectUris=[\"https://#:8980/myapp/*\"]" -i > clientid.txt
      c:\> set /p CID=<clientid.txt
      c:\> kcadm get clients/%CID%/installation/providers/keycloak-oidc-keycloak-json
  2. 実稼働環境では、トークンの露出を避けるために https: を使用して Keycloak にアクセスします。Java のデフォルトの証明書トラストストアに含まれる信頼できる認証局がサーバーの証明書を発行していない場合は、truststore.jks ファイルを準備し、Admin CLI にそれを使用するように指示します。

    例:

    • Linux

      $ kcadm.sh config truststore --trustpass $PASSWORD ~/.keycloak/truststore.jks
    • Windows

      c:\> kcadm config truststore --trustpass %PASSWORD% %HOMEPATH%\.keycloak\truststore.jks

機密性の高いオプション

パスワードなどの機密値は、コマンドオプションとして指定できます。これは一般的には推奨されません。オプションを省略するか、値を指定することで、機密値の入力を求められるメカニズムもあります。最終的にはすべて、代わりに使用できる対応する環境変数があります。実行しているコマンドのヘルプを確認して、可能なすべてのオプションを確認してください。

認証

Admin CLI でログインするときは、次を指定します。

  • サーバーエンドポイント URL

  • レルム

  • ユーザー名

別のオプションは、clientId のみを指定することです。これにより、使用する一意のサービスアカウントが作成されます。

ユーザー名を使用してログインする場合は、指定されたユーザーのパスワードを使用します。clientId を使用してログインする場合は、ユーザーパスワードではなく、クライアントシークレットのみが必要です。クライアントシークレットの代わりに Signed JWT を使用することもできます。

セッションに使用するアカウントに、Admin REST API 操作を呼び出すための適切な権限があることを確認してください。たとえば、realm-management クライアントの realm-admin ロールは、ユーザーのレルムを管理できます。

認証には、主に 2 つのメカニズムを使用できます。1 つのメカニズムは、kcadm config credentials を使用して、認証されたセッションを開始します。

$ kcadm.sh config credentials --server https://#:8080 --realm master --user admin

このメカニズムは、取得したアクセストークンとそれに関連付けられたリフレッシュトークンを保存することにより、kcadm コマンド呼び出し間で認証されたセッションを維持します。プライベート構成ファイルに他のシークレットを保持できます。詳細については、次の章を参照してください。

2 番目のメカニズムは、呼び出しの期間中、各コマンド呼び出しを認証します。このメカニズムは、サーバーへの負荷と、トークンを取得するためのラウンドトリップにかかる時間を増やします。このアプローチの利点は、呼び出し間でトークンを保存する必要がないため、ディスクに何も保存されないことです。Keycloak は、--no-config 引数が指定されている場合、このモードを使用します。

たとえば、操作を実行するときは、認証に必要なすべての情報を指定します。

$ kcadm.sh get realms --no-config --server https://#:8080 --realm master --user admin

Admin CLI の使用方法の詳細については、kcadm.sh help コマンドを実行してください。

認証されたセッションの開始の詳細については、kcadm.sh config credentials --help コマンドを実行してください。

--password オプションを指定しない場合 (コマンドの一部としてパスワードを提供しないことが一般的に推奨されます)、環境変数 KC_CLI_PASSWORD として指定されていない限り、パスワードの入力を求められます。

代替構成の使用

デフォルトでは、Admin CLI は kcadm.config という名前の構成ファイルを保持します。Keycloak は、このファイルをユーザーのホームディレクトリに配置します。Linux ベースのシステムでは、フルパス名は $HOME/.keycloak/kcadm.config です。Windows では、フルパス名は %HOMEPATH%\.keycloak\kcadm.config です。

--config オプションを使用して、別のファイルまたは場所を指すことができるため、複数の認証済みセッションを並行して維持できます。

単一の構成ファイルに関連付けられた操作を、単一のスレッドから実行します。

構成ファイルがシステム上の他のユーザーから見えないようにしてください。これには、プライベートにする必要のあるアクセストークンとシークレットが含まれています。Keycloak は、適切なアクセス制限を使用して、~/.keycloak ディレクトリとそのコンテンツを自動的に作成します。ディレクトリが既に存在する場合、Keycloak はディレクトリの権限を更新しません。

構成ファイル内にシークレットを保存しないことも可能ですが、そうすると不便になり、トークンリクエストの数が増加します。すべてのコマンドで --no-config オプションを使用し、kcadm の各呼び出しで config credentials コマンドに必要な認証情報を指定します。

基本操作とリソース URI

Admin CLI は、特定のタスクを簡略化する追加のコマンドを使用して、Admin REST API エンドポイントに対して汎用的に CRUD 操作を実行できます。

主な使用パターンを以下に示します。

$ kcadm.sh create ENDPOINT [ARGUMENTS]
$ kcadm.sh get ENDPOINT [ARGUMENTS]
$ kcadm.sh update ENDPOINT [ARGUMENTS]
$ kcadm.sh delete ENDPOINT [ARGUMENTS]

creategetupdate、および delete コマンドは、それぞれ HTTP 動詞 POSTGETPUT、および DELETE にマッピングされます。ENDPOINT はターゲットリソース URI であり、絶対 (http: または https: で始まる) または相対にすることができます。Keycloak は、次の形式で絶対 URL を構成するために使用します。

SERVER_URI/admin/realms/REALM/ENDPOINT

たとえば、サーバー https://#:8080 に対して認証を行い、レルムが master の場合、ENDPOINT として users を使用すると、https://#:8080/admin/realms/master/users リソース URL が作成されます。

ENDPOINT を clients に設定すると、有効なリソース URI は https://#:8080/admin/realms/master/clients になります。

Keycloak には、レルムのコンテナである realms エンドポイントがあります。これは次のように解決されます。

SERVER_URI/admin/realms

Keycloak には、serverinfo エンドポイントがあります。このエンドポイントはレルムに依存しません。

realm-admin 権限を持つユーザーとして認証する場合、複数のレルムでコマンドを実行する必要がある場合があります。その場合は、-r オプションを指定して、コマンドを実行するレルムを CLI に明示的に指示します。kcadm.sh config credentials--realm オプションで指定された REALM を使用する代わりに、コマンドは TARGET_REALM を使用します。

SERVER_URI/admin/realms/TARGET_REALM/ENDPOINT

例:

$ kcadm.sh config credentials --server https://#:8080 --realm master --user admin
$ kcadm.sh create users -s username=testuser -s enabled=true -r demorealm

この例では、master レルムの admin ユーザーとして認証されたセッションを開始します。次に、リソース URL https://#:8080/admin/realms/demorealm/users に対して POST 呼び出しを実行します。

create コマンドと update コマンドは、JSON 本文をサーバーに送信します。-f FILENAME を使用して、事前に作成されたドキュメントをファイルから読み取ることができます。-f - オプションを使用すると、Keycloak は標準入力からメッセージ本文を読み取ります。create users の例に示すように、個々の属性とその値を指定できます。Keycloak は属性を JSON 本文に構成し、サーバーに送信します。

--set、-s オプションで使用される name=value ペアの値は、JSON であると見なされます。有効な JSON として解析できない場合、テキスト値としてサーバーに送信されます。

値がシェル処理後に引用符で囲まれているが、有効な JSON ではない場合、引用符は削除され、値の残りの部分がテキストとして送信されます。この動作は非推奨になりました。引用符なしで値を指定するか、二重引用符で囲まれた有効な JSON 文字列リテラルを指定することを検討してください。

Keycloak には、update コマンドを使用してリソースを更新するいくつかの方法があります。リソースの現在の状態を特定してファイルに保存し、そのファイルを編集して、更新のためにサーバーに送信できます。

例:

$ kcadm.sh get realms/demorealm > demorealm.json
$ vi demorealm.json
$ kcadm.sh update realms/demorealm -f demorealm.json

この方法では、送信された JSON ドキュメントの属性を使用して、サーバー上のリソースを更新します。

別の方法は、-s, --set オプションを使用して新しい値を設定することにより、オンザフライ更新を実行することです。

例:

$ kcadm.sh update realms/demorealm -s enabled=false

この方法では、enabled 属性を false に設定します。

デフォルトでは、update コマンドは get を実行してから、既存の値と新しい属性値をマージします。場合によっては、エンドポイントが put コマンドをサポートしていても、get コマンドをサポートしていない場合があります。-n オプションを使用すると、get コマンドを最初に実行せずに put コマンドを実行する、マージなし更新を実行できます。

レルム操作

新しいレルムの作成

realms エンドポイントで create コマンドを使用して、新しい有効なレルムを作成します。属性を realm および enabled に設定します。

$ kcadm.sh create realms -s realm=demorealm -s enabled=true

Keycloak はデフォルトでレルムを無効にします。レルムを有効にすることで、認証にすぐに使用できます。

新しいオブジェクトの説明も JSON 形式にできます。

$ kcadm.sh create realms -f demorealm.json

レルム属性を含む JSON ドキュメントを、ファイルから直接送信するか、ドキュメントを標準入力にパイプできます。

例:

  • Linux

    $ kcadm.sh create realms -f - << EOF
    { "realm": "demorealm", "enabled": true }
    EOF
  • Windows

    c:\> echo { "realm": "demorealm", "enabled": true } | kcadm create realms -f -

既存のレルムのリスト表示

このコマンドは、すべてのレルムのリストを返します。

$ kcadm.sh get realms

Keycloak は、ユーザーが表示できるレルムのみを返すように、サーバー上のレルムのリストをフィルタリングします。

すべてのレルム属性のリストは冗長になる可能性があり、ほとんどのユーザーはレルム名やレルムの有効ステータスなど、属性のサブセットに関心があります。--fields オプションを使用して、返す属性を指定できます。

$ kcadm.sh get realms --fields realm,enabled

結果をカンマ区切り値として表示できます。

$ kcadm.sh get realms --fields realm --format csv --noquotes

特定のレルムの取得

コレクション URI にレルム名を追加して、個々のレルムを取得します。

$ kcadm.sh get realms/master

レルムの更新

  1. レルムのすべての属性を変更したくない場合は、-s オプションを使用して属性の新しい値を設定します。

    例:

    $ kcadm.sh update realms/demorealm -s enabled=false
  2. すべての書き込み可能な属性を新しい値に設定する場合

    1. get コマンドを実行します。

    2. JSON ファイルで現在の値を編集します。

    3. 再送信します。

      例:

      $ kcadm.sh get realms/demorealm > demorealm.json
      $ vi demorealm.json
      $ kcadm.sh update realms/demorealm -f demorealm.json

レルムの削除

レルムを削除するには、次のコマンドを実行します。

$ kcadm.sh delete realms/demorealm

レルムのすべてのログインページオプションをオンにする

特定の機能を制御する属性を true に設定します。

例:

$ kcadm.sh update realms/demorealm -s registrationAllowed=true -s registrationEmailAsUsername=true -s rememberMe=true -s verifyEmail=true -s resetPasswordAllowed=true -s editUsernameAllowed=true

レルムキーのリスト表示

ターゲットレルムの keys エンドポイントで get 操作を使用します。

$ kcadm.sh get keys -r demorealm

新しいレルムキーの生成

  1. 新しい RSA 生成キーペアを追加する前に、ターゲットレルムの ID を取得します。

    例:

    $ kcadm.sh get realms/demorealm --fields id --format csv --noquotes
  2. kcadm.sh get keys -r demorealm で明らかになった既存のプロバイダーよりも優先度の高い新しいキープロバイダーを追加します。

    例:

    • Linux

      $ kcadm.sh create components -r demorealm -s name=rsa-generated -s providerId=rsa-generated -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority=["101"]' -s 'config.enabled=["true"]' -s 'config.active=["true"]' -s 'config.keySize=["2048"]'
    • Windows

      c:\> kcadm create components -r demorealm -s name=rsa-generated -s providerId=rsa-generated -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority=[\"101\"]" -s "config.enabled=[\"true\"]" -s "config.active=[\"true\"]" -s "config.keySize=[\"2048\"]"
  3. parentId 属性をターゲットレルムの ID の値に設定します。

    新しく追加されたキーは、kcadm.sh get keys -r demorealm で明らかになったように、アクティブキーになりました。

Java キーストアファイルから新しいレルムキーを追加する

  1. 新しいキーペアを JKS ファイルとして事前に準備するために、新しいキープロバイダーを追加します。

    たとえば、

    • Linux

      $ kcadm.sh create components -r demorealm -s name=java-keystore -s providerId=java-keystore -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority=["101"]' -s 'config.enabled=["true"]' -s 'config.active=["true"]' -s 'config.keystore=["/opt/keycloak/keystore.jks"]' -s 'config.keystorePassword=["secret"]' -s 'config.keyPassword=["secret"]' -s 'config.keyAlias=["localhost"]'
    • Windows

      c:\> kcadm create components -r demorealm -s name=java-keystore -s providerId=java-keystore -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority=[\"101\"]" -s "config.enabled=[\"true\"]" -s "config.active=[\"true\"]" -s "config.keystore=[\"/opt/keycloak/keystore.jks\"]" -s "config.keystorePassword=[\"secret\"]" -s "config.keyPassword=[\"secret\"]" -s "config.keyAlias=[\"localhost\"]"
  2. keystorekeystorePasswordkeyPassword、および alias の属性値を、特定のキーストアに合わせて変更してください。

  3. parentId 属性をターゲットレルムの ID の値に設定します。

キーをパッシブにするか、キーを無効にする

  1. パッシブにするキーを特定します。

    $ kcadm.sh get keys -r demorealm
  2. キーの providerId 属性を使用して、エンドポイント URI (components/PROVIDER_ID など) を構築します。

  3. update を実行します。

    例:

    • Linux

      $ kcadm.sh update components/PROVIDER_ID -r demorealm -s 'config.active=["false"]'
    • Windows

      c:\> kcadm update components/PROVIDER_ID -r demorealm -s "config.active=[\"false\"]"

      他のキー属性を更新できます。

    • たとえば、config.enabled=["false"] のように、新しい enabled 値を設定してキーを無効にします。

    • 新しいpriority値を設定してキーの優先度を変更します。例えば、config.priority=["110"]のように指定します。

古いキーの削除

  1. 削除するキーが非アクティブであり、無効化されていることを確認してください。これは、アプリケーションやユーザーが保持している既存のトークンが失敗するのを防ぐための措置です。

  2. 削除するキーを特定します。

    $ kcadm.sh get keys -r demorealm
  3. キーのproviderIdを使用して削除を実行します。

    $ kcadm.sh delete components/PROVIDER_ID -r demorealm

レルムのイベントログ設定

events/configエンドポイントでupdateコマンドを使用します。

eventsListeners属性には、イベントを受信するすべてのEventListenerProviderFactory IDのリストが含まれています。組み込みのイベントストレージを制御する属性が利用可能で、Admin REST APIを使用して過去のイベントをクエリできます。Keycloakは、サービスコールのロギング(eventsEnabled)と、Admin ConsoleまたはAdmin REST APIによってトリガーされる監査イベント(adminEventsEnabled)を個別に制御できます。データベースがいっぱいになるのを防ぐために、eventsExpirationイベントの有効期限を設定できます。Keycloakは、eventsExpirationを秒単位の Time-To-Live で設定します。

すべてのイベントを受信し、JBoss-loggingを通じてイベントをログに記録する組み込みのイベントリスナーを設定できます。org.keycloak.eventsロガーを使用すると、KeycloakはエラーイベントをWARNとして、その他のイベントをDEBUGとしてログに記録します。

例:

  • Linux

    $ kcadm.sh update events/config -r demorealm -s 'eventsListeners=["jboss-logging"]'
  • Windows

    c:\> kcadm update events/config -r demorealm -s "eventsListeners=[\"jboss-logging\"]"

例:

監査イベントを除く、利用可能なすべてのERRORイベントのストレージを2日間オンに設定して、Admin RESTを通じてイベントを取得できるようにします。

  • Linux

    $ kcadm.sh update events/config -r demorealm -s eventsEnabled=true -s 'enabledEventTypes=["LOGIN_ERROR","REGISTER_ERROR","LOGOUT_ERROR","CODE_TO_TOKEN_ERROR","CLIENT_LOGIN_ERROR","FEDERATED_IDENTITY_LINK_ERROR","REMOVE_FEDERATED_IDENTITY_ERROR","UPDATE_EMAIL_ERROR","UPDATE_PROFILE_ERROR","UPDATE_PASSWORD_ERROR","UPDATE_TOTP_ERROR","UPDATE_CREDENTIAL_ERROR","VERIFY_EMAIL_ERROR","REMOVE_TOTP_ERROR","REMOVE_CREDENTIAL_ERROR","SEND_VERIFY_EMAIL_ERROR","SEND_RESET_PASSWORD_ERROR","SEND_IDENTITY_PROVIDER_LINK_ERROR","RESET_PASSWORD_ERROR","IDENTITY_PROVIDER_FIRST_LOGIN_ERROR","IDENTITY_PROVIDER_POST_LOGIN_ERROR","CUSTOM_REQUIRED_ACTION_ERROR","EXECUTE_ACTIONS_ERROR","CLIENT_REGISTER_ERROR","CLIENT_UPDATE_ERROR","CLIENT_DELETE_ERROR"]' -s eventsExpiration=172800
  • Windows

    c:\> kcadm update events/config -r demorealm -s eventsEnabled=true -s "enabledEventTypes=[\"LOGIN_ERROR\",\"REGISTER_ERROR\",\"LOGOUT_ERROR\",\"CODE_TO_TOKEN_ERROR\",\"CLIENT_LOGIN_ERROR\",\"FEDERATED_IDENTITY_LINK_ERROR\",\"REMOVE_FEDERATED_IDENTITY_ERROR\",\"UPDATE_EMAIL_ERROR\",\"UPDATE_PROFILE_ERROR\",\"UPDATE_PASSWORD_ERROR\",\"UPDATE_TOTP_ERROR\",\"UPDATE_CREDENTIAL_ERROR\",\"VERIFY_EMAIL_ERROR\",\"REMOVE_TOTP_ERROR\",\"REMOVE_CREDENTIAL_ERROR\",\"SEND_VERIFY_EMAIL_ERROR\",\"SEND_RESET_PASSWORD_ERROR\",\"SEND_IDENTITY_PROVIDER_LINK_ERROR\",\"RESET_PASSWORD_ERROR\",\"IDENTITY_PROVIDER_FIRST_LOGIN_ERROR\",\"IDENTITY_PROVIDER_POST_LOGIN_ERROR\",\"CUSTOM_REQUIRED_ACTION_ERROR\",\"EXECUTE_ACTIONS_ERROR\",\"CLIENT_REGISTER_ERROR\",\"CLIENT_UPDATE_ERROR\",\"CLIENT_DELETE_ERROR\"]" -s eventsExpiration=172800

保存されたイベントタイプを利用可能なすべてのイベントタイプにリセットできます。値を空のリストに設定することは、すべてを列挙するのと同じです。

$ kcadm.sh update events/config -r demorealm -s enabledEventTypes=[]

監査イベントのストレージを有効にできます。

$ kcadm.sh update events/config -r demorealm -s adminEventsEnabled=true -s adminEventsDetailsEnabled=true

最新の100件のイベントを取得できます。イベントは新しいものから古いものの順に並べられます。

$ kcadm.sh get events --offset 0 --limit 100

保存されたすべてのイベントを削除できます。

$ kcadm delete events

キャッシュのフラッシュ

  1. これらのエンドポイントのいずれかでcreateコマンドを使用して、キャッシュをクリアします。

    • clear-realm-cache

    • clear-user-cache

    • clear-keys-cache

  2. realmをターゲットレルムと同じ値に設定します。

    例:

    $ kcadm.sh create clear-realm-cache -r demorealm -s realm=demorealm
    $ kcadm.sh create clear-user-cache -r demorealm -s realm=demorealm
    $ kcadm.sh create clear-keys-cache -r demorealm -s realm=demorealm

エクスポートされた.jsonファイルからレルムをインポートする

  1. partialImportエンドポイントでcreateコマンドを使用します。

  2. ifResourceExistsFAILSKIP、またはOVERWRITEに設定します。

  3. -fを使用して、エクスポートされたレルムの.jsonファイルを送信します。

    例:

    $ kcadm.sh create partialImport -r demorealm2 -s ifResourceExists=FAIL -o -f demorealm.json

    レルムがまだ存在しない場合は、最初に作成してください。

    例:

    $ kcadm.sh create realms -s realm=demorealm2 -s enabled=true

ロール操作

レルムロールの作成

レルムロールを作成するには、rolesエンドポイントを使用します。

$ kcadm.sh create roles -r demorealm -s name=user -s 'description=Regular user with a limited set of permissions'

クライアントロールの作成

  1. クライアントを特定します。

  2. getコマンドを使用して、利用可能なクライアントをリスト表示します。

    $ kcadm.sh get clients -r demorealm --fields id,clientId
  3. clientId属性を使用して、clients/ID/rolesのようなエンドポイントURIを構築することにより、新しいロールを作成します。

    例:

    $ kcadm.sh create clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles -r demorealm -s name=editor -s 'description=Editor can edit, and publish any article'

レルムロールのリスト表示

既存のレルムロールをリスト表示するには、rolesエンドポイントでgetコマンドを使用します。

$ kcadm.sh get roles -r demorealm

get-rolesコマンドも使用できます。

$ kcadm.sh get-roles -r demorealm

クライアントロールのリスト表示

Keycloakには、レルムロールとクライアントロールのリスト表示を簡素化するための専用のget-rolesコマンドがあります。このコマンドはgetコマンドの拡張であり、getコマンドと同じように動作しますが、ロールをリスト表示するための追加のセマンティクスがあります。

クライアントロールをリスト表示するクライアントを特定するには、clientId(--cclientid)オプションまたはid--cid)オプションを渡して、get-rolesコマンドを使用します。

例:

$ kcadm.sh get-roles -r demorealm --cclientid realm-management

特定のレルムロールの取得

特定のレルムロールのエンドポイントURI(roles/ROLE_NAME、ここでuserは既存のロール名)を構築するには、getコマンドとロールnameを使用します。

例:

$ kcadm.sh get roles/user -r demorealm

ロール名(--rolenameオプション)またはID(--roleidオプション)を渡して、get-rolesコマンドを使用できます。

例:

$ kcadm.sh get-roles -r demorealm --rolename user

特定のクライアントロールの取得

クライアントを特定するにはclientId属性(--cclientidオプション)またはID属性(--cidオプション)を渡し、特定のクライアントロールを特定するにはロール名(--rolenameオプション)またはロールID属性(--roleid)を渡して、get-rolesコマンドを使用します。

例:

$ kcadm.sh get-roles -r demorealm --cclientid realm-management --rolename manage-clients

レルムロールの更新

特定のレルムロールを取得するために使用したエンドポイントURIでupdateコマンドを使用します。

例:

$ kcadm.sh update roles/user -r demorealm -s 'description=Role representing a regular user'

クライアントロールの更新

特定のクライアントロールを取得するために使用したエンドポイントURIでupdateコマンドを使用します。

例:

$ kcadm.sh update clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles/editor -r demorealm -s 'description=User that can edit, and publish articles'

レルムロールの削除

特定のレルムロールを取得するために使用したエンドポイントURIでdeleteコマンドを使用します。

例:

$ kcadm.sh delete roles/user -r demorealm

クライアントロールの削除

特定のクライアントロールを取得するために使用したエンドポイントURIでdeleteコマンドを使用します。

例:

$ kcadm.sh delete clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles/editor -r demorealm

コンポジットロールに割り当てられた、利用可能な、および有効なレルムロールのリスト表示

コンポジットロールに割り当てられた、利用可能な、および有効なレルムロールをリスト表示するには、get-rolesコマンドを使用します。

  1. コンポジットロールに割り当てられたレルムロールをリスト表示するには、名前(--rnameオプション)またはID(--ridオプション)でターゲットコンポジットロールを指定します。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole
  2. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole --effective
  3. コンポジットロールに追加できるレルムロールをリスト表示するには、--availableオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole --available

コンポジットロールに割り当てられた、利用可能な、および有効なクライアントロールのリスト表示

コンポジットロールに割り当てられた、利用可能な、および有効なクライアントロールをリスト表示するには、get-rolesコマンドを使用します。

  1. コンポジットロールに割り当てられたクライアントロールをリスト表示するには、名前(--rnameオプション)またはID(--ridオプション)でターゲットコンポジットロールを指定し、クライアントをclientId属性(--cclientidオプション)またはID(--cidオプション)で指定できます。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management
  2. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management --effective
  3. ターゲットコンポジットロールに追加できるレルムロールをリスト表示するには、--availableオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management --available

コンポジットロールへのレルムロールの追加

Keycloakは、レルムロールとクライアントロールを追加するためのadd-rolesコマンドを提供します。

この例では、userロールをコンポジットロールtestroleに追加します。

$ kcadm.sh add-roles --rname testrole --rolename user -r demorealm

コンポジットロールからのレルムロールの削除

Keycloakは、レルムロールとクライアントロールを削除するためのremove-rolesコマンドを提供します。

次の例では、ターゲットコンポジットロールtestroleからuserロールを削除します。

$ kcadm.sh remove-roles --rname testrole --rolename user -r demorealm

レルムロールへのクライアントロールの追加

Keycloakは、レルムロールとクライアントロールを追加するためのadd-rolesコマンドを提供します。

次の例では、クライアントrealm-managementで定義されたロール、create-client、およびview-usersを、testroleコンポジットロールに追加します。

$ kcadm.sh add-roles -r demorealm --rname testrole --cclientid realm-management --rolename create-client --rolename view-users

クライアントロールへのクライアントロールの追加

  1. get-rolesコマンドを使用して、コンポジットクライアントロールのIDを決定します。

    例:

    $ kcadm.sh get-roles -r demorealm --cclientid test-client --rolename operations
  2. clientId属性がtest-clientという名前のクライアント、supportという名前のクライアントロール、およびIDが "fc400897-ef6a-4e8c-872b-1581b7fa8a71" になるコンポジットロールであるoperationsという名前のクライアントロールが存在すると仮定します。

  3. 別のロールをコンポジットロールに追加するには、次の例を使用します。

    $ kcadm.sh add-roles -r demorealm --cclientid test-client --rid fc400897-ef6a-4e8c-872b-1581b7fa8a71 --rolename support
  4. コンポジットロールのロールをリスト表示するには、get-roles --allコマンドを使用します。

    例:

    $ kcadm.sh get-roles --rid fc400897-ef6a-4e8c-872b-1581b7fa8a71 --all

コンポジットロールからのクライアントロールの削除

コンポジットロールからクライアントロールを削除するには、remove-rolesコマンドを使用します。

次の例では、クライアントrealm-managementで定義された2つのロール、create-clientロールとview-usersロールを、testroleコンポジットロールから削除します。

$ kcadm.sh remove-roles -r demorealm --rname testrole --cclientid realm-management --rolename create-client --rolename view-users

グループへのクライアントロールの追加

レルムロールとクライアントロールを追加するには、add-rolesコマンドを使用します。

次の例では、クライアントrealm-managementで定義されたロール、create-clientview-usersを、Groupグループ(--gnameオプション)に追加します。または、ID(--gidオプション)でグループを指定することもできます。

グループ操作の詳細を参照してください。

$ kcadm.sh add-roles -r demorealm --gname Group --cclientid realm-management --rolename create-client --rolename view-users

グループからのクライアントロールの削除

グループからクライアントロールを削除するには、remove-rolesコマンドを使用します。

次の例では、クライアントrealm-managementで定義された2つのロール、create-clientview-usersを、Groupグループから削除します。

グループ操作の詳細を参照してください。

$ kcadm.sh remove-roles -r demorealm --gname Group --cclientid realm-management --rolename create-client --rolename view-users

クライアント操作

クライアントの作成

  1. 新しいクライアントを作成するには、clientsエンドポイントでcreateコマンドを実行します。

    例:

    $ kcadm.sh create clients -r demorealm -s clientId=myapp -s enabled=true
  2. アダプターが認証するためのシークレットを設定する場合は、シークレットを指定します。

    例:

    $ kcadm.sh create clients -r demorealm -s clientId=myapp -s enabled=true -s clientAuthenticatorType=client-secret -s secret=d0b8122f-8dfb-46b7-b68a-f5cc4e25d000

クライアントのリスト表示

クライアントをリスト表示するには、clientsエンドポイントでgetコマンドを使用します。

この例では、出力をフィルタリングして、id属性とclientId属性のみをリスト表示します。

$ kcadm.sh get clients -r demorealm --fields id,clientId

特定のクライアントの取得

特定のクライアントをターゲットとするエンドポイントURI(clients/IDなど)を構築するには、クライアントIDを使用します。

例:

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

特定のクライアントの現在のシークレットの取得

clients/ID/client-secretなどのエンドポイントURIを構築するには、クライアントIDを使用します。

例:

$ kcadm.sh get clients/$CID/client-secret -r demorealm

特定のクライアントの新しいシークレットの生成

clients/ID/client-secretなどのエンドポイントURIを構築するには、クライアントIDを使用します。

例:

$ kcadm.sh create clients/$CID/client-secret -r demorealm

特定のクライアントの現在のシークレットの更新

clients/IDなどのエンドポイントURIを構築するには、クライアントIDを使用します。

例:

$ kcadm.sh update clients/$CID -s "secret=newSecret" -r demorealm

特定のクライアントのアダプター構成ファイル(keycloak.json)の取得

特定のクライアントをターゲットとするエンドポイントURI(clients/ID/installation/providers/keycloak-oidc-keycloak-jsonなど)を構築するには、クライアントIDを使用します。

例:

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3/installation/providers/keycloak-oidc-keycloak-json -r demorealm

特定のクライアントのWildFlyサブシステムアダプター構成の取得

特定のクライアントをターゲットとするエンドポイントURI(clients/ID/installation/providers/keycloak-oidc-jboss-subsystemなど)を構築するには、クライアントIDを使用します。

例:

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3/installation/providers/keycloak-oidc-jboss-subsystem -r demorealm

特定のクライアントのDocker-v2の構成例の取得

特定のクライアントをターゲットとするエンドポイントURI(clients/ID/installation/providers/docker-v2-compose-yamlなど)を構築するには、クライアントIDを使用します。

応答は.zip形式です。

例:

$ kcadm.sh get https://#:8080/admin/realms/demorealm/clients/8f271c35-44e3-446f-8953-b0893810ebe7/installation/providers/docker-v2-compose-yaml -r demorealm > keycloak-docker-compose-yaml.zip

クライアントの更新

特定のクライアントを取得するために使用するのと同じエンドポイントURIでupdateコマンドを使用します。

例:

  • Linux

    $ kcadm.sh update clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled=false -s publicClient=true -s 'redirectUris=["https://#:8080/myapp/*"]' -s baseUrl=https://#:8080/myapp -s adminUrl=https://#:8080/myapp
  • Windows

    c:\> kcadm update clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled=false -s publicClient=true -s "redirectUris=[\"https://#:8080/myapp/*\"]" -s baseUrl=https://#:8080/myapp -s adminUrl=https://#:8080/myapp

クライアントの削除

特定のクライアントを取得するために使用するのと同じエンドポイントURIでdeleteコマンドを使用します。

例:

$ kcadm.sh delete clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

クライアントのサービスアカウントのロールの追加または削除

クライアントのサービスアカウントは、ユーザー名がservice-account-CLIENT_IDのユーザーアカウントです。通常のユーザーアカウントと同じユーザー操作をこのアカウントで実行できます。

ユーザー操作

ユーザーの作成

新しいユーザーを作成するには、usersエンドポイントでcreateコマンドを実行します。

例:

$ kcadm.sh create users -r demorealm -s username=testuser -s enabled=true

ユーザーのリスト表示

ユーザーをリスト表示するには、usersエンドポイントを使用します。ターゲットユーザーは、次回ログイン時にパスワードを変更する必要があります。

例:

$ kcadm.sh get users -r demorealm --offset 0 --limit 1000

usernamefirstNamelastName、またはemailでユーザーをフィルタリングできます。

例:

$ kcadm.sh get users -r demorealm -q q=email:google.com
$ kcadm.sh get users -r demorealm -q q=username:testuser

フィルタリングは完全一致を使用しません。この例では、username属性の値を*testuser*パターンと照合します。

クライアント、グループ、およびユーザーの場合、より複雑なqクエリパラメータを指定することにより、複数の属性にわたってフィルタリングできます。「-q q="field1:value1 field2:value2"」のようなものを使用できます。Keycloakは、すべてのアトリビュートの条件に一致するユーザーのみを返します。

特定のユーザーの取得

users/USER_IDなどのエンドポイントURIを構成するには、ユーザーIDを使用します。

例:

$ kcadm.sh get users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

ユーザーの更新

特定のユーザーを取得するために使用するのと同じエンドポイントURIでupdateコマンドを使用します。

例:

  • Linux

    $ kcadm.sh update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s 'requiredActions=["VERIFY_EMAIL","UPDATE_PROFILE","CONFIGURE_TOTP","UPDATE_PASSWORD"]'
  • Windows

    c:\> kcadm update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s "requiredActions=[\"VERIFY_EMAIL\",\"UPDATE_PROFILE\",\"CONFIGURE_TOTP\",\"UPDATE_PASSWORD\"]"

ユーザーの削除

特定のユーザーを取得するために使用するのと同じエンドポイントURIでdeleteコマンドを使用します。

例:

$ kcadm.sh delete users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

ユーザーのパスワードのリセット

ユーザーのパスワードをリセットするには、専用のset-passwordコマンドを使用します。

例:

$ kcadm.sh set-password -r demorealm --username testuser --new-password NEWPASSWORD --temporary

このコマンドは、ユーザーの一時パスワードを設定します。ターゲットユーザーは、次回ログイン時にパスワードを変更する必要があります。

id属性を使用してユーザーを指定するには、--useridを使用できます。

users/USER_ID/reset-passwordなど、特定のユーザーを取得するために使用したエンドポイントから構築されたエンドポイントでupdateコマンドを使用しても、同じ結果を得ることができます。

例:

$ kcadm.sh update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2/reset-password -r demorealm -s type=password -s value=NEWPASSWORD -s temporary=true -n

-nパラメータは、KeycloakがPUTコマンドの前にGETコマンドを実行せずにPUTコマンドを実行するようにします。これは、reset-passwordエンドポイントがGETをサポートしていないために必要です。

ユーザーに割り当てられた、利用可能な、および有効なレルムロールのリスト表示

ユーザーに割り当てられた、利用可能な、および有効なレルムロールをリスト表示するには、get-rolesコマンドを使用できます。

  1. ユーザーの割り当てられたレルムロールをリスト表示するには、ユーザー名またはIDでターゲットユーザーを指定します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser
  2. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser --effective
  3. ユーザーに追加できるレルムロールをリスト表示するには、--availableオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser --available

ユーザーに割り当てられた、利用可能な、および有効なクライアントロールのリスト表示

ユーザーに割り当てられた、利用可能な、および有効なクライアントロールをリスト表示するには、get-rolesコマンドを使用します。

  1. ユーザーの割り当てられたクライアントロールをリスト表示するには、ユーザー名(--uusernameオプション)またはID(--uidオプション)でターゲットユーザーを指定し、クライアントをclientId属性(--cclientidオプション)またはID(--cidオプション)で指定します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management
  2. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management --effective
  3. ユーザーに追加できるレルムロールをリスト表示するには、--availableオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management --available

ユーザーへのレルムロールの追加

ユーザーにレルムロールを追加するには、add-rolesコマンドを使用します。

次の例では、userロールをユーザーtestuserに追加します。

$ kcadm.sh add-roles --uusername testuser --rolename user -r demorealm

ユーザーからのレルムロールの削除

ユーザーからレルムロールを削除するには、remove-rolesコマンドを使用します。

次の例では、ユーザーtestuserからuserロールを削除します。

$ kcadm.sh remove-roles --uusername testuser --rolename user -r demorealm

ユーザーへのクライアントロールの追加

ユーザーにクライアントロールを追加するには、add-rolesコマンドを使用します。

次の例では、クライアントrealm-managementで定義された2つのロール、create-clientロールとview-usersロールを、ユーザーtestuserに追加します。

$ kcadm.sh add-roles -r demorealm --uusername testuser --cclientid realm-management --rolename create-client --rolename view-users

ユーザーからのクライアントロールの削除

ユーザーからクライアントロールを削除するには、remove-rolesコマンドを使用します。

次の例では、realm-managementクライアントで定義された2つのロールを削除します。

$ kcadm.sh remove-roles -r demorealm --uusername testuser --cclientid realm-management --rolename create-client --rolename view-users

ユーザーのセッションのリスト表示

  1. ユーザーのIDを特定し、

  2. users/ID/sessionsなどのエンドポイントURIを構成するには、IDを使用します。

  3. ユーザーのセッションのリストを取得するには、getコマンドを使用します。

    例:

    $ kcadm.sh get users/6da5ab89-3397-4205-afaa-e201ff638f9e/sessions -r demorealm

特定のセッションからのユーザーのログアウト

  1. 前に説明したように、セッションのIDを特定します。

  2. sessions/IDなどのエンドポイントURIを構成するには、セッションのIDを使用します。

  3. セッションを無効にするには、deleteコマンドを使用します。

    例:

    $ kcadm.sh delete sessions/d0eaa7cc-8c5d-489d-811a-69d3c4ec84d1 -r demorealm

すべてのセッションからのユーザーのログアウト

users/ID/logoutなどのエンドポイントURIを構築するには、ユーザーのIDを使用します。

そのエンドポイントURIでPOSTを実行するには、createコマンドを使用します。

例:

$ kcadm.sh create users/6da5ab89-3397-4205-afaa-e201ff638f9e/logout -r demorealm -s realm=demorealm -s user=6da5ab89-3397-4205-afaa-e201ff638f9e

グループ操作

グループの作成

新しいグループを作成するには、groupsエンドポイントでcreateコマンドを使用します。

例:

$ kcadm.sh create groups -r demorealm -s name=Group

グループのリスト表示

グループをリスト表示するには、groupsエンドポイントでgetコマンドを使用します。

例:

$ kcadm.sh get groups -r demorealm

特定のグループの取得

groups/GROUP_IDなどのエンドポイントURIを構成するには、グループのIDを使用します。

例:

$ kcadm.sh get groups/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

グループの更新

特定のグループを取得するために使用するのと同じエンドポイントURIでupdateコマンドを使用します。

例:

$ kcadm.sh update groups/51204821-0580-46db-8f2d-27106c6b5ded -s 'attributes.email=["group@example.com"]' -r demorealm

グループの削除

特定のグループを取得するために使用するのと同じエンドポイントURIでdeleteコマンドを使用します。

例:

$ kcadm.sh delete groups/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

サブグループの作成

グループをリスト表示して、親グループのIDを見つけます。そのIDを使用して、groups/GROUP_ID/childrenなどのエンドポイントURIを構築します。

例:

$ kcadm.sh create groups/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s name=SubGroup

別のグループの下へのグループの移動

  1. 既存の親グループのIDと既存の子グループのIDを見つけます。

  2. groups/PARENT_GROUP_ID/childrenなどのエンドポイントURIを構築するには、親グループのIDを使用します。

  3. このエンドポイントでcreateコマンドを実行し、子グループのIDをJSONボディとして渡します。

例:

$ kcadm.sh create groups/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s id=08d410c6-d585-4059-bb07-54dcb92c5094 -s name=SubGroup

特定のユーザーのグループの取得

ユーザーがグループのメンバーシップを決定するためにユーザーのIDを使用して、users/USER_ID/groupsなどのエンドポイントURIを構成します。

例:

$ kcadm.sh get users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups -r demorealm

グループへのユーザーの追加

ユーザーをグループに追加するには、users/USER_ID/groups/GROUP_IDなどのユーザーIDとグループIDで構成されたエンドポイントURIでupdateコマンドを使用します。

例:

$ kcadm.sh update users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm -s realm=demorealm -s userId=b544f379-5fc4-49e5-8a8d-5cfb71f46f53 -s groupId=ce01117a-7426-4670-a29a-5c118056fe20 -n

グループからのユーザーの削除

ユーザーをグループに追加するために使用するのと同じエンドポイントURI(users/USER_ID/groups/GROUP_IDなど)でdeleteコマンドを使用して、グループからユーザーを削除します。

例:

$ kcadm.sh delete users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm

グループに割り当てられた、利用可能な、および有効なレルムロールのリスト表示

グループに割り当てられた、利用可能な、および有効なレルムロールをリスト表示するには、専用のget-rolesコマンドを使用します。

  1. グループの割り当てられたレルムロールを一覧表示するには、名前 (--gname オプション)、パス (--gpath オプション)、または ID (--gid オプション) でターゲットグループを指定します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group
  2. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group --effective
  3. グループに追加できるレルムロールを一覧表示するには、--available オプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group --available

グループに割り当てられた、利用可能な、および有効なクライアントロールの一覧表示

グループに割り当てられた、利用可能な、および有効なクライアントロールを一覧表示するには、get-roles コマンドを使用します。

  1. 名前 (--gname オプション) または ID (--gid オプション) でターゲットグループを指定します。

  2. ユーザーの割り当てられたクライアントロールを一覧表示するには、clientId 属性 (--cclientid オプション) または ID (--id オプション) でクライアントを指定します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management
  3. 有効なレルムロールをリスト表示するには、--effectiveオプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management --effective
  4. グループにまだ追加できるレルムロールを一覧表示するには、--available オプションを使用します。

    例:

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management --available

アイデンティティプロバイダー操作

利用可能なアイデンティティプロバイダーの一覧表示

利用可能なアイデンティティプロバイダーを一覧表示するには、serverinfo エンドポイントを使用します。

例:

$ kcadm.sh get serverinfo -r demorealm --fields 'identityProviders(*)'

Keycloak は、serverinfo エンドポイントを realms エンドポイントと同様に処理します。Keycloak は、特定のレルムの外部に存在するため、ターゲットレルムを基準としたエンドポイントを解決しません。

設定済みのアイデンティティプロバイダーの一覧表示

identity-provider/instances エンドポイントを使用します。

例:

$ kcadm.sh get identity-provider/instances -r demorealm --fields alias,providerId,enabled

特定の設定済みアイデンティティプロバイダーの取得

特定のアイデンティティプロバイダーを取得するには、identity-provider/instances/ALIAS など、アイデンティティプロバイダーの alias 属性を使用してエンドポイント URI を構成します。

例:

$ kcadm.sh get identity-provider/instances/facebook -r demorealm

特定の設定済みアイデンティティプロバイダーの削除

特定の設定済みアイデンティティプロバイダーを削除するには、特定の設定済みアイデンティティプロバイダーを取得するために使用するのと同じエンドポイント URI で delete コマンドを使用します。

例:

$ kcadm.sh delete identity-provider/instances/facebook -r demorealm

Keycloak OpenID Connect アイデンティティプロバイダーの設定

  1. 新しいアイデンティティプロバイダーインスタンスを作成するときは、providerId として keycloak-oidc を使用します。

  2. config 属性 (authorizationUrltokenUrlclientId、および clientSecret) を指定します。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=keycloak-oidc -s providerId=keycloak-oidc -s enabled=true -s 'config.useJwksUrl="true"' -s config.authorizationUrl=https://#:8180/realms/demorealm/protocol/openid-connect/auth -s config.tokenUrl=https://#:8180/realms/demorealm/protocol/openid-connect/token -s config.clientId=demo-oidc-provider -s config.clientSecret=secret

OpenID Connect アイデンティティプロバイダーの設定

汎用 OpenID Connect プロバイダーを設定する方法は、Keycloak OpenID Connect プロバイダーを設定する方法と同じですが、providerId 属性値を oidc に設定する点が異なります。

SAML 2 アイデンティティプロバイダーの設定

  1. providerId として saml を使用します。

  2. config 属性 (singleSignOnServiceUrlnameIDPolicyFormat、および signatureAlgorithm) を指定します。

例:

$ kcadm.sh create identity-provider/instances -r demorealm -s alias=saml -s providerId=saml -s enabled=true -s 'config.useJwksUrl="true"' -s config.singleSignOnServiceUrl=https://#:8180/realms/saml-broker-realm/protocol/saml -s config.nameIDPolicyFormat=urn:oasis:names:tc:SAML:2.0:nameid-format:persistent -s config.signatureAlgorithm=RSA_SHA256

Facebook アイデンティティプロバイダーの設定

  1. providerId として facebook を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの Facebook Developers アプリケーション設定ページにあります。詳細については、Facebook アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=facebook -s providerId=facebook -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=FACEBOOK_CLIENT_ID -s config.clientSecret=FACEBOOK_CLIENT_SECRET

Google アイデンティティプロバイダーの設定

  1. providerId として google を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの Google Developers アプリケーション設定ページにあります。詳細については、Google アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=google -s providerId=google -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=GOOGLE_CLIENT_ID -s config.clientSecret=GOOGLE_CLIENT_SECRET

Twitter アイデンティティプロバイダーの設定

  1. providerId として twitter を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの Twitter Application Management アプリケーション設定ページにあります。詳細については、Twitter アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=google -s providerId=google -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=TWITTER_API_KEY -s config.clientSecret=TWITTER_API_SECRET

GitHub アイデンティティプロバイダーの設定

  1. providerId として github を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの GitHub Developer Application Settings ページにあります。詳細については、GitHub アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=github -s providerId=github -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=GITHUB_CLIENT_ID -s config.clientSecret=GITHUB_CLIENT_SECRET

LinkedIn アイデンティティプロバイダーの設定

  1. providerId として linkedin を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの LinkedIn Developer Console アプリケーションページにあります。詳細については、LinkedIn アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=linkedin -s providerId=linkedin -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=LINKEDIN_CLIENT_ID -s config.clientSecret=LINKEDIN_CLIENT_SECRET

Microsoft Live アイデンティティプロバイダーの設定

  1. providerId として microsoft を使用します。

  2. config 属性 (clientId および clientSecret) を指定します。これらの属性は、アプリケーションの Microsoft Application Registration Portal ページにあります。詳細については、Microsoft アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=microsoft -s providerId=microsoft -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=MICROSOFT_APP_ID -s config.clientSecret=MICROSOFT_PASSWORD

Stack Overflow アイデンティティプロバイダーの設定

  1. providerId として stackoverflow コマンドを使用します。

  2. config 属性 (clientIdclientSecret、および key) を指定します。これらの属性は、アプリケーションの Stack Apps OAuth ページにあります。詳細については、Stack Overflow アイデンティティブローカーのページを参照してください。

    例:

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=stackoverflow -s providerId=stackoverflow -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=STACKAPPS_CLIENT_ID -s config.clientSecret=STACKAPPS_CLIENT_SECRET -s config.key=STACKAPPS_KEY

ストレージプロバイダー操作

Kerberos ストレージプロバイダーの設定

  1. components エンドポイントに対して create コマンドを使用します。

  2. レルム ID を parentId 属性の値として指定します。

  3. providerId 属性の値として kerberos を、providerType 属性の値として org.keycloak.storage.UserStorageProvider を指定します。

  4. 例:

    $ kcadm.sh create components -r demorealm -s parentId=demorealmId -s id=demokerberos -s name=demokerberos -s providerId=kerberos -s providerType=org.keycloak.storage.UserStorageProvider -s 'config.priority=["0"]' -s 'config.debug=["false"]' -s 'config.allowPasswordAuthentication=["true"]' -s 'config.editMode=["UNSYNCED"]' -s 'config.updateProfileFirstLogin=["true"]' -s 'config.allowKerberosAuthentication=["true"]' -s 'config.kerberosRealm=["KEYCLOAK.ORG"]' -s 'config.keyTab=["http.keytab"]' -s 'config.serverPrincipal=["HTTP/localhost@KEYCLOAK.ORG"]' -s 'config.cachePolicy=["DEFAULT"]'

LDAP ユーザーストレージプロバイダーの設定

  1. components エンドポイントに対して create コマンドを使用します。

  2. providerId 属性の値として ldap を、providerType 属性の値として org.keycloak.storage.UserStorageProvider を指定します。

  3. レルム ID を parentId 属性の値として指定します。

  4. Kerberos 統合 LDAP プロバイダーを作成するには、次の例を使用します。

    $ kcadm.sh create components -r demorealm -s name=kerberos-ldap-provider -s providerId=ldap -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=3d9c572b-8f33-483f-98a6-8bb421667867  -s 'config.priority=["1"]' -s 'config.fullSyncPeriod=["-1"]' -s 'config.changedSyncPeriod=["-1"]' -s 'config.cachePolicy=["DEFAULT"]' -s config.evictionDay=[] -s config.evictionHour=[] -s config.evictionMinute=[] -s config.maxLifespan=[] -s 'config.batchSizeForSync=["1000"]' -s 'config.editMode=["WRITABLE"]' -s 'config.syncRegistrations=["false"]' -s 'config.vendor=["other"]' -s 'config.usernameLDAPAttribute=["uid"]' -s 'config.rdnLDAPAttribute=["uid"]' -s 'config.uuidLDAPAttribute=["entryUUID"]' -s 'config.userObjectClasses=["inetOrgPerson, organizationalPerson"]' -s 'config.connectionUrl=["ldap://#:10389"]'  -s 'config.usersDn=["ou=People,dc=keycloak,dc=org"]' -s 'config.authType=["simple"]' -s 'config.bindDn=["uid=admin,ou=system"]' -s 'config.bindCredential=["secret"]' -s 'config.searchScope=["1"]' -s 'config.useTruststoreSpi=["always"]' -s 'config.connectionPooling=["true"]' -s 'config.pagination=["true"]' -s 'config.allowKerberosAuthentication=["true"]' -s 'config.serverPrincipal=["HTTP/localhost@KEYCLOAK.ORG"]' -s 'config.keyTab=["http.keytab"]' -s 'config.kerberosRealm=["KEYCLOAK.ORG"]' -s 'config.debug=["true"]' -s 'config.useKerberosForPasswordAuthentication=["true"]'

ユーザーストレージプロバイダーインスタンスの削除

  1. components/ID など、ストレージプロバイダーインスタンスの id 属性を使用してエンドポイント URI を構成します。

  2. このエンドポイントに対して delete コマンドを実行します。

    例:

    $ kcadm.sh delete components/3d9c572b-8f33-483f-98a6-8bb421667867 -r demorealm

特定のユーザーストレージプロバイダーのすべてのユーザーの同期のトリガー

  1. user-storage/ID_OF_USER_STORAGE_INSTANCE/sync など、ストレージプロバイダーの id 属性を使用してエンドポイント URI を構成します。

  2. action=triggerFullSync クエリパラメーターを追加します。

  3. create コマンドを実行します。

    例:

    $ kcadm.sh create user-storage/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/sync?action=triggerFullSync

特定のユーザーストレージプロバイダーの変更されたユーザーの同期のトリガー

  1. user-storage/ID_OF_USER_STORAGE_INSTANCE/sync など、ストレージプロバイダーの id 属性を使用してエンドポイント URI を構成します。

  2. action=triggerChangedUsersSync クエリパラメーターを追加します。

  3. create コマンドを実行します。

    例:

    $ kcadm.sh create user-storage/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/sync?action=triggerChangedUsersSync

LDAP ユーザーストレージ接続のテスト

  1. testLDAPConnection エンドポイントで get コマンドを実行します。

  2. クエリパラメーター bindCredentialbindDnconnectionUrl、および useTruststoreSpi を指定します。

  3. action クエリパラメーターを testConnection に設定します。

    例:

    $ kcadm.sh create testLDAPConnection -s action=testConnection -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://#:10389 -s useTruststoreSpi=always

LDAP ユーザーストレージ認証のテスト

  1. testLDAPConnection エンドポイントで get コマンドを実行します。

  2. クエリパラメーター bindCredentialbindDnconnectionUrl、および useTruststoreSpi を指定します。

  3. action クエリパラメーターを testAuthentication に設定します。

    例:

    $ kcadm.sh create testLDAPConnection -s action=testAuthentication -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://#:10389 -s useTruststoreSpi=always

マッパーの追加

ハードコードされたロール LDAP マッパーの追加

  1. components エンドポイントで create コマンドを実行します。

  2. providerType 属性を org.keycloak.storage.ldap.mappers.LDAPStorageMapper に設定します。

  3. parentId 属性を LDAP プロバイダーインスタンスの ID に設定します。

  4. providerId 属性を hardcoded-ldap-role-mapper に設定します。role 設定パラメーターの値を必ず指定してください。

    例:

    $ kcadm.sh create components -r demorealm -s name=hardcoded-ldap-role-mapper -s providerId=hardcoded-ldap-role-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config.role=["realm-management.create-client"]'

MS Active Directory マッパーの追加

  1. components エンドポイントで create コマンドを実行します。

  2. providerType 属性を org.keycloak.storage.ldap.mappers.LDAPStorageMapper に設定します。

  3. parentId 属性を LDAP プロバイダーインスタンスの ID に設定します。

  4. providerId 属性を msad-user-account-control-mapper に設定します。

    例:

    $ kcadm.sh create components -r demorealm -s name=msad-user-account-control-mapper -s providerId=msad-user-account-control-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea

ユーザー属性 LDAP マッパーの追加

  1. components エンドポイントで create コマンドを実行します。

  2. providerType 属性を org.keycloak.storage.ldap.mappers.LDAPStorageMapper に設定します。

  3. parentId 属性を LDAP プロバイダーインスタンスの ID に設定します。

  4. providerId 属性を user-attribute-ldap-mapper に設定します。

    例:

    $ kcadm.sh create components -r demorealm -s name=user-attribute-ldap-mapper -s providerId=user-attribute-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."user.model.attribute"=["email"]' -s 'config."ldap.attribute"=["mail"]' -s 'config."read.only"=["false"]' -s 'config."always.read.value.from.ldap"=["false"]' -s 'config."is.mandatory.in.ldap"=["false"]'

グループ LDAP マッパーの追加

  1. components エンドポイントで create コマンドを実行します。

  2. providerType 属性を org.keycloak.storage.ldap.mappers.LDAPStorageMapper に設定します。

  3. parentId 属性を LDAP プロバイダーインスタンスの ID に設定します。

  4. providerId 属性を group-ldap-mapper に設定します。

    例:

    $ kcadm.sh create components -r demorealm -s name=group-ldap-mapper -s providerId=group-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."groups.dn"=[]' -s 'config."group.name.ldap.attribute"=["cn"]' -s 'config."group.object.classes"=["groupOfNames"]' -s 'config."preserve.group.inheritance"=["true"]' -s 'config."membership.ldap.attribute"=["member"]' -s 'config."membership.attribute.type"=["DN"]' -s 'config."groups.ldap.filter"=[]' -s 'config.mode=["LDAP_ONLY"]' -s 'config."user.roles.retrieve.strategy"=["LOAD_GROUPS_BY_MEMBER_ATTRIBUTE"]' -s 'config."mapped.group.attributes"=["admins-group"]' -s 'config."drop.non.existing.groups.during.sync"=["false"]' -s 'config.roles=["admins"]' -s 'config.groups=["admins-group"]' -s 'config.group=[]' -s 'config.preserve=["true"]' -s 'config.membership=["member"]'

フルネーム LDAP マッパーの追加

  1. components エンドポイントで create コマンドを実行します。

  2. providerType 属性を org.keycloak.storage.ldap.mappers.LDAPStorageMapper に設定します。

  3. parentId 属性を LDAP プロバイダーインスタンスの ID に設定します。

  4. providerId 属性を full-name-ldap-mapper に設定します。

    例:

    $ kcadm.sh create components -r demorealm -s name=full-name-ldap-mapper -s providerId=full-name-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."ldap.full.name.attribute"=["cn"]' -s 'config."read.only"=["false"]' -s 'config."write.only"=["true"]'

認証操作

パスワードポリシーの設定

  1. レルムの passwordPolicy 属性を、特定のポリシープロバイダー ID とオプション設定を含む列挙式に設定します。

  2. パスワードポリシーをデフォルト値に設定するには、次の例を使用します。デフォルト値には以下が含まれます。

    • 210,000 回のハッシュ反復

    • 少なくとも 1 つの特殊文字

    • 少なくとも 1 つの大文字

    • 少なくとも 1 つの数字

    • ユーザーの username と等しくないこと

    • 少なくとも 8 文字の長さであること

      $ kcadm.sh update realms/demorealm -s 'passwordPolicy="hashIterations and specialChars and upperCase and digits and notUsername and length"'
  3. デフォルトと異なる値を使用するには、角かっこで設定を渡します。

  4. パスワードポリシーを以下に設定するには、次の例を使用します。

    • 300,000 回のハッシュ反復

    • 少なくとも 2 つの特殊文字

    • 少なくとも 2 つの大文字

    • 少なくとも 2 つの小文字

    • 少なくとも 2 つの数字

    • 少なくとも 9 文字の長さであること

    • ユーザーの username と等しくないこと

    • 少なくとも 4 回前の変更まで繰り返さないこと

      $ kcadm.sh update realms/demorealm -s 'passwordPolicy="hashIterations(300000) and specialChars(2) and upperCase(2) and lowerCase(2) and digits(2) and length(9) and notUsername and passwordHistory(4)"'

現在のパスワードポリシーの取得

passwordPolicy 属性を除くすべての出力をフィルタリングすることで、現在のレルム構成を取得できます。

たとえば、demorealmpasswordPolicy を表示します。

$ kcadm.sh get realms/demorealm --fields passwordPolicy

認証フローの一覧表示

authentication/flows エンドポイントで get コマンドを実行します。

例:

$ kcadm.sh get authentication/flows -r demorealm

特定の認証フローの取得

authentication/flows/FLOW_ID エンドポイントで get コマンドを実行します。

例:

$ kcadm.sh get authentication/flows/febfd772-e1a1-42fb-b8ae-00c0566fafb8 -r demorealm

フローの実行の一覧表示

authentication/flows/FLOW_ALIAS/executions エンドポイントで get コマンドを実行します。

例:

$ kcadm.sh get authentication/flows/Copy%20of%20browser/executions -r demorealm

実行への構成の追加

  1. フローの実行を取得します。

  2. フローの ID をメモします。

  3. authentication/executions/{executionId}/config エンドポイントで create コマンドを実行します。

例:

$ kcadm.sh create "authentication/executions/a3147129-c402-4760-86d9-3f2345e401c7/config" -r demorealm -b '{"config":{"x509-cert-auth.mapping-source-selection":"Match SubjectDN using regular expression","x509-cert-auth.regular-expression":"(.*?)(?:$)","x509-cert-auth.mapper-selection":"Custom Attribute Mapper","x509-cert-auth.mapper-selection.user-attribute-name":"usercertificate","x509-cert-auth.crl-checking-enabled":"","x509-cert-auth.crldp-checking-enabled":false,"x509-cert-auth.crl-relative-path":"crl.pem","x509-cert-auth.ocsp-checking-enabled":"","x509-cert-auth.ocsp-responder-uri":"","x509-cert-auth.keyusage":"","x509-cert-auth.extendedkeyusage":"","x509-cert-auth.confirmation-page-disallowed":""},"alias":"my_otp_config"}'

実行の構成の取得

  1. フローの実行を取得します。

  2. 構成 ID を含む authenticationConfig 属性をメモします。

  3. authentication/config/ID エンドポイントで get コマンドを実行します。

例:

$ kcadm get "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm

実行の構成の更新

  1. フローの実行を取得します。

  2. フローの authenticationConfig 属性を取得します。

  3. 属性から構成 ID をメモします。

  4. authentication/config/ID エンドポイントで update コマンドを実行します。

例:

$ kcadm update "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm -b '{"id":"dd91611a-d25c-421a-87e2-227c18421833","alias":"my_otp_config","config":{"x509-cert-auth.extendedkeyusage":"","x509-cert-auth.mapper-selection.user-attribute-name":"usercertificate","x509-cert-auth.ocsp-responder-uri":"","x509-cert-auth.regular-expression":"(.*?)(?:$)","x509-cert-auth.crl-checking-enabled":"true","x509-cert-auth.confirmation-page-disallowed":"","x509-cert-auth.keyusage":"","x509-cert-auth.mapper-selection":"Custom Attribute Mapper","x509-cert-auth.crl-relative-path":"crl.pem","x509-cert-auth.crldp-checking-enabled":"false","x509-cert-auth.mapping-source-selection":"Match SubjectDN using regular expression","x509-cert-auth.ocsp-checking-enabled":""}}'

実行の構成の削除

  1. フローの実行を取得します。

  2. フローの authenticationConfig 属性を取得します。

  3. 属性から構成 ID をメモします。

  4. authentication/config/ID エンドポイントで delete コマンドを実行します。

例:

$ kcadm delete "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm