クライアント証明書 ディレクトリマッピング によるWindows統合認証から SQL Server にアクセス (途中)

IISとSQLExpress の同居していた開発環境では動いたのだが、IIS と SQL Server の分離している環境で動かそうとしたところ、SQL Server へのログインアカウントが "NT AUTHORITY\ANONYMOUS LOGON" となってしまうという現象になってしまった。

調査したところ「ダブルホップ問題」 double-hop problem と呼ばれているもののようだ。

具体的には 認証を委任する場合の ASP.NET アプリケーションの構成方法 の委任に関する要件にあるもののうち、「ネットワーク上のコンピュータとアカウントを、委任に対して信頼されるように設定しています。」が該当する。

最初にAllow a computer to be trusted for delegation に従って、Active Directory ユーザとコンピュータ を利用して、コンピュータアカウントにおける 委任 の許可設定を行ったがそれでも状況は変わらず。ただ今回は運用環境だったのでおいそれと再起動をかけるわけにもいかず、マシン再起動で改善したのかどうかは今のところ分からない。

その後 How To: Use Protocol Transition and Constrained Delegation in ASP.NET 2.0 というドキュメントを見つけた。シナリオのところにある

If your client uses certificate authentication, you can consider protocol transition. If your client uses certificates to authenticate with your Web server the application can look up the user in Active Directory based on the certificate, and use protocol transition to allow the user to log on.

はまさに今回やろうとしている状況に似ている。ただしディレクトリマッピングをIISに自動でやらせるのではなく、証明書の中からアカウント情報を抽出して自分で偽装を実装するという話のようだ。

ドキュメント中 Step 2. Configure Your Service or Machine Account for Constrained Delegation のところを見ると、サービスを動作させるためのアカウントとしてシステムアカウント(おそらく LocalSystem または Network Service) を利用している場合には自動的にservice principal name (SPN) が作成されるが、そうではなくドメインアカウントを利用している場合には setspn を使って明示的にSPNを設定する必要があるとのこと。

今回の環境では SQL Server 側でドメインアカウントによりサービスを動作させている。このため以下の箇所に相当する作業をしていないのが動作しなかった原因である可能性が高い。

Note: If you use a custom domain account to run SQL Server, you must create a service principal name (SPN) for this account. You can do this by using the following command:
setspn -A MSSQLSvc/databaseservername.fullyqualifieddomainname domain\customAccountName

やっている作業としては、FreeBSD用向けに ktpass コマンドを叩いていた時にとても似ている。さらっと書いているが databaseservername.fullyqualifieddomainname の部分がSQL Server のFQDNなマシン名と一致していなければ動作しないはず。検証はこれから。

ドキュメント内ではプログラムで DOMAIN\UserName 形式の名前を UserName@DOMAIN 形式に変換した上で WindowsIdentity クラスの Impersonate を呼び出して偽装を行っているがこれはForm認証の時の話で、IIS側で ディレクトリマッピング + Windows統合認証 + Web.configでimpersonate="true" の時はすでに偽装済みのはずと認識している。

その他の参考リンク

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。