クライアント接続でのサービス プリンシパル名 (SPN) のサポート

SQL Server 2008 以降では、サービス プリンシパル名 (SPN) のサポートが強化されて、あらゆるプロトコルでの相互認証が可能になりました。以前のバージョンの SQL Server では、SQL Server インスタンスの既定の SPN が Active Directory に登録されているときに、Kerberos over TCP に対してのみ SPN がサポートされていました。

SPN は、SQL Server インスタンスが実行されているアカウントを認証プロトコルで特定するために使用されます。インスタンスのアカウントが判明した場合は、Kerberos 認証を使用したクライアントとサーバーによる相互認証が可能となります。インスタンスのアカウントが不明である場合は、NTLM 認証を使用して、サーバーによるクライアントの認証のみが行われます。現時点では、SQL Server Native Client がこの認証を参照して、インスタンス名とネットワーク接続のプロパティから SPN を生成します。SPN の登録は SQL Server インスタンスが起動時に行いますが、手動で登録することもできます。ただし、SPN を登録するアカウントのアクセス権が不十分である場合は、登録が失敗します。

ドメインおよびコンピューター アカウントは、自動的に Active Directory に登録されます。これらのアカウントを SPN として使用することも、管理者が独自に SPN を定義することもできます。SQL Server では、使用する SPN をクライアントが直接指定できるようにすることで、セキュリティで保護された認証の管理性と信頼性を高めています。

注意

クライアント アプリケーションで指定された SPN は、Windows NT 統合セキュリティを使用して接続されている場合にのみ使用されます。

Kerberos の詳細については、次の記事を参照してください。

使用法

次の表では、セキュリティで保護された認証をクライアント アプリケーションで使用するための、最も一般的なシナリオについて説明します。

シナリオ

説明

レガシ アプリケーションで SPN が指定されない。

この互換性のシナリオでは、以前のバージョンの SQL Server で作成されたアプリケーションの動作が変更されないことが保証されます。SPN が指定されていない場合、アプリケーションは生成された SPN を使用し、どの認証方法が使用されるかは認識しません。

現在のバージョンの SQL Server Native Client を使用するクライアント アプリケーションで、接続文字列に含まれる SPN が、ドメイン ユーザー アカウント、コンピューター アカウント、インスタンス固有の SPN、またはユーザー定義文字列として指定される。

プロバイダー文字列、初期化文字列、または接続文字列で ServerSPN キーワードを使用することで、次の操作が可能になります。

  • SQL Server インスタンスが接続に使用するアカウントを指定できます。これにより、Kerberos 認証へのアクセスが簡単になります。Kerberos キー配布センター (KDC) が存在し、かつ正しいアカウントが指定された場合は、NTLM よりも Kerberos 認証が使用される可能性が高くなります。KDC は通常、ドメイン コントローラーと同じコンピューターに存在します。

  • SQL Server インスタンスのサービス アカウントを参照するための SPN を指定できます。この目的で使用できる既定の SPN が、すべての SQL Server インスタンスに 2 つずつ生成されます。ただし、これらのキーが Active Directory に存在することは保証されないため、この状況では Kerberos 認証は保証されません。

  • SQL Server インスタンスのサービス アカウントを参照するために使用される SPN を指定できます。これは、サービス アカウントにマップされる任意のユーザー定義文字列でかまいません。この場合は、キーを手動で KDC に登録する必要があり、キーがユーザー定義 SPN の規則を満たしていることも必要です。

FailoverPartnerSPN キーワードを使用すると、フェールオーバー パートナー サーバーの SPN を指定できます。アカウントおよび Active Directory キーの値の範囲は、プリンシパル サーバーに指定できる値と同じです。

ODBC アプリケーションで、SPN がプリンシパル サーバーまたはフェールオーバー パートナー サーバーの接続属性として指定される。

接続属性 SQL_COPT_SS_SERVER_SPN を使用して、プリンシパル サーバーへの接続用の SPN を指定できます。

接続属性 SQL_COPT_SS_FAILOVER_PARTNER_SPN を使用して、フェールオーバー パートナー サーバーの SPN を指定できます。

OLE DB アプリケーションで、SPN がプリンシパル サーバーまたはフェールオーバー パートナー サーバーのデータ ソース初期化プロパティとして指定される。

DBPROPSET_SQLSERVERDBINIT プロパティ セット内の接続プロパティ SSPROP_INIT_SERVER_SPN を使用して、接続用の SPN を指定できます。

DBPROPSET_SQLSERVERDBINIT 内の接続プロパティ SSPROP_INIT_FAILOVER_PARTNER_SPN を使用して、フェールオーバー パートナー サーバーの SPN を指定できます。

ユーザーが、サーバーまたはフェールオーバー パートナー サーバーの SPN を ODBC データ ソース名 (DSN) で指定する。

SPN は、DSN を設定するダイアログ ボックスを使用して ODBC DSN に指定できます。

ユーザーが、サーバーまたはフェールオーバー パートナー サーバーの SPN を、OLE DB の [データ リンク] または [ログイン] ダイアログ ボックスで指定する。

SPN は、[データ リンク] または [ログイン] ダイアログ ボックスで指定できます。[ログイン] ダイアログ ボックスは、ODBC または OLE DB で使用できます。

ODBC アプリケーションで、接続の確立に使用された認証方法が特定される。

接続が正常に開いている場合、アプリケーションでは接続属性 SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD を照会して、使用された認証方法を特定できます。値には NTLM や Kerberos がありますが、その他の値もあります。

OLE DB アプリケーションで、接続の確立に使用された認証方法が特定される。

接続が正常に開いている場合、アプリケーションでは DBPROPSET_SQLSERVERDATASOURCEINFO プロパティ セット内の接続プロパティ SSPROP_AUTHENTICATION_METHOD を照会して、使用された認証方法を特定できます。値には NTLM や Kerberos がありますが、その他の値もあります。

フェールオーバー

SPN はフェールオーバー キャッシュに保存されないため、接続間で受け渡すことができません。接続文字列または接続属性に SPN が指定されると、プリンシパルおよびパートナーへの接続が試行されるたびに SPN が使用されます。

接続のプール

SPN をすべての文字列ではなく一部の接続文字列で指定すると、プールが断片化する原因となることがあるので、アプリケーションでは注意が必要です。

アプリケーションでは、接続文字列キーワードを指定する代わりに、プログラムによって SPN を接続属性として指定できます。こうすると、接続プールの断片化を管理するうえで役立ちます。

接続文字列内の SPN は対応する接続属性を設定することで上書きできますが、接続のプールで使用される接続文字列は、プールの目的で接続文字列値を使用するので、アプリケーションでは注意が必要です。

下位サーバーの動作

新しい接続動作はクライアントで実装されるため、SQL Server のバージョンに固有ではありません。

リンク サーバーと委任

リンク サーバーを作成すると、sp_addlinkedserver@provstr パラメーターを使用して、サーバーおよびフェールオーバー パートナーの SPN を指定できるようになります。そのメリットは、クライアントの接続文字列で SPN を指定する場合と同じです。つまり、Kerberos 認証を使用する接続を、より簡単かつ確実に確立できます。

リンク サーバーでの委任には、Kerberos 認証が必要です。

要件の一覧については、「リンク サーバーの委任用の構成」を参照してください。

アプリケーションによって指定される SPN の管理上の考慮事項

SPN をアプリケーションで接続文字列を通じて指定するか、プログラムで接続プロパティを通じて指定するか (プロバイダーが生成した既定の SPN を使用しない) を選択する際には、次の事項を検討してください。

  • セキュリティ : 指定した SPN が保護されている情報を開示する可能性。

  • 信頼性 : 既定の SPN の使用。既定の SPN を使用できるようにするには、SQL Server インスタンスを実行するサービス アカウントに、KDC 上の Active Directory を更新するための十分な権限が必要です。

  • 利便性と場所の透過性 : アプリケーションのデータベースを別の SQL Server インスタンスに移した場合の、アプリケーションの SPN に対する影響。データベース ミラーリングを使用する場合は、プリンシパル サーバーとそのフェールオーバー パートナーの両方について、この事項を検討する必要があります。また、サーバーの変更に伴って SPN を変更する場合のアプリケーションに対する影響や、すべての変更に関する管理の有無についても検討してください。

SPN の指定

SPN は、ダイアログ ボックスおよびコードで指定できます。ここでは、SPN を指定する方法について説明します。

SPN の最大長は 260 文字です。

接続文字列または接続属性で SPN に使用される構文は次のとおりです。

構文

説明

MSSQLSvc/fqdn

TCP 以外のプロトコルが使用される場合に、既定のインスタンスに対してプロバイダーが生成する既定の SPN。

fqdn は、完全修飾ドメイン名です。

MSSQLSvc/fqdn:port

TCP が使用される場合にプロバイダーが生成する既定の SPN。

port は、TCP ポート番号です。

MSSQLSvc/fqdn:InstanceName

TCP 以外のプロトコルが使用される場合に、名前付きインスタンスに対してプロバイダーが生成する既定の SPN。

InstanceName は、SQL Server インスタンスの名前です。

HOST/fqdn

HOST/MachineName

Windows で自動的に登録されるビルトイン コンピューター アカウントにマップされる SPN。

Username@Domain

ドメイン アカウントの直接指定。

Username は、Windows ユーザー アカウントの名前です。

Domain は、Windows ドメイン名または完全修飾ドメイン名です。

MachineName$@Domain

コンピューター アカウントの直接指定。

(接続先のサーバーが、LOCAL SYSTEM または NETWORK SERVICE アカウントで実行されている場合に Kerberos 認証を使用するには、ServerSPN を MachineName$@Domain の形式で指定できます。)

KDCKey/MachineName

ユーザー指定の SPN。

KDCKey は、KDC キーの規則に従っている英数字の文字列です。

SPN をサポートする ODBC および OLE DB の構文

各構文の情報については、次のトピックを参照してください。

この機能を説明するサンプル アプリケーションについては、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。

関連項目

その他の技術情報