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

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) は同梱されていません。

  • SQL Server 2022 (16.x) 以降のバージョン
  • SQL Server Management Studio 19 以降のバージョン

SQL Server Native Client (SQLNCLI または SQLNCLI11) と従来の Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。

新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。

SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、この「サポート ライフサイクルの例外」を参照してください。

SQL Server 2008 (10.0.x) 以降では、サービス プリンシパル名 (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®」をご覧ください。

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 がプリンシパル サーバーまたはフェールオーバー パートナー サーバーのデータ ソース初期化プロパティとして指定される。 SSPROP_INIT_SERVER_SPN プロパティ セット内の接続プロパティ DBPROPSET_SQLSERVERDBINIT を使用して、接続用の SPN を指定できます。

SSPROP_INIT_FAILOVER_PARTNER_SPN 内の接続プロパティ DBPROPSET_SQLSERVERDBINIT を使用して、フェールオーバー パートナー サーバーの SPN を指定できます。
ユーザーが、サーバーまたはフェールオーバー パートナー サーバーの SPN を ODBC データ ソース名 (DSN) で指定する。 SPN は、DSN を設定するダイアログ ボックスを使用して ODBC DSN に指定できます。
ユーザーが、サーバーまたはフェールオーバー パートナー サーバーの SPN を、OLE DB の [データ リンク] または [ログイン] ダイアログ ボックスで指定する。 SPN は、 [データ リンク] または [ログイン] ダイアログ ボックスで指定できます。 [ログイン] ダイアログ ボックスは、ODBC または OLE DB で使用できます。
ODBC アプリケーションで、接続の確立に使用された認証方法が特定される。 接続が正常に開いている場合、アプリケーションでは接続属性 SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD をクエリして、使用された認証方法を特定できます。 値には NTLMKerberosがありますが、その他の値もあります。
OLE DB アプリケーションで、接続の確立に使用された認証方法が特定される。 接続が正常に開いている場合、アプリケーションでは SSPROP_AUTHENTICATION_METHOD プロパティ セット内の接続プロパティ DBPROPSET_SQLSERVERDATASOURCEINFO をクエリして、使用された認証方法を特定できます。 値には NTLMKerberosがありますが、その他の値もあります。

[フェールオーバー]

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

接続のプール

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

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

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

下位サーバーの動作

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

リンク サーバーと委任

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

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

アプリケーションによって指定される 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 認証を使用するには、 ServerSPNMachineName$@Domain の形式で指定できます。)
KDCKey/MachineName ユーザー指定の SPN。

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

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

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

参照

SQL Server Native Client の機能
Kerberos 接続用のサービス プリンシパル名の登録