IIS で Kerberos を利用する方法
IIS5 で Kerberos を使用する方法
ドメインコントローラのマシン名: keisukeo-nn
ドメイン名: mydomain.com
IIS マシン名: iis1
Web サーバのエイリアスとして、www を DNS に登録。これによって、クライアント (ブラウザ) から
http://www.mydomain.com/
形式でアクセスさせる。
予想としては、マシン名 (NetBIOS名) は iis1 のマシンに対して
http://www.mydomain.com/
でアクセスするから、SPN が確認できないため、Kerberos 認証はできない。したがって、NtlmSsp
が使用されるはず。そこで、www.mydomain.com へのアクセスは SetSPN を実施しない限り NtlmSsp が
利用され、SetSPN を実行してから Kerberos が利用可能になる。
ではさっそく実験。
www は最後に使いたいので、DNS に www1 を登録。Windows 統合認証で IIS マシン (iis1) にアクセスすると、確かに NTLM が使用された。
この Authentication Package を Kerberos にすることを考える。
そこで、DC 上で次のコマンドを実行。
> SetSPN -A HTTP/www1.mydomain.com iis1
が、このコマンドは意図したものと違う。これは、iis1 上にこの SPN を登録する、というもの。せっかくなので、この状態でテストを行う。
この時点での SPN の登録状況は
G:\Reskit>setspn -L iis1
Registered ServicePrincipalNames for CN=IIS1,CN=Computers,DC=mydomain,DC=com:
HTTP/www1.mydomain.com
<-- Web サーバー上に登録されてしまった(後から見るように、実はこれは正しい)
SMTPSVC/IIS1
SMTPSVC/iis1.mydomain.com
HOST/IIS1
HOST/iis1.mydomain.com
G:\Reskit>setspn -L keisukeo-nn
Registered ServicePrincipalNames for CN=KEISUKEO-NN,OU=Domain
Controllers,DC=myd
omain,DC=com:
SMTPSVC/KEISUKEO-NN
SMTPSVC/keisukeo-nn.mydomain.com
NtFrs-88f5d2bd-b646-11d2-a6d3-00c04fc9b232/keisukeo-nn.mydomain.com
GC/keisukeo-nn.mydomain.com/mydomain.com
HOST/keisukeo-nn.mydomain.com/MYDOMAIN0
HOST/KEISUKEO-NN
HOST/keisukeo-nn.mydomain.com
HOST/keisukeo-nn.mydomain.com/mydomain.com
E3514235-4B06-11D1-AB04-00C04FC2DCD2/873321e4-b86e-4759-92d4-7ca1a6850805/my
domain.com
LDAP/873321e4-b86e-4759-92d4-7ca1a6850805._msdcs.mydomain.com
LDAP/keisukeo-nn.mydomain.com/MYDOMAIN0
LDAP/KEISUKEO-NN
LDAP/keisukeo-nn.mydomain.com
LDAP/keisukeo-nn.mydomain.com/mydomain.com
DNS/keisukeo-nn.mydomain.com
これで Windows XP のクライアントからアクセスした。
結果、Kerberos で認証された。
これは予想外。ドメインに SPN を登録する必要があると思っていた。
念のためやり直し。
DNS に www2 を登録。クライアントと IIS をリブートして再度リクエスト。その結果、NtLmSsp でアクセスした。DC 上で (おそらく IIS マシン上でやっても同じと思うが)
> SetSPN -A HTTP/www2.mydomain.com iis1
を実行。再度ブラウザから http://www2.mydomain.com/scripts/ping.asp でリクエスト。やはり Kerberos でのアクセスになった。画面は上記と全く同様なので省略。
次に、ドメインコントローラ上で SPN を登録する。
DNS に www3 を設定する。そこで、ドメインコントローラ上に SPN www3.mydomain.com を登録する。
D:\Reskit>setspn -A
HTTP/www3.mydomain.com keisukeo-nn
Registering ServicePrincipalNames for CN=KEISUKEO-NN,OU=Domain
Controllers,DC=mydomain,DC=com
HTTP/www3.mydomain.com
Updated object
D:\Reskit>setspn -L keisukeo-nn
Registered ServicePrincipalNames for CN=KEISUKEO-NN,OU=Domain
Controllers,DC=mydomain,DC=com:
HTTP/www3.mydomain.com
<-- 確かに登録されている。
SMTPSVC/KEISUKEO-NN
SMTPSVC/keisukeo-nn.mydomain.com
NtFrs-88f5d2bd-b646-11d2-a6d3-00c04fc9b232/keisukeo-nn.mydomain.com
GC/keisukeo-nn.mydomain.com/mydomain.com
HOST/keisukeo-nn.mydomain.com/MYDOMAIN0
HOST/KEISUKEO-NN
HOST/keisukeo-nn.mydomain.com
HOST/keisukeo-nn.mydomain.com/mydomain.com
E3514235-4B06-11D1-AB04-00C04FC2DCD2/873321e4-b86e-4759-92d4-7ca1a6850805/mydomain.com
LDAP/873321e4-b86e-4759-92d4-7ca1a6850805._msdcs.mydomain.com
LDAP/keisukeo-nn.mydomain.com/MYDOMAIN0
LDAP/KEISUKEO-NN
LDAP/keisukeo-nn.mydomain.com
LDAP/keisukeo-nn.mydomain.com/mydomain.com
DNS/keisukeo-nn.mydomain.com
D:\Reskit>setspn -L iis1
Registered ServicePrincipalNames for CN=IIS1,CN=Computers,DC=mydomain,DC=com:
HTTP/www2.mydomain.com
HTTP/www1.mydomain.com
SMTPSVC/IIS1
SMTPSVC/iis1.mydomain.com
HOST/IIS1
HOST/iis1.mydomain.com
この状態でクライアントからリクエストする。
結果、ログインできなかった。エラーイベントは Source = Security で ID = 547。クライアントには、401.1 Unauthorized: Logon Failed が返った。
しかし、この場合認証パッケージは Kerberos が使用されているようだ。
このとき、クライアント側には次の KRB_AP_ERR_MODIFIED エラー (Source=Kerberos, ID=4) が記録された。
そこで、www3 を SetSPN で iis1 に登録する。すると、正常に表示された。
keisukeo-nn サービスアカウントから HTTP/www3.mydomain.com SPN プロパティを削除するには次の通り:
> SetSPN -D HTTP/www3.mydomain.com keisukeo-nn
補足
では、SetSPN が何をしたか?ということが重要になるが、端的にはそれは AD の CN=IIS1,CN=Computers,DC=mydomain,DC=com の servicePrincipalName 属性に値を設定した、と言うことになる。つまり、SetSPN は AD の servicePrincipalName 属性を操作する単機能のツール、ということだ。
AD を操作した、ということについては Windows 2000 サポートツールの ADSI Edit を用いると良くわかる (下図には www3 は登録が無いが、それは単にこの実験の後の段階で取ったスナップショットだから)。
ちなみに、サポートツールは Windows 2000 CD1 の SUPPORT\TOOLS フォルダにある、SETUP.EXE を実行することでインストールできる。
IIS6 のワーカープロセスにドメインユーザーを指定する場合
考え方としては上記と同様にワーカープロセスにドメインユーザーを指定するならば、そのユーザーの属性として SPN を登録する必要がある。
SetSPN -A HTTP/machinename domain\userapppoolisrunningas
SetSPN -A HTTP/machinename.domain.com(aka FQDN) domain\userapppoolisrunningas
IIS マシン名が iis1 である場合、http://iis1/ へのアクセスまたは
http://iis1.mydomain.com/ へのアクセスは Kerberos が使用されます。