KeycloakとActive Directoryを連携させてみた

# お品書き
1\. やること
2\. 検証構成
3\. Active Directory(LDAP)側の設定
4\. Keycloak側の設定
5\. 動作確認
6\. まとめ

# 1.やること
アドベントカレンダー11日目はKeycloakの機能として提供されている「ユーザーフェデレーション機能」を利用した、Active Directory(以下、AD)でのLDAP認証および情報の連携を試してみようと思います。
認証だけでなく、ADに登録されているユーザー情報をKeycloakへ一括登録したり、逆にKeycloakからADにユーザー情報を登録したりといったこともついでに試してみました。


# 2.検証構成
|役割|OS|アプリケーション|プライベートIPアドレス|
|:-:|:-:|:-:|:-:|
| SSOサーバ | Ubutu 22.04.3 LTS | Keycloak ver.22.0.2   | 172.26.22.26 |
| ADサーバ | Windows Server 2022 | Active Directory | 172.26.22.94 |

※AWS上のEC2で構築し、サイズはt2.microで統一

# 3.Active Directory(LDAP)側の設定
1\. ADのインストール(省略)
下記のサイトを参考にインストールしました。

https://dev.classmethod.jp/articles/ec2-windows2019server-active-directory/

2\. ドメインの作成
今回は「example.com」で作成しました。
3\. ログインテスト用ユーザの作成(ldap-user,ldap-user2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/75197422-bc56-747b-269a-31131c85f360.png)




※バインド用のユーザは新規に作成してもいいが、今回はAdministratorを使用しました。
※ADは特に設定不要でLDAPが利用可能です。

# 4.Keycloak側の設定
今回使用するレルムはldapレルムとします。

1\. Keycloakの管理コンソールにログイン
   localhost以外でアクセスする場合は、初期設定で「https required」になっている場合があり
   keycloakを起動しているサーバのターミナルで下記のコマンドでhttpsの強制を解除してください。
 ```
./kcadm.sh config credentials --server http://localhost:8080/ --realm master --user admin
./kcadm.sh update realms/master -s sslRequired=NONE
```
※今回はテスト環境なのでHTTPで検証しております。本番環境においては基本HTTPSが必須となりますのでご注意ください。

2\. 左メニューバーから、demoレルムを選択
3\. 左メニューバーで「User federation」をクリック
4\. プロバイダーを追加...からLDAPを選択
5\. 以下のように設定値を入力して、保存をクリック
        UI display name：任意
        Vendor：ActiveDirectory
        Connection URL：ldap://サーバのIP
        Bind DN：cn=バインドユーザ名,cn=Users,dc=ドメイン名,dc=ドメイン名
        Bind credentials：バインドユーザのパスワード
        Edit mode：WRITABLE
        Users DN：cn=Users,dc=ドメイン名,dc=ドメイン名
        Username LDAP attribute&RDN LDAP attribute：cn
        UUID LDAP attribute：objectGUID
        User object classes：top, person, organizationalPerson, user
        Import users：ON
        Sync Registrations：ON
        上記以外はデフォルトのままでいきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/add6b085-dedd-7009-6cbc-1dc56bfad962.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/cc691575-3bb7-8a72-9ca3-262ab35d62fa.png)


# 5.動作確認
## ログインテスト
1. SSOサーバにアクセス出来る端末でhttp://172.26.22.26:8080/realms/ldap/account/ にアクセス
2. 右上の「Sign in」をクリック
3. ユーザ名(cn)とパスワードを入力してログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/a42090e6-891c-f080-f2fb-4c138d0b1e37.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/7908327c-8381-9dd8-e058-ae0f5bbc1930.png)

AD側のログインに関するlogも確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/955ef93d-7228-cd62-c347-aeb2a9e2d7f4.png)


## Keycloakからのパスワード変更
なぜかうまくいかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/aa031a43-e638-7ea4-6bdc-3f5011ddc09b.png)

AD側のlogに何か出ている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/467f4274-7cca-2adb-8654-39e8f64b2a5d.png)
Microsoftの公式ドキュメントを調査すると、下記のような記載があり
LDAPSでないとパスワード変更が不可な仕様となっています。
```
この属性を変更するには、クライアントがサーバーへの 128 ビット トランスポート層
セキュリティ (TLS)/Secure Socket Layer (SSL) 接続を持っている必要があります。
```
https://learn.microsoft.com/ja-JP/troubleshoot/windows-server/identity/change-windows-active-directory-user-password

## ユーザ同期(AD→Keycloak)
1. Keycloakの管理コンソールにログイン
2. 左メニューバーから、ldapレルムを選択
3. 左メニューバーでUser federationをクリック
4. ldapをクリック
5. 右上のプルダウンより「Sync all users」を選択
7. 緑枠のポップアップに同期結果が表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/6081b4ec-0858-74a3-4d2a-d22f25a73a3b.png)

同期後のユーザ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/205d9184-6efc-2111-001e-f877de009639.png)

※krbtgtユーザはADに作られるサービスアカウント

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/manage/understand-default-user-accounts

## ユーザ同期(Keycloak→AD)
[前回の記事](URL:https://qiita.com/izey0306/items/13075668536c62879f4e)でobjectClassの必須項目をマッパー設定に入れる必要があると記載があり、今回のADユーザのobjectClassは下記の通りです。

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user

とりあえず、デフォルト設定のマッパーで動作確認をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/615c492e-22f1-c1ce-7aeb-01346b73fdf3.png)

1. 左メニューバーでUsersを選択後にAdd userをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/5b4cc232-36b5-801d-db1b-f14021cea2f2.png)


2. ldap-user3ユーザに関する必要情報を入力してCreateをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/78c8e1c9-ee08-d6bb-444f-273cd330846f.png)

3. ユーザの作成を確認

keycloakのユーザー一覧画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/c747652e-6881-6ba3-ce91-9f01b1131beb.png)


ADのユーザ一覧画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630716/8ddda2b6-4ff8-f0af-469a-d71c323d736e.png)


パスワードは設定されてないので、AD側でパスワードを新規に設定する必要があります。
※ADをご利用の環境ではADからのユーザ同期が基本となりますので、このユースケースはあまりないと思います。

# まとめ
[前回の記事](https://qiita.com/izey0306/items/13075668536c62879f4e)からKeycloakのバージョンがかなり変わってしまったので、今回はアップデート記事として執筆しました！
軽微な設定内容の変更はあったものの、基本的な概念は変更がなかった印象です。
GUI操作による構築が可能なため、Keycloak初学者でもある程度感覚的に進めすことが出来ました。
KeycloakとADの連携によるSSOをご検討の方は一読していただけますと幸いです。