サービス プリンシパル名の登録
みなさん、こんにちは。
今週は、サービス プリンシパル名の登録に関する話題です。
サービス プリンシパル名 (SPN : service principal name) は、クライアントがサービスのインスタンスを一意に識別するための名前です。
Kerberos 認証が正しく行われるためには、SPN が正しく設定されている必要があります。SPN は Active Directory 属性ですが、標準の AD スナップインからは確認することができません。SPN の設定、重複確認に使用するツールもいくつかこのブログで紹介しています。
SPN の重要性
CRM、SQL Reporting Services (SRS) 、SQL が別々のコンピューターにインストールされている場合、SPN を正しく登録することが重要です。複数のコンピューターにわけて CRM、SRS 、SQL をインストールすると、ユーザー認証が一方のサーバーから他方のサーバーに引き渡される必要があり、これが Kerberos 認証の委任と呼ばれます。
委任とは、ネットワーク中のリソースにアクセスするため、ユーザー アカウントまたはコンピュータ アカウントの代理として動作することをサービスに許可することです。たとえば、ユーザーが CRM のユーザーインタフェースから CRM レポートを実行する場合、CRM サーバーで認証された後に、リクエストが SRS サーバーに送信されます。CRM サーバーがユーザーを偽装し、SRS へのリクエストが、あたかもユーザーから直接送信されているかのうように動作します。SPN が正しく設定されていないと、資格情報が CRM サーバーで無効となり、SRS へのリクエストは NT Authority\Anonymous ログオンとして送信されます。その結果、401 認証エラーが発生します。
SPN の形式
SPN は、<サービス クラス>/<ホスト>:<ポート番号>/<サービス名> の形式で表されます。
ポート番号とサービス名はオプションですが、SQL サービスに対する SPN を指定する場合によく指定されます。使用されている SQL ポート、および SQL Server 既定のインスタンス、または名前付きインスタンスの名前を指定します。IIS アプリケーションに対してポート番号、サービス名を指定する必要がある場合もあります。Web アプリケーション / サービスが既定のポート 80 (HTTP) や 443 (https) 以外のポートを使用している場合です。既定のポートを使用している場合は、IIS に対してサービス名を指定する必要はありません。
SPN の自動登録
デフォルトで HOST サービス クラス SPN が全コンピューター アカウントに対して登録されます。NetBIOS 形式と完全修飾ドメイン名 (FQDN) 形式の両方が登録されます。
HOST SPN の形式は次のとおりです。
HOST/<コンピューター名>
HOST/<コンピューター名>.<FQDN>
SQL Server をインストールすると、SQL サービス アカウントに対する SPN が必要となり、このサービスアカウントに対する一意の SPN が次の形式で自動登録されます。
MSSQLSvc\<コンピューター名>:<ポート>
インストール後に SQL サービスアカウントを変更する場合は、SPN が重複しないように注意する必要があります。変更後の SQL サービスアカウントが、SQL サーバーのコンピューター アカウント でない場合は、インストール時に自動登録された SQL サーバーのコンピューター アカウントに対する MSSQLSvc サービスの SPN を削除する必要があります。
SPN の追加登録
SPN の追加登録が必要な場合があります。IIS アプリケーション プールが特定のサービス アカウントで実行されている場合は、必ず SPN の追加登録が必要です。たとえば、アプリケーション プール アカウントとして、Network Service の代わりにドメイン ユーザーを使用している場合です。アプリケーション プールは、ドメイン ユーザー アカウントとして実行されているので、HTTP サービス クラスを使用して、そのドメイン ユーザー アカウントに対する SPN を追加登録する必要があります。
次の例は、SSL は使用しておらず、HTTP プロトコルのみを使用している場合です。
HTTP/<コンピューター名>
HTTP/<コンピューター名>.<fqdn>
Web サイトにホスト ヘッダーを設定している場合も SPN の追加登録が必要です。HTTP サービス クラスの SPN をアプリケーション プール アカウントに対して登録し、コンピューター名の代わりにホストヘッダーを使用するように設定します。
HTTP/<ホストヘッダー>
HTTP/<ホストヘッダー>.<fqdn>
SQL サービスを実行しているアカウントがインストール後に変更された場合は、MSSQLSvc SPN も新しいサービス アカウントに変更する必要があります。一般的には、Local System アカウントを SQL サービス アカウントに指定してインストールすることが多いかもしれませんが、このようにインストールした場合は、次の SPN が SQL がインストールされたコンピューターに対して登録されます。
MSSQLSvc/<コンピューター名>:<ポート>
インストール後に SQL サービス アカウントをドメイン ユーザーに変更する場合は、コンピューターに対して登録された MSSQLSvc SPN を削除し、ドメイン ユーザーに対して MSSQLSvc SPN を登録する必要があります。
SPN を設定する
SPN はWindows サポート ツールがインストールされているドメイン サーバーで登録することができます。 ADSI Edit や SetSPN コマンド ライン ユーティリティがよく使用されるツールです。
注意 : SPN の変更、登録を行う場合は、SPN が重複しないようにすることが重要です。SPN は一意に設定される必要があります。
ADSI Edit は LDAP エディタで Active Directory のオブジェクトや属性を管理することができます。ADSI Edit を使用して Active Directory ユーザーとコンピューターのようにオブジェクトを表示することができます。 ADSI Edit で SPN を変更するには、ユーザー、またはコンピューターオブジェクトを選択し、プロパティを開きます。属性一覧で SPN を確認し、編集ボタンをクリックします。このエディタを使用して、簡単に選択したオブジェクトに対する SPN の追加、編集、削除を行うことができます。Windows Server 2003 の場合は、Windows Server 2003 Service Pack 2 32-bit Support Tools (英語) から ADSI Edit をダウンロードすることができます。Windows Server 2008 ドメイン コントローラーの場合は、標準で ADSI Edit がインストールされています。
SetSPN はコマンド ライン ツールで、Active Directory オブジェクトに対して SPN の参照、変更、削除を行うことができます。SetSPN は特定のアカウントに対して作業を行うツールで、Windows Server 2008 を除き、ドメインまたはフォレスト全体に対して SPN を検索することをはできません。
- SPN をリストする :
特定のオブジェクトに対して登録されている SPN をリストする場合は、次のコマンドを使用します。
setspn -l <オブジェクト名>
例) setspn –l microsoft\CrmAdmin または setspn –l CrmAppServer - SPN を登録する :
特定のオブジェクトに SPN を追加する場合は、次のコマンドを使用します。
setspn -a <サービス クラス/名前> <オブジェクト名>
例) setspn –a HTTP/crm microsoft\CrmAdmin または setspn –a HTTP/crm CrmAppServer - SPN を削除する :
特定のオブジェクトに登録されている SPN を削除する場合は、次のコマンドを使用します。
setspn -d <サービス クラス/名前> <オブジェクト名>
例) setspn –d HTTP/crm microsoft\CrmAdmin または setspn –d HTTP/crm CrmAppServer
Active Directory で SPN を登録する前に、その SPN が Active Directory フォレスト内で他のアカウントに対して既に登録されていないかを確認することが重要です。
次に確認するために使用できるいくつかの方法を紹介します。
- LIDFDE : フォレスト下の全ドメインに対して SPN を検索することができます。
- LDP : フォレスト下の全ドメインに対して SPN を検索することができます。
- queryspn.vbs
これらのツールの使用方法についてはサポート技術情報 321044 を参考にしてください。
Windows Server 2003 を使用している場合は、下記の Setspn.exe サポート ツールの更新プログラムを使用することで setspn コマンドラインを使用して SPN の重複を確認することができます。
Microsoft サポート技術情報 970536: Windows Server 2003 の Setspn.exe サポート ツールの更新プログラム
Microsoft Dynamics CRM に特化したシナリオ
ここでは、CRM で SPN を追加登録する、または登録されている SPN を AD 上の別のオブジェクトに対して登録し直す必要がある 3 つのシナリオを用意しました。
各シナリオに SPN の詳細な登録情報を記述しています。CRM サーバーが他の Web サイトもホストしている場合や他のアプリケーションが CRM と同じ SQL インスタンスを使用している場合は、他にも考慮すべき点がありますが、ここでは CRM の SPN にフォーカスします。
また、設定を変更する場合は、変更前の状態に戻すことができるように準備しておいてくださいね。
シナリオ 1 - Web サイトにホスト ヘッダーを設定する場合
次の設定情報で Microsoft Dynamics CRM Web サイトにホスト ヘッダーを設定しいています。
ポート : 80
ホスト ヘッダー値 : crm
CRM サーバー : CRMAppServer.contoso.com
アプリケーション プール アカウント : Network Service
アプリケーション プール アカウントによって SPN が登録されているべき対象が決まります。このシナリオでは Network Service が使用されていますので、CRM サーバー コンピュータ アカウントに対して SPN を登録します。
CRMAppServer.contoso.com オブジェクトに対して登録が必要な SPN は次のとおりです。
- HTTP/crm
- HTTP/crm.contoso.com
まず、登録する SPN が既に使用されていないかを確認し、次に登録作業に移ります。
先に紹介したツール等を使用して登録手順をみていきましょう。
1. 登録する SPN が既に登録されていないかを確認します。
ここでは queryspn.vbs を使用します。コマンド プロンプトから次のコマンドを入力します :queryspn.vbs http:/crm*
参考 : queryspn.vbs は、マイクロソフト TechNet 資料で公開されているコードをコピーし、メモ帳等に貼り付けて.vbs ファイルとして保存します。
保存するファイル名によってコマンドラインは異なります。ここでは、queryspn.vbs としてスクリプトを保存しています。
2. 登録されている SPN がない場合は、"No SPNs found!" というポップアップが表示されます。
SPN が存在しないことを確認したら、次のコマンドを使用して、コンピューター アカウント CRMAppServer に対して次の 2つの SPN を追加します :setspn -a HTTP/crm CRMAppServer
setspn -a HTTP/crm.contoso.com CRMAppServer
Kerberos 認証を使用する場合に、いくつか留意点があります。DNS の CNAME を使用しないことをお薦めします。代わりに A-レコード、またはホストの使用を検討してください。DNS の CNAME を使用し、アプリケーション プール アカウントに Network Service を使用しない場合は、Kerberos 認証を使用するために Internet Explorer に対して必要となる追加作業があります。Internet Explorer 6 の場合は、修正プログラムの適用、およびレジストリの変更を行う必要があります。Internet Explorer 7 または上位バージョンを使用している場合は、修正プログラム適用は不要で、機能を有効にするためにレジストリ変更のみを行ってください。詳細については、次のサポート技術情報をご覧ください。 :
- Microsoft サポート技術情報 911149: Windows XP ベースのコンピューターで Kerberos 認証が必要な Web サイトにアクセスしようとすると、Internet Explorer でエラー メッセージ: 「HTTP エラー 401 - 権限: 無効な資格情報によりアクセスが拒否されました」
- Microsoft サポート技術情報 938305: Internet Explorer 7 を使用して Kerberos 認証を必要とする Web サイトにログオンしようとすると、エラー メッセージ:「アクセスが無効な資格情報のため拒否されました」
シナリオ 2 - CRM アプリケーション プール アカウントをドメイン ユーザーに変更する場合
ここでは、シナリオ 1 の設定から CRM アプリケーション プール アカウントをドメイン ユーザー 'CRMService' に変更する場合についてみていきましょう。
ポート : 80
ホスト ヘッダー値 : crm
CRM サーバー : CRMAppServer.contoso.com
変更前アプリケーション プール アカウント : Network Service
変更後アプリケーション プール アカウント : contoso\crmservice
アプリケーション プール アカウントを変更する場合、サーバー名、およびホスト ヘッダーに対して登録されている HTTP サービス クラスの SPN を、変更後のドメインユーザーアカウントに対して登録し直す必要があります。
SPN 登録時には、SPN が重複しないように注意しましょう。既存の SPN が存在している場合は、それらを削除する必要があります。
シナリオ 2 では、登録されている SPN を削除し、別のオブジェクトに対して登録する手順をみていきましょう。
1. 現在のアプリケーション プール アカウントに登録されている SPN を確認します。現在使用されているアカウントは、Network Service ですので、ローカル コンピューター アカウント CRMAppServer.contoso.com に登録されている SPN を確認します。SPN は、ADSI Edit や SetSPN コマンドを使用して確認することができます。次に ローカル コンピューター アカウント CRMAppServer.contoso.com に登録されている SPN の一覧を記述します。コンピュータにインストールされているサービスによっては下記以外の SPN が表示される場合もあります。
HOST/CRMAppServer
HOST/CRMAppServer.contoso.com
HTTP/crm
HTTP/crm.contoso.comSetSPN コマンド ライン ユーティリティ を使用して、CRMAppServer に登録されている SPN をリストする場合は -l オプションを使用します。
setspn -l CRMAppServer
2. 2 種類のサービス クラス に対する SPN が登録されていますが、既定で登録される HOST SPN とホスト ヘッダーに対して登録された HTTP SPN です。現在コンピューター アカウントに登録されている HTTP SPN は削除し、新しく指定するドメイン ユーザー アカウントに対して SPN を再登録する必要があります。HOST SPN は一意のサービス クラスで重複しないため変更の必要はありません。次の SPN を ADSI Edit または SetSPN コマンドを使用して削除します。
HTTP/crm
HTTP/crm.contoso.comSetSPN コマンド ライン ユーティリティ を使用する場合は、-d オプションを使用して SPN を削除することができます。
setspn -d HTTP/crm CRMAppServer
setspn -d HTTP/crm.contoso.com CRMAppServer3. 次の SPN を contoso\crmservice に対して登録します。サーバー名とホスト ヘッダーに対して SPN を登録します。他のホスト ヘッダーが設定されている場合は、それらのホスト ヘッダーに対する SPN も追加しましょう。
HTTP/CRMAppServer
HTTP/CRMAppServer.contoso.com
HTTP/crm
HTTP/crm.contoso.comSetSPN コマンド ライン ユーティリティ を使用する場合は、-a オプションを使用して SPN を登録することができます。
setspn -a HTTP/CRMAppServer contoso\crmservice
setspn -a HTTP/CRMAppServer.contoso.com contoso\crmservice
setspn -a HTTP/crm contoso\crmservice
setspn -a HTTP/crm.contoso.com contoso\crmservice
ここでもシナリオ 1 と同じように、登録済みの SPN を確認し、SPN が重複しないことを確認した後に、新しい SPN を登録しました。
シナリオ 3 - CRM アプリケーション プール アカウントをドメイン ユーザーに変更するが、他のドメイン ユーザー アカウントで実行されている CRM 以外のアプリケーション プールが存在する場合
ここでは次のシナリオについてみていきましょう。CRM サーバーの存在するコンピューターにイントラネットサイトがホストされています。
CRM サーバー : CRMAppServer.contoso.com
CRM Web サイト ポート番号 : 5555
ホスト ヘッダー値 crm、ポート番号 80 でホスト ヘッダーが設定されています。CRM Web サイトへのアクセス URL は次のとおりです。
https://CRMAppServer:5555
https://crmCRM Web サイトが存在するサーバーはイントラネット サイトもホストしています。
イントラネット サイト ポート番号 : 80
ホスト ヘッダー値 Intranet 、ポート番号 80 でホスト ヘッダーが設定されています。
イントラネット アプリケーション プール アカウント: contoso\intranetserviceこのイントラネット サイトへのアクセス URL は次のとおりです。
https://CRMAppServer
https://IntranetCRM アプリケーション プール アカウントをドメイン ユーザー アカウント contoso\crmservice に変更したいと考えています。
変更前アプリケーション プール アカウント : Network Service
変更後アプリケーション プール アカウント : contoso\crmservice
実際には、CRM アプリケーション プール アカウントを変更する前に、使用するアカウントに対して行わなければならない設定がいくつかありますが、ここでは SPN の設定について記述します。変更時に必要となる SPN 以外の設定詳細については サポート技術情報 932476 の対処方法が参考になると思います。
アプリケーション プール の実行アカウントを変更する場合、サーバー名、およびホスト ヘッダーに対して登録されている HTTP サービス クラスの SPN を変更後のドメインユーザーアカウントに対して登録する必要があります。
SPN 登録時には、SPN が重複しないように注意してください。既存の SPN が存在している場合は、それらを削除する必要があります。
ここで問題となるのは、異なるアプリケーション プール アカウントが使用されている 2 つのサイトがあり、同じホスト名でアクセスされるという点です。HTTP/CRMAppServer SPN を CRMService ユーザー アカウントに対して登録した場合、重複してしまいます。イントラネット サイトへのアクセスにも HTTP/CRMAppServer を使用するため、IntranetService から SPN を削除することはできません。そこで、ポート番号を SPN に指定し、サイトを識別します。
ポート番号を指定する場合の手順についてみていきましょう。コマンドラインは、シナリオ 1、シナリオ 2 で紹介してきましたのでここでは省略します。
1. 現在のアプリケーション プール アカウントに登録されている SPN を確認します。現在使用されているアカウントは、Network Service ですので、ローカル コンピューター アカウント CRMAppServer.contoso.com に登録されている SPN を確認します。次に ローカル コンピューター アカウント CRMAppServer.contoso.com に登録されている SPN の一覧を記述します。
オブジェクト : CRMAppServer.contoso.com
HOST/CRMAppServer
HOST/CRMAppServer.contoso.com
HTTP/CRM
HTTP/CRM.contoso.comオブジェクト : contoso\IntranetService
HTTP/CRMAppServer
HTTP/CRMAppServer.contoso.com
HTTP/Intranet
HTTP/Intranet.contoso.com2. CRMAppServer.contoso.com には、2 種類のサービス クラス に対する SPN が登録されています。既定の HOST SPN とホストヘッダに対して登録された HTTP SPN です。CRM ホスト ヘッダーに対して登録されている HTTP SPN は削除し、新しく指定するドメイン ユーザー アカウントに対して再登録する必要があります。
HTTP/CRM
HTTP/CRM.contoso.com3. 次の SPN をドメイン ユーザー contoso\crmservice に対して登録します。サーバー名とホスト ヘッダーに対する SPN です。SPN の重複をさけるために、ポート番号が指定されている点に注意してください。
HTTP/CRMAppServer:5555
HTTP/CRMAppServer.contoso.com:5555
HTTP/CRM
HTTP/CRM.contoso.com
既定のポート(80、または 443)以外を使用する場合、IE 6 では既知の問題が報告されており Kerberos 認証を正しく動作させるために修正プログラムの適用とレジストリ変更が必要です。この修正プログラムは IE 7 には適用する必要がありませんが、機能を有効にするために IE 6 と同じレジストリ変更を行う必要があります。
Microsoft サポート技術情報 908209: Internet Explorer 6 で、Kerberos 認証プロトコルを使用して Windows XP および Windows Server 2003 では、非標準ポートを使用する Web サイトに接続することはできません。
Kerberos 関連の問題に関する詳細情報は、 ディレクトリー サービス サポート チームの AskDS ブログに公開されています。
Kerberos 認証の動作に関する詳細情報 (英語) :
https://blogs.technet.com/askds/archive/2008/03/06/kerberos-for-the-busy-admin.aspx
SPN のトラブルシューティング方法に関する詳細情報 (英語) :
- パート 1: https://blogs.technet.com/askds/archive/2008/06/09/kerberos-authentication-problems-service-principal-name-spn-issues-part-1.aspx
- パート 2: https://blogs.technet.com/askds/archive/2008/06/09/kerberos-authentication-problems-service-principal-name-spn-issues-part-2.aspx
- パート 3: https://blogs.technet.com/askds/archive/2008/06/09/kerberos-authentication-problems-service-principal-name-spn-issues-part-3.aspx
情報元: Configuring Service Principal Names(英語)
https://blogs.msdn.com/crm/archive/2009/08/06/configuring-service-principal-names.aspx
長いブログになりましたが、最後まで読んでいただきありがとうございました!
- Dynamics CRM サポート 斎藤 さち江