Active Directory認証を使うと、IDやパスワードを入力せずにWebアプリにログインできるようになります。すなわち、自動的にActive Directoryのユーザとしてログインした状態になります。シングルサインオンにより、利用者の負担を軽減できる、不正利用を抑止できるといった効果があります。
本稿は、Linux上のApache httpdでActive Directory認証を使う方法のメモです。
- Webサーバ
- Active Directoryサーバ
- クライアント
- Windows 7 32bit
- Internet Explorer 10
- Active Directoryドメインに参加していること。
mod_auth_kerbはEPELにあります。
Active Directoryサーバの設定
Active Directoryサーバでkeytabを生成します。
ktpass -princ HTTP/web.example.local@EXAMPLE.LOCAL -mapuser apache@EXAMPLE.LOCAL -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out krb5.keytab.http +rndPass
SPNを確認します。
setspn -Q HTTP/*
もし間違えて作成した場合は削除します。
setspn -D HTTP/mistakes.example.local apache
生成されたkeytabをWebサーバにコピーします。ここでは /etc/krb5.keytab.http とします。
Webサーバの設定
keytabはapacheユーザのみが読めるようにします。
sudo chmod 400 /etc/krb5.keytab.http sudo chown apache:apache /etc/krb5.keytab.http
/etc/krb5.confは最低限の設定でOKです。
[libdefaults] default_realm = EXAMPLE.LOCAL
keytabでTGTを取得できることを確認します。
sudo -u apache klist -ke /etc/krb5.keytab.http sudo -u apache kinit -k -t /etc/krb5.keytab.http HTTP/web.example.local@EXAMPLE.LOCAL sudo -u apache klist -e
httpd.confを設定します。
# /etc/httpd/conf.d/auth_kerb.conf LoadModule auth_kerb_module modules/mod_auth_kerb.so # per virtual host <VirtualHost *:80> ServerName web.example.local DocumentRoot /var/www/html <Location /> AuthType Kerberos KrbAuthRealms EXAMPLE.LOCAL Krb5Keytab /etc/krb5.keytab.http KrbMethodNegotiate on KrbMethodK5Passwd off require valid-user </Location> </VirtualHost>
mod_auth_kerbのディレクティブは Kerberos Module for Apache に書いてあります。上記の例では、ネゴシエート認証のみ有効にして、パスワード認証は無効にしています。動作確認時はネゴシエート認証のみ有効にしておくと分かりやすいです。運用時はパスワード認証も有効にしておくとよいでしょう。
クライアントの設定
インターネットオプションで以下を設定します。
グループポリシーで適用する方法は レジストリによるローカルイントラネットゾーンの追加 - GeekFactory を参照してください。
設定が完了したら、Internet ExplorerでWebサーバにアクセスします。認証画面が表示されなければ成功です。問題が解決したらChromeでも確認してみましょう。
トラブルシューティング
まず、Webブラウザがネゴシエート認証のヘッダを出力しているか確認します。下記のヘッダが含まれていればOKです。ない場合はインターネットオプションの設定を確認しましょう。
Authorization: Negotiate BASE64STRINGS
次に、Webサーバのエラーログを確認します。私は下記のエラーに悩まされました。
gss_acquire_cred() failed: Unspecified GSS failure. Minor code may provide more information (, ) gss_accept_sec_context() failed: No credentials were supplied, or the credentials were unavailable or inaccessible (, Unknown error) gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, )
確認のポイントは、
- ktpassコマンドでkeytabを生成する時、プリンシパル名で指定するFQDNがWebサーバのFQDNと合致するようにします。
- バーチャルホストが複数ある場合は、バーチャルホストの数だけktpassコマンドを実行してSPNを登録する必要があります。ただし、Webサーバに渡すkeytabはActive DirectoryサーバのFQDNだけでいいようです。
- apacheユーザでkinitが成功するか確認します。
- 設定ファイルのレルムが大文字か確認します。
- クライアントに古いチケットが残っている場合があります。klist purgeコマンドで全削除してから確認してみましょう。
という感じです。
![【改訂新版】サーバ構築の実例がわかるSamba[実践]入門 (Software Design plus) 【改訂新版】サーバ構築の実例がわかるSamba[実践]入門 (Software Design plus)](https://images-fe.ssl-images-amazon.com/images/I/51pL0I%2B7qnL._SL160_.jpg)
【改訂新版】サーバ構築の実例がわかるSamba[実践]入門 (Software Design plus)
- 作者: 高橋基信
- 出版社/メーカー: 技術評論社
- 発売日: 2016/03/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る

ひと目でわかるActive Directory Windows Server 2012 R2版
- 作者: Inc. Yokota Lab
- 出版社/メーカー: 日経BP社
- 発売日: 2014/03/26
- メディア: Kindle版
- この商品を含むブログを見る