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 は IIS マシンに登録すれば Kerberos になる。
SPN は IIS マシン (の AD サービスアカウント [CN=iis1] の SPN ディレクトリプロパティ) に登録すれば、その HTTP アクセスは 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 に登録する。すると、正常に表示された

ここまでのまとめ
ブラウザからアクセスする FQDN (SPN) を DC に登録すると、認証パッケージは Kerberos になるが、ログインできない。続けて IIS マシンに登録すると、正常に動作する。
ブラウザからアクセスする FQDN (SPN) を DC 自身の AD サービスアカウントのプロパティに登録すると、認証パッケージは Kerberos になるがログインできない。続けて IIS マシンの AD サービスアカウントのプロパティとして登録すると、正常に動作する。 (DC に同様の SPN 属性を持つエントリがあっても一応大丈夫だが、本来 SPN は唯一に識別されるものであるので前者の設定は削除すること)

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 が使用されます。

 

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説