AD on Win2008R2 and Apache on Linux でKerberos
できたー。いや~Kerberosって何くらいの状態から入ったからはまったはまった。
OSはWindows Server 2008 R2 StandardとCentOS 5.7。クライアントはWindows 7 Professionalだ。
この説明で使うADのドメインはexample.com、ADサーバーのFQDNはwin2008.example.com、WebサーバーのFQDNはcentos.example.comとする。
CentOSはyumでkrb5-libsとmod_auth_kerbを入れればそれ以外の必要なものはすべて依存関係で入る。
/etc/krb5.confは記述サンプルがEXAMPLE.COMなのでKDCの場所をwin2008.example.comにするくらいで良かろう。
/etc/httpd/conf.d/auth_kerb.confも最初に用意されているコメントをそのまま使ってほとんどいじる必要はない。サービスプリンシパル名とkeytabの場所くらいか。
もちろん/etc/resolv.confではnameserverにADを設定している。
AD側ではサービスプリンシパルと結びつけるユーザーアカウントを用意し、ktpassとかsetspnとかを駆使してkeytabを作成する。多くの解説サイトではコンピューターアカウントではなくユーザーアカウントを作れと書いているが、理論上はコンピューターアカウントでもいけると思うんだがなぁ。ただ、(Windows Server2008 R2の初期設定では)パスワード1ヶ月リセットなどの話もあるし、パスワードを無期限にできるユーザーアカウントの方が何かと便利なのかな。
さて、keytabの作成までできたのだが、何度やってもIEがいきなり諦めて403になる。これはなぜなんだぜ。という事で多くの人間がハマるであろうポイントを挙げてみた。
・Apacheのデバッグログを見ると「NTLMを使われたぜチキショウ。IEの設定を確認しやがれ。」と書かれている。
これはおそらくIEの設定ではなく、ADにSPNが正しく登録されていない。Apache(Webサーバー)からKerberos認証を迫られたがADに問い合わせた結果サービスプリンシパルなるものが見つからなかったので諦めたという事だと思う。setspnを駆使して対象のユーザーアカウントのDNとSPNを結びつけよう。
死ぬほどは試していないので正確に最低限どうなっていれば良いのかはわからんが、(今回のLinux側のホスト名をcentos.example.com、バインドしたアカウントをcentosとして)
C:\Users\Administrator\Documents> setspn -l centos 次の項目に登録されている CN=centos,CN=Users,DC=example,DC=com: HTTP/centos.example.com HTTP/centos HOST/centos.example.com HOST/centos
という風になっていれば動く事は確認した。そしてkeytabを以下のように作る。そうするとドメインユーザーアカウントcentosのユーザーログオン名が「HTTP/centos.example.com」に変化する。これはこのままが良いようだ。なんじゃこりゃと思ってcentosに戻したらKerberos認証がうまくいかなくなった。下記の<Input centos’ password!>のところはユーザーアカウントcentosのパスワードを入れていただきたい。
C:\Users\Administrator\Documents> ktpass /princ HTTP/centos.example.com /ptype KRB5 NT PRINCIPAL /crypto AES256-SHA1 /mapuser centos /pass <Input centos' password!> /out centos.keytab
これで作ったkeytabをCentOS側に持っていって設定だ。