【連載 第4回】KeycloakとActive Directoryを連携せよ。ユーザー情報統合とLDAP同期の極意

社員1000人の登録作業が、たった1つのボタンで終わる快感。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回(第3回)は、Keycloakを構築し、日本語化するところまで進めました。
しかし、今のKeycloakは「空っぽ」の状態です。ユーザーが一人も登録されていません。

企業でSSOを導入する場合、既存の社員情報(ID/パスワード)は、多くの場合「Active Directory (AD)」で管理されています。
ここにある情報をKeycloakに手入力でコピーしますか? ……絶対に嫌ですよね。
今回は、KeycloakとADをパイプで繋ぎ、ユーザー情報を一瞬で同期させる「ユーザーフェデレーション(User Federation)」の設定を行います。

コウ君

先生、AD連携やりたいです!
でも…僕の家にはWindows Serverがないんです。
検証のために数十万円のサーバーソフトを買うわけにもいかないし、どうすればいいですか?

リナックス先生

大丈夫よ、コウ君。
Linuxには「Samba(サンバ)」という、WindowsのADと互換性のある素晴らしいOSSがあるわ。
今回はDockerを使って、擬似的なADサーバーも一緒に立ててしまいましょう。
本物のADがある現場でも使える知識だから、しっかり覚えてね!

本記事では、検証用ADサーバーの構築から、KeycloakでのLDAP連携設定、そしてプロが使う属性マッピングのテクニックまでを徹底解説します。

🚀 本連載のカリキュラム(全8回)


1. 検証用ADサーバー(Samba)の構築

まずは、Keycloakが参照するための「名簿(AD)」を用意します。
既存の docker-compose.yml にSambaコンテナを追加して構築します。

1-1. docker-compose.yml の追記

作業ディレクトリに移動し、ファイルを編集します。

cd ~/sso-project
vi docker-compose.yml

services: セクションの末尾(keycloak の下)に、以下の内容を追記してください。

  # --- 擬似Active Directory (Samba 4) ---
  samba-ad:
    image: nowsci/samba-domain
    container_name: sso-ad
    environment:
      DOMAIN: "linuxkoubou.local"
      DOMAINPASS: "Password123!"
      DNSFORWARDER: "8.8.8.8"
      NOCOMPLEXITY: "true" # パスワード複雑性要件を無効化(検証用)
    ports:
      - "389:389"   # LDAP
      - "636:636"   # LDAPS
      - "53:53"     # DNS
      - "53:53/udp" # DNS
      - "88:88"     # Kerberos
      - "88:88/udp" # Kerberos
    privileged: true
    restart: always
    networks:
      - sso-net

DOMAINPASS はADの管理者(Administrator)パスワードになります。忘れないようにしてください。

1-2. コンテナの再起動

設定を反映させるために、Docker Composeを再起動します。

# 設定変更を反映してコンテナを起動
sudo docker compose up -d

起動後、ログを確認してADが正常に立ち上がっているか確認します。

sudo docker compose logs -f samba-ad

ログが落ち着いたら準備完了です。


2. ADへのテストユーザー登録

ADサーバーは立ち上がりましたが、中身は空っぽです。
Keycloakで同期するためのテストユーザーを作成しましょう。
今回はWindowsの管理ツールを使わず、Sambaコンテナ内のコマンドで直接ユーザーを作ります。

2-1. コンテナ内に入る

sudo docker exec -it sso-ad /bin/bash

2-2. ユーザー作成コマンドの実行

以下のコマンドを実行して、sso.user01 というユーザーを作成します。

# ユーザー作成 (samba-tool)
samba-tool user create sso.user01 Password123! \
  --surname="Test" \
  --given-name="User01" \
  --mail-address="user01@linuxkoubou.local"

# 念のためもう一人作成
samba-tool user create sso.user02 Password123! \
  --surname="Test" \
  --given-name="User02" \
  --mail-address="user02@linuxkoubou.local"

「User ‘sso.user01’ created successfully」と表示されればOKです。
exit でコンテナから抜けます。


3. Keycloakでの「ユーザーフェデレーション」設定

いよいよ本題です。Keycloak管理コンソールからADへの接続設定を行います。

3-1. プロバイダーの追加

  1. Keycloak管理コンソール(https://sso.linuxkoubou.local/)に管理者でログインします。
  2. 左上のレルム選択で、前回作成した「DemoCorp」を選択します(Masterではないことを確認!)。
  3. 左メニューの「User federation」をクリックします。
  4. 「Add new provider」 から 「ldap」 を選択します。

3-2. 接続設定 (Connection settings)

以下の通りに入力してください。
(※Sambaコンテナのサービス名 samba-ad をホスト名として使います)

項目 設定値 説明
Console display name Active Directory 管理画面での表示名
Vendor Active Directory AD固有の設定を自動適用します
Connection URL ldap://samba-ad:389 Docker内部ネットワークで接続
Users DN CN=Users,DC=linuxkoubou,DC=local ユーザーが格納されている場所
Bind DN CN=Administrator,CN=Users,DC=linuxkoubou,DC=local KeycloakがADに接続するための管理者ID
Bind Credential Password123! AD管理者のパスワード

入力後、「Test connection」ボタンを押し、「Successfully connected to LDAP」と表示されることを確認します。
次に「Test authentication」ボタンを押し、「Successfully verified LDAP Bind credential」と表示されれば、認証情報のテストも成功です。

3-3. LDAP検索設定 (LDAP searching and updating)

どの項目をユーザーIDとして使うかなどを定義します。
ADの場合、デフォルトで概ねOKですが、確認しましょう。

項目 設定値 説明
Username LDAP attribute sAMAccountName WindowsのログオンIDを使います
RDN LDAP attribute cn 識別名の属性
UUID LDAP attribute objectGUID ユーザーを一意に識別するID
User Object Classes person, organizationalPerson, user 検索対象のクラス

3-4. 同期設定 (Synchronization settings)

運用を楽にするための設定です。

  • Import users: ON (KeycloakDBにコピーを持つ)
  • Sync Registrations: OFF (Keycloakで作ったユーザーをADに書き込まない。通常はADがマスタなのでOFF推奨)
  • Periodic full sync: ON (定期的な全同期。例: 86400秒 = 1日)
  • Periodic changed users sync: ON (変更分のみ同期。例: 300秒 = 5分)

最後に最下部の「Save」をクリックして保存します。


4. 属性マッパーの設定(姓・名・メール)

保存後、画面上部のタブに「Mappers」が表示されます。
ここでは「ADのどの項目を、Keycloakのどの項目に入れるか」を定義します。
デフォルトで主要なものは設定されていますが、確認しておきましょう。

  1. Mappers タブをクリックします。
  2. 以下のマッピングが存在することを確認します(なければ作成)。
Name Mapper Type LDAP Attribute User Model Attribute
first name user-attribute-ldap-mapper givenName firstName
last name user-attribute-ldap-mapper sn lastName
email user-attribute-ldap-mapper mail email

💡 プロのノウハウ:部署名や役職も同期したい?
ADにある「部署名(department)」や「役職(title)」もKeycloakに取り込みたい場合は、ここで「Create」ボタンから新しいマッパーを追加します。
LDAP Attribute: departmentUser Model Attribute: department のように設定すれば、OIDCのトークンに部署情報を含めることができ、アプリ側で「人事部の人だけに見せる画面」といった制御が可能になります。


5. 同期実行とログイン確認

設定は完了しました。実際にユーザーを引っ張ってきましょう。

5-1. 手動同期の実行

  1. Settings タブに戻ります。
  2. 画面下部の 「Action」 メニューから 「Sync all users」 をクリックします。
  3. 画面上部に「Success! Sync of users finished.」と表示されれば成功です。

5-2. ユーザー一覧の確認

左メニューの「Users」をクリックしてください。
リストに sso.user01sso.user02 が表示されていれば、AD連携は大成功です!

5-3. アカウントコンソールへのログイン

実際にADのパスワードでログインできるか試してみます。

  1. ブラウザの別タブ(またはシークレットウィンドウ)を開きます。
  2. ユーザー用のアカウント管理画面にアクセスします。
    https://sso.linuxkoubou.local/realms/DemoCorp/account/
  3. ログイン画面が出るので、以下を入力します。
    • Username: sso.user01
    • Password: Password123!

ログインに成功し、ユーザー情報画面(氏名やメアド)が表示されれば完了です。
これで、KeycloakはADの「代理人」として認証を行えるようになりました。


6. 【プロの技】LDAPフィルタによる同期対象の絞り込み

実運用では、AD上の全ユーザー(数千人)を同期するとライセンスや負荷の問題が発生することがあります。
「特定のグループに所属するユーザーだけ同期したい」というケースがほとんどです。

LDAPフィルタの設定

User federationの設定画面にある 「Custom User LDAP Filter」 を使います。
例えば、「SSO_Users」というグループに入っている人だけを対象にする場合、以下のように記述します。

(&(objectClass=person)(memberOf=CN=SSO_Users,CN=Users,DC=linuxkoubou,DC=local))

このように設定することで、退職者をADのグループから外すだけでKeycloakからもログインできなくなり、セキュリティ運用が非常に楽になります。


まとめ:ID管理の一元化完了

お疲れ様でした!
今回は、Sambaを使って擬似ADを構築し、Keycloakと連携させるという、SSO構築のハイライトとも言える工程をクリアしました。

今回の達成項目:

  • DockerでSamba ADサーバーを構築した。
  • KeycloakのUser FederationでADと接続した。
  • 属性マッパーを設定し、氏名やメールアドレスも同期させた。
  • ADのユーザーでKeycloakにログインできることを確認した。
コウ君

感動です! ADで作ったユーザーが勝手にKeycloakに出てくるなんて!
これで「パスワード変更はAD側でやってください」って言えば済むんですね。
でも先生、まだログインできる「アプリ」がひとつもないですよね…?

その通りです。今は「入館証(ID)」が発行できるようになっただけで、「アトラクション(アプリ)」がありません。
次回、【第5回】WebアプリのSSO化では、Apacheを使ったWebサーバーを構築し、実際にSSOでログインできるように設定します。
いよいよ「シングルサインオン」の便利さを体感できる瞬間がやってきます。お楽しみに!

▼ 自宅ラボ環境を作ろう ▼

DockerやADも快適に動く
「おすすめVPS」

VPSランキングを見る

認証基盤エンジニアへ
「ITエンジニア転職」

転職エージェントを見る

コメント