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 を派生させます。 SQL Server インスタンスが起動時に行いますが、手動で登録することもできます。 ただし、SPN を登録するアカウントのアクセス権が不十分である場合は、登録が失敗します。
ドメインおよびコンピューター アカウントは、自動的に Active Directory に登録されます。 これらは SPN として使用することも、管理者が独自の SPN を定義することもできます。 SQL Server では、使用する SPN をクライアントが直接指定できるようにすることで、セキュリティで保護された認証の管理性と信頼性を高めています。
注
クライアント アプリケーションで指定された SPN は、Windows 統合セキュリティを使用して接続されている場合にのみ使用されます。
ヒント
Microsoft Kerberos Configuration Manager for SQL Server は、 SQL Serverと Kerberos に関する接続性の問題のトラブルシューティングに役立つ診断ツールです。 Kerberos 認証の詳細については、「 Microsoft® Kerberos Configuration Manager for SQL Server®」をご覧ください。
ヒント
Microsoft Kerberos Configuration Manager for SQL Server は、 SQL Serverと Kerberos に関する接続性の問題のトラブルシューティングに役立つ診断ツールです。 Kerberos 認証の詳細については、「 Microsoft® Kerberos Configuration Manager for SQL Server®」をご覧ください。
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 は、Windows ユーザー アカウントの名前です。 Domain は、Windows ドメイン名または完全修飾ドメイン名です。 |
| MachineName$@ドメイン | コンピューター アカウントの直接指定。 (接続先のサーバーが LOCAL SYSTEM または NETWORK SERVICE アカウントで実行されている場合、Kerberos 認証を取得するために、 ServerSPNは MachineName$@Domain 形式にすることができます)。 |
| KDCKey/MachineName | ユーザー指定の SPN。 KDCKey は、KDC キーの規則に従っている英数字の文字列です。 |
SPN をサポートする ODBC および OLE DB の構文
各構文の情報については、次のトピックを参照してください。
この機能を示すサンプル アプリケーションの詳細については、「 SQL Server データ プログラミングのサンプル」を参照してください。