【連載 第6回】Windows統合認証 (IWA):ADドメイン参加とKerberos設定

「ログイン画面すら見せない」。それが究極のユーザー体験。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回(第5回)は、Apache上のWebアプリをSSO化し、Keycloakの画面でID/パスワードを入力してログインできるようにしました。
これだけでも十分便利ですが、現場のユーザーからはこんな声が聞こえてくるはずです。

「毎朝Windowsにログインするときにパスワード入れてるんだから、Webアプリでもう一回入れさせるなよ!」

ごもっともです。
今回は、Windowsへのサインイン情報をそのままWeb認証に利用する「Windows統合認証 (IWA: Integrated Windows Authentication)」、またの名を「デスクトップSSO」を構築します。
これが成功すれば、ユーザーはブラウザを開くだけで、ログイン画面を一度も見ることなく「ようこそ ○○さん」の画面に到達できます。

コウ君

先生、それがやりたかったんです!
でも、これってWindows Serverがないとできないんじゃ…?
僕のDocker環境(Samba AD)でもできるんですか?

リナックス先生

もちろんできるわ!
裏側で動いているのは「Kerberos(ケルベロス)」という標準的な認証プロトコルなの。
今回は「Keytab(キータブ)」という特殊な鍵ファイルを作って、Keycloakに読み込ませる作業がメインになるわ。
手順を一つでも間違えると全く動かないシビアな世界だから、気合を入れていきましょう!

本記事では、KeycloakとActive Directory (Samba) をKerberosで連携させ、完全なパスワードレス認証を実現する手順を徹底解説します。

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


1. Kerberos認証の仕組みと「Keytab」の役割

作業に入る前に、なぜパスワードなしでログインできるのか、その仕組みを簡単に理解しておきましょう。

3つの頭を持つ犬「ケルベロス」

Kerberos認証は、以下の3者がチケット(暗号化された証明書)をリレーすることで成立します。

  1. Client (PC): ユーザーがWindowsにログオンした時点で、ADから「TGT(チケット付与チケット)」をもらっています。
  2. Service (Keycloak): Webアプリへのアクセス時、PCはADから「Keycloak用の利用チケット」をもらい、それをKeycloakに提示します。
  3. KDC (AD): チケットの発行元です。

Keycloakが「提示されたチケットが本物か?」を検証するためには、ADと共通の秘密鍵を持っている必要があります。
その秘密鍵をファイルに書き出したものが「Keytab(キータブ)ファイル」です。
今回は、このKeytabファイルを作成し、Keycloakに持たせることが最大のミッションです。


2. Keycloak用サービスアカウントの作成

Kerberos認証を行うには、Keycloak自身もAD上の「いちユーザー」として振る舞う必要があります。
そのための専用アカウントを作成します。

2-1. Sambaコンテナでの作業

ADサーバー(Sambaコンテナ)に入ります。

cd ~/sso-project
sudo docker exec -it sso-ad /bin/bash

2-2. サービスアカウントの作成

keycloak-svc という名前でユーザーを作成します。
※パスワードの有効期限を無期限に設定します。

# ユーザー作成
samba-tool user create keycloak-svc Password123! \
  --description="Keycloak Service Account"

# パスワード無期限化
samba-tool user setexpiry keycloak-svc --noexpiry

これで、KeycloakがADと話すための代理人が誕生しました。


3. SPN登録とKeytabファイルの作成

次に、このアカウントに対して「SPN(サービスプリンシパル名)」を紐付け、Keytabファイルをエクスポートします。
ここが最もエラーが出やすい難所です。

3-1. SPN (Service Principal Name) の登録

HTTP/sso.linuxkoubou.local というサービスは、keycloak-svc ユーザーが担当しますよ」という宣言をADに登録します。
※注意:ホスト名(sso.linuxkoubou.local)は一文字も間違えないでください。

samba-tool spn add HTTP/sso.linuxkoubou.local keycloak-svc

3-2. Keytabファイルのエクスポート

作成したユーザーとSPN情報を、暗号化された鍵ファイル(keycloak.keytab)として出力します。

samba-tool domain exportkeytab /tmp/keycloak.keytab --principal=HTTP/sso.linuxkoubou.local

成功すると、/tmp/keycloak.keytab が作成されます。
コンテナから抜けます。

exit

3-3. Keytabファイルの取り出し

Dockerコンテナ内で作ったファイルを、ホスト側(AlmaLinux)に取り出します。

# コンテナからファイルをコピー
sudo docker cp sso-ad:/tmp/keycloak.keytab ./keycloak/data/

# 権限の修正(Keycloakコンテナが読めるように)
sudo chmod 644 ./keycloak/data/keycloak.keytab
sudo chown 1000:1000 ./keycloak/data/keycloak.keytab

これで、~/sso-project/keycloak/data/keycloak.keytab に鍵が配置されました。


4. KeycloakへのKeytab配置と設定

作成した鍵をKeycloakに読み込ませ、Kerberos認証を有効化します。

4-1. docker-compose.yml の修正

KeycloakコンテナがKeytabファイルを読めるように、ボリュームマウントを追加します。

vi docker-compose.yml

keycloak サービスの volumes: セクションに1行追加します。

    volumes:
      - ./certs/server.crt:/opt/keycloak/conf/server.crt:ro
      - ./certs/server.key:/opt/keycloak/conf/server.key:ro
      # 【追加】Keytabファイルのマウント
      - ./keycloak/data/keycloak.keytab:/opt/keycloak/conf/keycloak.keytab:ro

修正したら、コンテナを再起動して反映させます。

sudo docker compose up -d

4-2. User Federation設定の修正

  1. Keycloak管理コンソールにログインし、「DemoCorp」レルムを選択。
  2. 「User federation」「Active Directory」(第4回で作成したもの)をクリック。
  3. 「Kerberos integration」 セクションを探し、以下のように設定します。
項目 設定値 説明
Allow Kerberos authentication ON Kerberos認証を有効化
Kerberos Realm LINUXKOUBOU.LOCAL 全て大文字で入力(ADドメイン名)
Server Principal HTTP/sso.linuxkoubou.local@LINUXKOUBOU.LOCAL SPN + @ + 大文字ドメイン名
KeyTab /opt/keycloak/conf/keycloak.keytab コンテナ内のパス

入力後、画面下部の 「Save」 をクリックします。

💡 プロのノウハウ:ドメイン名は大文字?小文字?
Kerberosの設定において、レルム名(LINUXKOUBOU.LOCAL)は必ず大文字で記述するのが鉄則です。
ここを小文字にすると、原因不明の認証エラー(Checksum failed)に悩まされることになります。


5. クライアントPC(ブラウザ)の設定

サーバー側の準備は完了しましたが、これだけでは動きません。
ブラウザはセキュリティのため、デフォルトでは「認証チケット」を外部サーバーに送信しません。
「このサーバーは社内の信頼できるサーバーだ」と教えてあげる必要があります。

5-1. Windows (Chrome / Edge) の設定

これらはWindowsの「インターネットオプション」の設定に従います。

  1. コントロールパネル → 「インターネットオプション」 を開く。
  2. 「セキュリティ」 タブ → 「ローカル イントラネット」 を選択 → 「サイト」 ボタンをクリック。
  3. 「詳細設定」をクリック。
  4. 「このWebサイトをゾーンに追加する」に、KeycloakのURLを入力して追加します。
    https://sso.linuxkoubou.local
  5. すべて「閉じる」または「OK」で設定を完了します。

5-2. Firefoxの設定

Firefoxは独自の設定を持っています。

  1. アドレスバーに about:config と入力してEnter。
  2. 検索バーに network.negotiate-auth.trusted-uris と入力。
  3. 値として sso.linuxkoubou.local を入力して保存。

6. 動作確認と【プロの】トラブルシューティング

さあ、感動の瞬間です。
一度ブラウザをすべて閉じ、再度開いてください。

6-1. パスワードレスログインの確認

  1. WebアプリのURL https://app.linuxkoubou.local/ にアクセスします。
  2. 通常ならKeycloakのログイン画面が表示されるはずですが…。
  3. 一瞬で「認証成功!」の画面が表示されましたか?

もしログイン画面が表示されず、そのままアプリに入れたなら、Windows統合認証は大成功です!
ユーザーはIDもパスワードも入力していませんが、裏側で厳重なKerberos認証が行われています。

6-2. 動かない時のチェックリスト

「ログイン画面が出てしまう」「エラーになる」場合の確認ポイントです。

  • 時刻ズレ (Clock Skew):
    Kerberosは時刻に非常に厳密です。ADサーバーとKeycloakサーバー(AlmaLinux)の時刻が5分以上ズレていると認証に失敗します。
    chrony などでNTP同期を確認してください。
  • SPNの重複:
    過去に別のユーザーで同じSPNを登録していませんか?
    samba-tool spn list keycloak-svc で確認できます。
  • ブラウザのキャッシュ:
    設定変更後は、一度ブラウザを完全に終了させるか、PCを再起動しないと設定が反映されないことがあります。

まとめ:認証の壁は消え去った

お疲れ様でした!
これで、あなたの構築したSSO環境は、ユーザーに「認証の存在」すら意識させない最高レベルの利便性を手に入れました。

今回の達成項目:

  • Samba ADでサービスアカウントとSPNを作成した。
  • Keytabファイルをエクスポートし、Keycloakに配置した。
  • KeycloakでKerberos連携を有効化した。
  • ブラウザのイントラネット設定を行い、パスワードレス認証に成功した。
コウ君

先生、すごすぎます!
画面が開いた瞬間、もうログインしてるなんて魔法みたいです。
これで社内からのクレームも激減しそうです!

機能としてはこれで完成ですが、本番環境で運用するには「セキュリティ」と「可用性」が足りません。
次回、【第7回】セキュリティと冗長化では、データベースのパスワード保護や、コンテナのヘルスチェックなど、実運用に耐えるための堅牢化設定を行います。
エンジニアとしての最後の仕上げです。お楽しみに!

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

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

VPSランキングを見る

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

転職エージェントを見る

コメント