「ログイン画面すら見せない」。それが究極のユーザー体験。
こんにちは!「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回】SSOの基礎知識と設計:AD連携を含めた全体像
- 【第2回】サーバー構築の準備:AlmaLinux 9とDocker、SSL証明書
- 【第3回】認証基盤 Keycloakの導入:コンテナ起動と日本語化
- 【第4回】ユーザー情報の統合:Active Directory (AD) とのFederation設定
- 【第5回】WebアプリのSSO化:OIDCによる認証連携
- 【第6回】Windows統合認証 (IWA)(今回):ADドメイン参加とKerberos設定
- 【第7回】セキュリティと冗長化:本番運用に向けた堅牢化
- 【第8回】運用とトラブルシューティング:ログ解析と緊急対応
目次
1. Kerberos認証の仕組みと「Keytab」の役割
作業に入る前に、なぜパスワードなしでログインできるのか、その仕組みを簡単に理解しておきましょう。
3つの頭を持つ犬「ケルベロス」
Kerberos認証は、以下の3者がチケット(暗号化された証明書)をリレーすることで成立します。
- Client (PC): ユーザーがWindowsにログオンした時点で、ADから「TGT(チケット付与チケット)」をもらっています。
- Service (Keycloak): Webアプリへのアクセス時、PCはADから「Keycloak用の利用チケット」をもらい、それをKeycloakに提示します。
- 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 に鍵が配置されました。
![]() |
入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス 1989) 新品価格 |
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設定の修正
- Keycloak管理コンソールにログインし、「DemoCorp」レルムを選択。
- 「User federation」 → 「Active Directory」(第4回で作成したもの)をクリック。
- 「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の「インターネットオプション」の設定に従います。
- コントロールパネル → 「インターネットオプション」 を開く。
- 「セキュリティ」 タブ → 「ローカル イントラネット」 を選択 → 「サイト」 ボタンをクリック。
- 「詳細設定」をクリック。
- 「このWebサイトをゾーンに追加する」に、KeycloakのURLを入力して追加します。
https://sso.linuxkoubou.local - すべて「閉じる」または「OK」で設定を完了します。
5-2. Firefoxの設定
Firefoxは独自の設定を持っています。
- アドレスバーに
about:configと入力してEnter。 - 検索バーに
network.negotiate-auth.trusted-urisと入力。 - 値として
sso.linuxkoubou.localを入力して保存。
6. 動作確認と【プロの】トラブルシューティング
さあ、感動の瞬間です。
一度ブラウザをすべて閉じ、再度開いてください。
6-1. パスワードレスログインの確認
- WebアプリのURL
https://app.linuxkoubou.local/にアクセスします。 - 通常ならKeycloakのログイン画面が表示されるはずですが…。
- 一瞬で「認証成功!」の画面が表示されましたか?
もしログイン画面が表示されず、そのままアプリに入れたなら、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」
認証基盤エンジニアへ
「ITエンジニア転職」


コメント