読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

LinuxでActive Directory認証 (Apache httpd)

linux active directory apache

Active Directory認証を使うと、IDやパスワードを入力せずにWebアプリにログインできるようになります。すなわち、自動的Active Directoryのユーザとしてログインした状態になります。シングルサインオンにより、利用者の負担を軽減できる、不正利用を抑止できるといった効果があります。

本稿は、Linux上のApache httpdActive 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 に書いてあります。上記の例では、ネゴシエート認証のみ有効にして、パスワード認証は無効にしています。動作確認時はネゴシエート認証のみ有効にしておくと分かりやすいです。運用時はパスワード認証も有効にしておくとよいでしょう。

クライアントの設定

インターネットオプションで以下を設定します。

  • (詳細設定タブ)統合Windows認証を有効にする。デフォルトは有効。
  • (セキュリティタブ)ローカルイントラネットのサイトに *.example.local を追加する。

グループポリシーで適用する方法は レジストリによるローカルイントラネットゾーンの追加 - 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コマンドで全削除してから確認してみましょう。

という感じです。