LDAP 統合

BobIDP カスタムリソースと bobctl configure-idp コマンドを使用して、IBM Bob オンプレミスの LDAP または Active Directory フェデレーションを設定します。

bobctl configure-idp を使用して、LDAP または Active Directory 環境を Keycloak にユーザーフェデレーションプロバイダーとして接続します。このセットアップはインストール時またはデプロイメント後のいつでも完了できます。

始める前に

LDAP フェデレーションを設定する前に、以下の要件が満たされていることを確認してください。

  • OpenShift Container Platform (OCP) クラスターが適切なポートで LDAP サーバーへのネットワーク接続を持っていること:
    • ldap:// には 389
    • ldaps:// には 636
  • ディレクトリへの読み取りアクセスを持つサービスアカウント (バインド DN) が利用可能であること、またはLDAP サーバーが匿名バインドを許可するよう設定されていること。
  • プライベートまたは内部署名の証明書局 (CA) を使用した ldaps:// を使用する場合は、PEM 形式の LDAP サーバーの CA 証明書を取得してください。
  • bobctl コマンドラインユーティリティがインストールされており、oc がターゲットクラスターに対して設定され認証されていること。

設定ファイルリファレンス

LDAP プロバイダーを登録する前に、提供されたテンプレートから IDP 設定ファイルを作成してください。

cp config-idp-template.yaml my-idp.yaml

設定ファイルにはデプロイメント全体に適用されるトップレベルフィールドと、各 LDAP フェデレーションプロバイダーを記述するエントリを含むオプションの ldaps リストの 2 つのセクションがあります。

トップレベルフィールド

フィールド必須説明
domainsはいログイン時に Bob が受け入れるメールドメインのリスト。ドメインを削除するとその登録が解除され、そのドメインのユーザーはログインできなくなります。
adminEmailsいいえBob 管理者アクセスを付与するユーザーのメールのリスト。オペレーターは Keycloak の bob-admins グループと Bob 管理者データベースの両方を一括で更新します。
ldapsいいえLDAP フェデレーションプロバイダー設定のリスト。直接 Keycloak ユーザーのみを使用するデプロイメントでは完全に省略してください。

必須フィールド (LDAP プロバイダーエントリごと)

フィールド説明
nameLDAP プロバイダーの一意の説明的な識別子。設定された各プロバイダーは個別の名前を持つ必要があります。
vendor統合する LDAP ディレクトリのタイプを指定します。サポート値: other (OpenLDAP および LDAPv3 準拠)、ad (Microsoft Active Directory)、rhds (Red Hat Directory Server)、tivoli (IBM Security Directory Server)、edirectory (NetIQ eDirectory)。
connectionUrlプロトコル (ldap:// または ldaps://)、ホスト名、ポート番号を含む LDAP サーバーの完全な URL。
usersDnユーザーアカウントが保存され、ユーザーエントリが検索およびインポートされるディレクトリの場所。
usernameLDAPAttribute認証時にユーザーがユーザー名として提供するディレクトリ属性。
rdnLDAPAttributeディレクトリ構造内でエントリを識別するために使用されるディレクトリ属性。ほとんどの設定では usernameLDAPAttribute と同じです。
uuidLDAPAttribute各ユーザーアカウントを永続的に識別するために使用される一意の安定した変更不可のディレクトリ属性。
userObjectClassesどのディレクトリエントリがユーザーアカウントとして認識および処理されるかを定義する LDAP オブジェクトクラスのカンマ区切りリスト。
重要:

domains フィールドは、オンプレミスデプロイメントでドメインベースのルーティングを設定するための唯一の方法です。Bob 管理ユーザーインターフェースからドメインを設定しないでください。正しい方法ではなく、認証エラーの原因となる可能性があります。

オプションフィールド (LDAP プロバイダーエントリごと)

フィールド説明
bindDnディレクトリへの認証と接続に使用されるサービスアカウントの DN。ディレクトリが匿名バインドアクセスを許可する場合は省略できます。
bindPasswordSecretバインドアカウントパスワードを含む既存の Secret の名前。bobctl configure-idp を実行する前に、インスタンス名前空間に作成しておく必要があります。
useTruststoreSpiLDAP CA 証明書をサーバー検証に使用するタイミングを指定します。値: always (デフォルト、プライベートまたは内部発行の CA 証明書の場合)、ldapsOnly (公開信頼の CA 証明書の場合)、never (セキュアでない ldap:// で接続する場合)。
ldapsCACertSecretPEM 形式の LDAP サーバーの CA 証明書を含む既存の Secret の名前。bobctl configure-idp を実行する前に、インスタンス名前空間に作成しておく必要があります。
searchScopeディレクトリ検索の深さを決定します。2 はすべての子コンテナとサブツリーを検索します (デフォルト)。1 は直接の子エントリのみに検索を制限します。
customUserSearchFilterすべてのユーザー検索操作に適用される追加フィルター。例えばサービスアカウントを除外したり、検索を特定のユーザータイプに制限したりするために使用します。
userSync.enabledtrue に設定すると、プロバイダーが最初に設定されたときにすべてのユーザーがインポートされ、その後のディレクトリの変更は 5 分ごとに同期されます。ほとんどのデプロイメントに推奨されます。
userAttributeMappingsディレクトリ属性を email、firstName、lastName などの Bob ユーザープロフィールフィールドにマッピングする方法を定義します。
priority複数のプロバイダーが設定されている場合にプロバイダーが評価される順序を決定します。値が小さいプロバイダーが最初に確認されます。デフォルトは 0 です。
groupMapperLDAP グループを Keycloak に同期します。LDAP グループ同期の設定を参照してください。

ユーザー同期の動作

userSync.enabled が true に設定されると、Bob は LDAP プロバイダーが登録されたときにすべてのユーザーを 1 回限りインポートします。初期インポートが完了した後、継続的なユーザーライフサイクル同期は SCIM を通じて自動的に処理されます。

ヒント:

大規模な LDAP ディレクトリの場合は、userSync.enabled を false のままにして、ユーザーが初回サインイン時にプロビジョニングされるようにすることを検討してください。このアプローチにより、LDAP プロバイダーの登録に必要な時間を短縮できます。

LDAP グループ同期の設定

オプションの groupMapper 設定を使用して、LDAP グループを Keycloak と同期します。グループ同期を使用すると、LDAP ディレクトリのユーザーとグループメンバーシップが Keycloak 経由でインポートおよび管理されます。

groupsDn パラメーターは必須です。その他のすべてのパラメーターはオプションであり、LDAP ディレクトリスキーマとグループ構造に合わせてカスタマイズできます。

制限:

bob-admins と bob-users グループはプラットフォームが管理するグループです。LDAP グループ同期には含まれません。

パラメーターデフォルト値説明
groupsDn必須LDAP グループエントリを含むベース識別名 (DN)。
namegroupsKeycloak でのグループマッパーの表示名。
groupNameLdapAttributecnKeycloak がグループ名として使用する LDAP 属性。
groupObjectClassesgroupOfNamesグループエントリを識別する LDAP オブジェクトクラスまたはクラス群。
membershipLdapAttributememberメンバー情報を含むグループエントリの属性。
membershipAttributeTypeDNメンバー値の形式。サポート値: DN (識別名) と UID (ユーザー ID)。
userRolesRetrieveStrategyLOAD_GROUPS_BY_MEMBER_ATTRIBUTEグループメンバーシップを決定するために使用される方法。
memberOfLdapAttributememberOfGET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE を使用する場合のグループメンバーシップ情報を含むユーザー属性。
customGroupSearchFilterなしグループを検索するときに使用される追加の LDAP フィルター。フィルターは括弧で囲む必要があります。例: (cn=dept-*)。
modeLDAP_ONLY同期モード。サポート値: LDAP_ONLY と READ_ONLY。
groupsPath/同期されたグループが作成される Keycloak グループ階層内の場所。

グループメンバーシップ取得ストラテジー

userRolesRetrieveStrategy パラメーターは、Keycloak がユーザーのグループメンバーシップを識別する方法を制御します。

ストラテジー説明
LOAD_GROUPS_BY_MEMBER_ATTRIBUTEユーザーへの参照を含むグループエントリを検索してグループメンバーシップを取得します。
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTEユーザーの memberOf 属性からグループメンバーシップを取得します。
LOAD_GROUPS_BY_MEMBER_ATTRIBUTE_RECURSIVELYLDAP ディレクトリでサポートされている場合、ネストされたグループを含めて再帰的にグループメンバーシップを取得します。
ヒント:

LDAP ディレクトリが memberOf 属性を通じてユーザーエントリにグループメンバーシップ情報を保存する場合や、再帰的な検索が必要なネストされたグループ構造を使用する場合を除き、LOAD_GROUPS_BY_MEMBER_ATTRIBUTE を使用してください。

設定例

# ログイン時に Bob が受け入れるメールドメイン
domains:
  - corp.example.com

# Bob 管理者アクセスを付与するユーザー
adminEmails:
  - alice@corp.example.com

# LDAP フェデレーションプロバイダー
ldaps:
  - name: corp-ldap

    vendor: other
    connectionUrl: ldaps://ldap.corp.example.com:636
    usersDn: ou=People,dc=corp,dc=example,dc=com
    usernameLDAPAttribute: uid
    rdnLDAPAttribute: uid
    uuidLDAPAttribute: entryUUID
    userObjectClasses: inetOrgPerson,organizationalPerson,person

    bindDn: cn=bob-svc,ou=ServiceAccounts,dc=corp,dc=example,dc=com
    bindPasswordSecret: corp-ldap-bind

    useTruststoreSpi: always
    ldapsCACertSecret: corp-ldap-ca

    userSync:
      enabled: true

    userAttributeMappings:
      - ldapAttribute: mail
        userModelAttribute: email
      - ldapAttribute: givenName
        userModelAttribute: firstName
      - ldapAttribute: sn
        userModelAttribute: lastName

    # オプション: LDAP グループを Keycloak に同期
    groupMapper:
      groupsDn: ou=Groups,dc=corp,dc=example,dc=com
      groupObjectClasses: groupOfNames
      membershipLdapAttribute: member
./bobctl configure-idp --config my-idp.yaml

適用前の IDP 設定の検証

クラスターに IDP 設定を適用する前に、--dry-run オプションを使用して設定を検証し、作成されるリソースのプレビューを表示します。ドライランを実行することで、クラスターに変更が加えられる前によくある設定の問題を特定するのに役立ちます。

./bobctl configure-idp --config my-idp.yaml --dry-run

ドライランは以下のチェックを実行します。

  • すべての必須設定パラメーターが設定ファイルに存在することを検証します。
  • 作成または更新される BobIDP カスタムリソースのプレビューを表示します。
  • クラスター内のリソースを作成、変更、または削除せずに終了します。
注意:

ドライラン操作は LDAP サーバーへのネットワーク接続を検証したり、ディレクトリに対して提供されたクレデンシャルを認証したり、クラスター内の参照された Secret の存在を確認したりしません。これらの検証は設定が適用された後にのみ実行され、LDAPReachable および LDAPAuthenticated ステータス条件に反映されます。

設定の適用

IDP 設定ファイルを作成して検証したら、configure-idp コマンドを実行してクラスターに設定を適用します。

./bobctl configure-idp --config my-idp.yaml
フラグ必須説明
--config <file>はいIDP 設定ファイルへのパスを指定します。
--dry-runいいえ設定を検証して作成または更新されるリソースのプレビューを表示します。クラスターに変更を適用しません。

コマンドが実行されると、bobctl はオペレーターが設定を調整するのを待ち、BobIDP カスタムリソースから報告されたステータス条件を確認して IDP を検証します。

チェック確認内容
Ready設定が正常に適用されました。
LDAPRegisteredLDAP プロバイダーが Keycloak に登録されました。
LDAPReachableクラスターから LDAP サーバーにアクセス可能です。
LDAPAuthenticated設定されたバインドクレデンシャルが有効です。
LDAPUserSyncSucceeded初期ユーザーインポートが正常に完了しました。この条件は userSync.enabled が true に設定されている場合にのみ評価されます。

デフォルトの検証タイムアウトは 600 秒 (10 分) です。大規模なディレクトリを持つ環境では、初期ユーザー同期の完了に数分かかる場合があります。タイムアウトを延長するには、BOB_IDP_WAIT_TIMEOUT 環境変数を設定します。

BOB_IDP_WAIT_TIMEOUT=900 ./bobctl configure-idp --config my-idp.yaml

複数の LDAP プロバイダーの設定

複数の LDAP または Active Directory ソースからユーザーを統合するには、IDP 設定ファイルの ldaps リストに各ディレクトリを別々のエントリとして追加し、configure-idp を再実行します。

./bobctl configure-idp --config my-idp.yaml

IDP リソースステータスの確認

IDP 設定のステータスを表示するには:

oc get bobidp -n <instance-namespace>

詳細な設定とステータス情報を表示するには:

oc get bobidp bob-idp -n <instance-namespace> -o yaml

統合の確認

bobctl configure-idp が正常に完了したら、LDAP 統合が正しく機能していることを確認します。

BobIDP カスタムリソースのステータスを確認します。

oc get bobidp bob-idp -n <instance-namespace> -o yaml

以下のステータス条件が True に設定されていることを確認します。

条件目的
Ready設定が正常に適用されたことを確認します。
LDAPRegisteredLDAP プロバイダーが Keycloak に登録されたことを確認します。
LDAPReachableクラスターが LDAP サーバーと通信できることを確認します。
LDAPAuthenticated設定されたバインドクレデンシャルが有効であることを確認します。
LDAPUserSyncSucceededすべてのユーザーが正常にインポートされたことを確認します。userSync.enabled: true の場合のみ存在します。

いずれかの条件が False の場合は、対応する message フィールドで診断の詳細を確認してください。

フェデレーション LDAP ディレクトリのクレデンシャルを使用してサインインし、ユーザー認証が機能していることを確認します。

Bob URL を開きます。

https://bob.<namespace>.<ingress-domain>

サインインに成功すると、接続性、認証、ドメインルーティング、SCIM プロビジョニング、ロールマッピングが正常に機能していることが確認されます。

ユーザーが初めてサインインした後、ユーザーレコードが Bob で利用可能であることを確認します。

Bob 管理 UI を開きます。

https://bob.<namespace>.<ingress-domain>/admin

Bob 管理者としてサインインし、テストユーザーがユーザーリストに表示されることを確認します。

groupMapper が LDAP グループを Bob 管理者にマッピングするよう設定されている場合:

  1. マッピングされた管理者グループに属するユーザーアカウントでサインインします。
  2. ユーザーが Bob 管理 UI にアクセスできることを確認します。
  3. 管理者レベルの機能が利用可能であることを確認します。

userSync.enabled: true の場合、LDAP プロバイダーが登録された後にユーザーが自動的にインポートされます。テストユーザーは初回サインインなしに Bob に表示されるはずです。

数分後にユーザーが表示されない場合は、プロビジョニングエラーの bob-admin ログを確認してください。

oc logs -n <instance-namespace> -l app=bob-admin --tail=100

報告された SCIM 関連のエラーを確認し、同期プロセスを再試行する前に解決してください。

このトピックはいかがですか?