1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KeyCloak と LDAPを統合する自動化の備忘録

Last updated at Posted at 2024-10-30

はじめに

KeyCloakのユーザーレポジトリとしてLDAPを構成するスクリプトを作成するのに苦労したことを備忘録として残します。

以下のページの構成を拡張するような内容となります。

KeyCloakの管理コンソールからLDAPを構成

http://localhost:8080/admin にログインして pdprof の Realm(左上)を選択し、User federation (左下) をクリック、ここで Add Ldap providers をクリックしてLDAPを構成します。

image.png

詳細名指定は自動化のスクリプト作成時にCLIの出力を取得するのでそちらを見てください。

LDAP上のユーザーでのログインテスト

接続テストなどは動作してログインをためすが、403のエラーになる。

image.png

401のエラーではないので、ユーザーの認証(ユーザー名、パスワード)は問題なく、認可(権限がたりない)のエラー、ただAllAutheticated(認証が済んでいれば認可もできる)にしているので理由がよくわからない。

本番LDAPだとうまく動作してくれたので、LDAPのユーザー情報が不足してるのではないかと予想してattributeを追加(mail address)してみる。

同じuidを使用しているため、競合しないようにuidも変更していた。結果 mail の追加で認証ができるようになった。エラーメッセージをみてもわからなかったので、うまく動作するLDAPとの比較ができたのがLDAPの情報を疑えたのでよかった。

LDAP構成の自動化

GUIで構成した内容をCLIで取得して、それと同じような構成をするように試みる。まずは構成を取得する。

alias kcadm=/opt/keycloak/bin/kcadm.sh  
KEYCLOAK_USER=admin
KEYCLOAK_PASSWORD=password

実行コマンド

kcadm get components -r pdprof --server http://localhost:8080/ --realm master --user $KEYCLOAK_USER --password $KEYCLOAK_PASSWORD

結果(抜粋)

{
  "id" : "91f1f8bc-e730-4965-9589-5066e87dc60c",
  "name" : "ldap",
  "providerId" : "ldap",
  "providerType" : "org.keycloak.storage.UserStorageProvider",
  "parentId" : "f1e884dc-622a-43d5-a424-405701e2a912",
  "config" : {
    "fullSyncPeriod" : [ "-1" ],
    "pagination" : [ "false" ],
    "startTls" : [ "false" ],
    "connectionPooling" : [ "false" ],
    "usersDn" : [ "dc=pdprof,dc=mustgather" ],
    "cachePolicy" : [ "DEFAULT" ],
    "useKerberosForPasswordAuthentication" : [ "false" ],
    "importEnabled" : [ "false" ],
    "enabled" : [ "true" ],
    "bindDn" : [ "cn=admin,dc=pdprof,dc=mustgather" ],
    "usernameLDAPAttribute" : [ "uid" ],
    "changedSyncPeriod" : [ "-1" ],
    "bindCredential" : [ "**********" ],
    "vendor" : [ "other" ],
    "uuidLDAPAttribute" : [ "uid" ],
    "allowKerberosAuthentication" : [ "false" ],
    "connectionUrl" : [ "ldap://centos:1389" ],
    "syncRegistrations" : [ "false" ],
    "authType" : [ "simple" ],
    "krbPrincipalAttribute" : [ "krb5PrincipalName" ],
    "searchScope" : [ "2" ],
    "useTruststoreSpi" : [ "always" ],
    "usePasswordModifyExtendedOp" : [ "false" ],
    "trustEmail" : [ "false" ],
    "userObjectClasses" : [ "inetOrgPerson, organizationalPerson" ],
    "rdnLDAPAttribute" : [ "uid" ],
    "editMode" : [ "READ_ONLY" ],
    "validatePasswordPolicy" : [ "false" ]
  }
}

これと

を真似て

kcadm create components -r pdprof \
    -s name="openldap" \
    -s providerId=ldap \
    -s providerType=org.keycloak.storage.UserStorageProvider \
    -s 'config.fullSyncPeriod=["-1"]' \
    -s 'config.changedSyncPeriod=["-1"]' \
    -s 'config.cachePolicy=["DEFAULT"]' \
    -s 'config.editMode=["READ_ONLY"]' \
    -s 'config.syncRegistrations=["false"]' \
    -s 'config.importEnabled=["false"]' \
    -s 'config.vendor=["other"]' \
    -s 'config.usernameLDAPAttribute=["uid"]' \
    -s 'config.rdnLDAPAttribute=["uid"]' \
    -s 'config.uuidLDAPAttribute=["uid"]' \
    -s 'config.userObjectClasses=["inetOrgPerson, organizationalPerson"]' \
    -s 'config.connectionUrl=["ldap://centos:1389"]' \
    -s 'config.usersDn=["dc=pdprof,dc=mustgather"]' \
    -s 'config.authType=["simple"]' \
    -s 'config.bindDn=["cn=admin,dc=pdprof,dc=mustgather"]' \
    -s 'config.bindCredential=["passw0rd"]' \
    -s 'config.searchScope=["2"]' \
    -s 'config.useTruststoreSpi=["always"]' \
    -s 'config.connectionPooling=["false"]' \
    -s 'config.pagination=["false"]' \
    -s 'config.useKerberosForPasswordAuthentication=["false"]' \
    --server http://localhost:8080/ --realm master \
    --user $KEYCLOAK_USER --password $KEYCLOAK_PASSWORD

のようにします。元記事には parentIdの指定がありましたが、指定がなければ自動で入りました。nameの指定を変えつつ作成を試すことができます。テストで作ったものは管理コンソールで消してしまいます。

同じユーザーIDを使用しているせいか登録を繰り替えしているとユーザー検索で探すとエラーになってしまうので、LDAPの構成をGUIから編集して保管すると回避できました。

構成の自動化

自動化の開始時の構成をどこにするかは悩むところですが、setup-docker.shを実行した後ということで始めます。構成ができている前提で実行するスクリプトを作成しました。

KeyCloakのイメージ作成時にスクリプトをコピーして、起動後のContainerで実行するようにしてあります。

変更内容は以下

LDAPのイメージとコンテナーが別スクリプトになっているので、構成できていない場合には構成するように条件をつけてあります

setup-ldap.sh
#!/bin/bash
if [ ! "$(docker image list -q ldap)" ]; then
	docker build -t ldap -f ../ldap-docker/Dockerfile.openldap ../ldap-docker/
fi

if [ ! "$(docker ps -a | grep ldap)" ]; then
	docker run -d -p 1389:389 --name ldap ldap --loglevel debug
fi

docker exec kc /tmp/setup-kc-ldap.sh

構成ステップリスト

レポジトリコピー

git clone https://github.com/pdprof/security-auth.git
cd security-auth/saml-docker

LibertyとKeyCloakの構成

export ACCESS_HOST=`hostname`
./setup-docker.sh

注:ACCESS_HOSTはブラウザからのアクセスに使うホスト名とkcのcontainerからldapに接続するホスト名に使います。Containerのkcでもつかうのでlocalhostでは動作しません。使う場合はあとでldap接続先を管理コンソールで変更します。

LDAP構成の追加

./setup-ldap.sh

上のコマンドをコピーして実行するだけで構成できます。構成がおわったら

のようにアクセスしてログインをためしてみます。

でLDAPに登録してあるユーザー (2024/10/30 転記)

User Password
wasadmin passw0rd
pdadmin passw0rd
myuser passw0rd

でログインできるかためしてみましょう。

まとめ

LibertyでSAMLの構成でLDAPも統合できることを確認しました。作成された libertyの server.xml や KeyCloakの構成(User federation)を変更するなどして環境にあわせて調整します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?