Http.sys を使用した Kerberos サービス プリンシパル名の登録

ネイティブ XML Web サービスは推奨されません。この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。

CREATE ENDPOINT または ALTER ENDPOINT を使用して HTTP エンドポイントを作成または変更するときは、HTTP SOAP 要求をエンドポイントに送信してきたユーザーを認証するための認証の種類を指定します。詳細については、「CREATE ENDPOINT (Transact-SQL)」および「ALTER ENDPOINT (Transact-SQL)」を参照してください。

CREATE ENDPOINT ALTER ENDPOINT を次のように使用して、Kerberos 認証をサポートするエンドポイントを構成できます。

  • AUTHENTICATION=KERBEROS と設定すると、HTTP 認証の唯一の認証手段として Kerberos が使用されます。

  • AUTHENTICATION=INTEGRATED と設定すると、そのエンドポイントでの HTTP 認証に対しては、オプション NEGOTIATE、KERBEROS、および NTLM を認証要求の一部として指定できます。NEGOTIATE オプションを指定すると、クライアントとサーバーの間に Kerberos ベースの認証が確立されます。クライアントで Kerberos がサポートされていない場合、またはネゴシエーションが不可能な場合、認証は NTLM に戻ります。NEGOTIATE オプションを指定したときにクライアントが NTLM に戻ることを防ぐため、クライアントがエンドポイントに対し AUTHENTICATION=KERBEROS を設定することをお勧めします。

Kerberos を使用した相互認証をサポートするには、SQL Server インスタンスを実行しているローカル システム アカウント、ドメイン ユーザー アカウントなどのアカウントに SPN (サービス プリンシパル名) を関連付ける必要があります。特定の SQL Server インスタンスによる SPN 登録の詳細は、インスタンスを構成したサービス アカウントの種類によって決まります。ローカル システム アカウントまたはネットワーク サービス アカウントで SQL Server を実行している場合は、コンピューター名で SPN を登録する必要があります。ドメイン ユーザー アカウントで SQL Server を実行している場合は、ドメイン ユーザー名で SPN を登録する必要があります。

SetSPN.exe の使用

SQL Server インスタンスを実行しているアカウントと SPN の関連付けを有効にするには、Windows SetSPN.exe サポート ツールを使用します。このツールを使用すると、SQL Server インスタンスを実行しているコンピューターの名前の SPN が、Active Directory に存在する Windows ドメイン サービス ユーザー アカウントとして追加されます。その際、SetSPN.exe ツールを使用して、NetBIOS 名および DNS の完全修飾名の 2 つについて SPN を追加できます。

たとえば、MyComputer で実行されている SQL Server インスタンスで SetSPN.exe ツールを実行すると、SQL Server インスタンスを実行しているアカウントに次の 2 つの SPN が関連付けられるので、それらをディレクトリに追加する必要があります。

HTTP/MyComputer;
HTTP/MyComputer.fully.qualified.domain.name.com

1 つのアカウントに SPN が複数存在する場合はありますが、それぞれの SPN は 1 つのアカウントにしか登録できません。

この 2 つの同じ SPN 名を削除するには、NetBIOS および DNS の完全修飾名のどちらにも SetSPN.exe を使用します。

考慮事項

  • SetSPN.exe は Httpcfg.exe と同様に Windows Server 2003 に付属しており、Httpcfg.exe や他の Windows サポート ツールをインストールする際と同一の手順でインストールできます。詳細については、「HTTP カーネル モード ドライバ (Http.sys) の構成」を参照してください。

  • SQL Server インスタンスをローカル システム アカウントで実行していない場合、DOMAIN ADMIN 権限を持った統合認証のユーザーのみが SetSPN.exe ツールで SPN 登録を変更できます。

  • SQL Server インスタンスをローカル システム アカウントで実行している場合、SQL Server の sysadmin 固定サーバー ロールのメンバーのみが SetSPN.exe ツールで SPN 登録を変更できます。

  • サービス アカウントがローカル システムの場合、SetSPN.exe ツールを使用しなくても、コンピューターの Active Directory アカウントに SPN が追加されます。

SetSPN.exe の構文

SetSPN.exe の構文は次のとおりです。

setspn { -ASPN | -DSPN | -L } service_account

引数

  • -A
    指定した SPN をアカウントに追加します。

  • -D
    指定した SPN をアカウントから削除します。

  • -L
    アカウントに登録されているすべての SPN を表示します。

MySQLHost という名前のコンピューターのドメイン ユーザー (MyDomain\MySQLAccount) として SQL Server インスタンスを実行している場合、次のコマンドを使用して適切な SPN を設定できます。

setspn –A http/MySQLHost MyDomain\MySQLAccount
setspn –A http/MySqlHost.Mydomain.Mycorp.com MyDomain\MySQLAccount

1 つのアカウントが複数の SPN を (サービスごとまたはホスト名ごとに 1 つずつ) 持つことはできますが、それぞれの SPN は 1 つのアカウントにしか登録できません。複数のアカウントに同一の SPN を登録すると、Kerberos 認証に失敗します。

たとえば、アカウント MyDomain\MySQLAccount には、次のように複数の SPN を登録できます。最初の 2 つのコマンドは 2 種類のサービス (http および rpc) を対象としています。最後のコマンドは、コンピューターに複数のホスト名があるという想定の下、別のホスト名を対象とします。

setspn –A http/MySQLHost MyDomain\MySQLAccount
setspn –A rpc/MySQLHost MyDomain\MySQLAccount
setspn –A http/MySecondHost MyDomain\MySQLAccount

次の場合は Kerberos エラーが発生します。

setspn –A http/MySQLHost MyDomain\MySQLAccountOne
setspn –A http/MySQLHost MyDomain\MySQLAccountTwo

この場合、2 つの異なるサービス アカウント (MySQLAccountOne および MySQLAccountTwo) で実行されているコンピューターに SQL Server インスタンスが 2 つ存在するので、エラーが発生します。SQL Server インスタンスごとに 1 つずつ、2 つの SPN を登録することはできません。

この状況は、1 台のコンピューター上の SQL Server の複数のインスタンスを異なるアカウントで実行している場合に発生します。それぞれの SPN は 1 つのアカウントにしか登録できません。複数の SQL Server インスタンス (たとえば、Inst1Inst2) を他のアプリケーション (IIS など) と共存させる必要があり、すべてのサービスに HTTP Kerberos 認証を使用する場合、次のいずれかの方法で SPN 登録の競合を解決します。

  • すべてのインスタンスとアプリケーションを同一のアカウントで実行します。

    たとえば、Inst1Inst2、および IIS を LocalSystem または Mydomain\MyServiceAccount で実行します。

  • 同一のコンピューターを表すホスト名を複数登録し、インスタンスおよびアプリケーションごとに異なるホストでリッスンします。上記の例にこの解決方法を適用するには、次の操作が必要です。

    • コンピューター用の 3 つの異なるホスト名を作成します。

    • 各ホストを異なるアプリケーションに割り当てます。

    • それぞれがホスト名とアプリケーションの組み合わせを示す、3 組の SPN を登録します。

Kerberos SPN 登録の問題のトラブルシューティング

次に、Kerberos SPN 登録のトラブルシューティングに関する一般的な問題を示します。

  • SPN が登録されていない。

    SPN が登録されていない場合、Kerberos 認証は SQL Server インスタンスを実行しているローカル コンピューターからは機能しますが、リモートのクライアント コンピューターでは機能しません。

  • SPN が複数回登録されている。

    管理者がドメイン ディレクトリで SPN (サービス プリンシパル名) を重複させたことが原因で、Kerberos 認証が失敗する場合があります。たとえば、次のような場合です。

    • SQL Server インスタンスを実行しているドメイン アカウントを変更した場合

      あるドメイン アカウント (たとえば DOMAIN\User1) で SQL Server インスタンスを実行しているときに SetSpn.exe を実行し、SQL Server の実行に使用するドメイン アカウントを変更 (たとえば DOMAIN\User2 に変更) した場合、SetSPN.exe を再度実行すると、両方のアカウントで同一の SPN がディレクトリに挿入されます。

    • 異なるアカウントで実行される複数の SQL Server インスタンスをインストールした場合

      複数の SQL Server インスタンスをインストールして各インスタンスを異なるアカウントで実行する場合、各インスタンスに対し SetSpn.exe を実行すると、それぞれの SQL Server サービス アカウントで重複するアカウントがディレクトリに登録されます。ドメイン ユーザー アカウントおよびローカル システム アカウントのいずれかで実行されているインスタンスもこれに該当します。

    • 別のアカウントで SQL Server インスタンスを削除および再インストールした場合

      あるアカウントで SQL Server をインストールして SPN を登録し、別のアカウントで SQL Server を削除して再インストールしてから再度 SPN を登録すると、それぞれのドメイン アカウントに同一の SPN が設定されることになります。その結果 SPN が重複します。

上記のいずれの場合も、問題が解決されるまで、HTTP エンドポイントが NTLM 認証に戻ります。この問題を解決するには、重複しているか、または古い SPN をディレクトリで見つけて、手動で削除する必要があります。