拡張保護を使用してデータベース エンジンに接続する

適用対象:SQL Server

拡張保護は、クライアントが接続先のサービスを認識できるようにすることで、認証リレー攻撃を防ぐのに役立ちます。

拡張保護は、オペレーティング システムによって実装されるネットワーク コンポーネントの機能です。 拡張保護は、Windowsでサポートされています。

拡張保護を使用して接続を行う場合、SQL Serverのセキュリティが強化されます。

要件チェックリスト

拡張保護を有効にするには、次のすべての条件を満たす必要があります。

  1. チャネル バインドをサポートする クライアント ドライバー を使用します。
  2. クライアントがチャネル バインド トークン (CBT) を生成できるように、接続で TLS 暗号化を有効にします。
  3. SQL Server インスタンスに一致する正しいサービス プリンシパル名 (SPN) で接続します。
  4. Windows 認証 (NTLM または Kerberos) を使用します。 拡張保護は SQL 認証には適用されません。
  5. SQL Server インスタンスで拡張保護を有効にします ([許可] または [必須] に設定)。

Note

拡張保護をサポートする C# の接続文字列の例については、「接続文字列の例」を参照してください。

拡張保護の説明

Extended Protection では、サービス バインディングとチャネル バインドを使用して、認証リレー攻撃を防ぎます。 認証リレー攻撃では、NTLM 認証を実行できるクライアント (Windows Explorer、Outlook、.NET SqlClient アプリケーションなど) が攻撃者 (悪意のある CIFS ファイル サーバーなど) に接続します。 攻撃者は、クライアントの資格情報を使用してクライアントを偽装し、サービス (データベース エンジンのインスタンスなど) に対して認証します。

この攻撃には、次の 2 つのバリエーションがあります。

  • 魅力的な 攻撃では、クライアントは自発的に攻撃者に接続します。

  • スプーフィング攻撃では、クライアントは有効なサービスに接続する予定ですが、DNS と IP のルーティングの一方または両方が有害であり、代わりに攻撃者に接続がリダイレクトされることを認識できません。

SQL Server では、SQL Server インスタンスに対するこれらの攻撃を減らすために、サービス バインドとチャネル バインドがサポートされています。

サービス バインド

サービス バインディングは、クライアントが接続しようとしているSQL Server サービスの署名付きサービス プリンシパル名 (SPN) の送信をクライアントに要求することで、攻撃に対処します。 サービスでは、認証応答の一部として、パケットで受信した SPN がサービス自身の SPN と一致するかどうかの確認が行われます。 クライアントが攻撃者に接続するように誘導された場合、クライアントには攻撃者の署名された SPN が含まれます。 攻撃者は、攻撃者の SPN を含むため、パケットを中継して実際の SQL Server サービスにクライアントとして認証することはできません。 サービス バインドでは、1 回限りごくわずかのコストが発生しますが、スプーフィング攻撃には対処しません。 サービス バインドは、クライアント アプリケーションが暗号化を使用してSQL Serverに接続しない場合に発生します。

チャネル結合

チャネル バインドは、クライアントと SQL Server サービスのインスタンスの間にセキュリティで保護されたチャネル (Schannel) を確立します。 サービスは、そのチャネルに固有のクライアント のチャネル バインド トークン (CBT) を独自の CBT と比較することで、クライアントの信頼性を検証します。 チャネル バインドでは、おびき寄せによる攻撃となりすましによる攻撃の両方に対処できますが、 ただし、すべてのセッション トラフィックのトランスポート層セキュリティ (TLS) 暗号化が必要になるため、実行時コストが大きくなります。 チャネル バインドは、クライアントアプリケーションが暗号化を使用してSQL Serverに接続するときに、クライアントまたはサーバーのどちらによって暗号化が適用されるかに関係なく発生します。

警告

SQL Server用のSQL ServerおよびMicrosoftデータ プロバイダーは、TLS 1.0 や SSL 3.0 などの古いプロトコルをサポートしています。 オペレーティング システムの SChannel レイヤーを変更して別のプロトコル (TLS 1.2 や TLS 1.3 など) を適用すると、SQL Serverへの接続が失敗する可能性があります。 TLS 1.2 または TLS 1.3 をサポートするSQL Serverの最新のビルドがあることを確認します。 詳細については、 TLS 1.2TLS 1.3 を参照してください。

オペレーティング システムのサポート

拡張保護Windowsサポートする方法の詳細については、次のリンクを参照してください。

ドライバー サポート

拡張保護をサポートする唯一のドライバーは、Windows ベースです。

  • Microsoft ODBC Driver for SQL Server (Windows のみ)
  • Microsoft OLE DB Driver for SQL Server
  • System.Data.SqlClient (Windows 上の .NET Framework 内)
  • Microsoft.Data.SqlClient (Windows 上)

設定

3 つのSQL Server接続設定は、サービス バインドとチャネル バインドに影響します。 これらの設定は、SQL Server 構成マネージャーまたは WMI を使用して構成できます。 ポリシー ベースの管理の サーバー プロトコル設定 ファセットを使用して、これらの設定を表示します。

[強制的に暗号化]

可能な値は、 [はい][いいえ] です。 チャネル バインドを使用するには、[ Force Encryption]\(暗号化の強制 \ ) を [はい] に設定します。すべてのクライアントが暗号化する必要があります。 [いいえ] の場合は、サービス バインドのみが保証されます。 [強制的に暗号化] は、SQL Server 構成マネージャーの [MSSQLSERVER のプロトコルのプロパティ] ([フラグ] タブ) にあります。 SQL Server 2022 (16.x) 以降では、TDS 8.0 を使用して保護を強化するために[Force Strict Encryption]\(厳密な暗号化の強制\) を [はい] に設定することもできます。 詳細については、「接続を暗号化するために SQL Server データベース エンジンを構成する」を参照してください。

拡張保護で使用する場合は、[暗号化の強制] を [はい] に設定します。

拡張保護

選択できる値は、 [オフ][許可] 、および [必須] です。 拡張保護変数を使用して、各SQL Server インスタンスの拡張保護レベルを設定します。 拡張保護は、SQL Server 構成マネージャーの MSSQLSERVER プロパティのプロトコル ([詳細設定] タブ) にあります。

  • [ オフ ] に設定すると、拡張保護が無効になります。 SQL Server のインスタンスは、クライアントが保護されているかどうかに関係なく、任意のクライアントからの接続を許可します。 オフ は、古いオペレーティング システムやパッチが適用されていないオペレーティング システムと互換性がありますが、安全性は低くなります。 この設定は、クライアント オペレーティング システムが拡張保護をサポートしていない場合に使用します。

  • 拡張保護をサポートするオペレーティング システムからの接続に拡張保護を要求するには、[ 許可] に設定します。 拡張保護は、拡張保護をサポートしていないオペレーティング システムからの接続では無視されます。 保護されたクライアント オペレーティング システムで実行されている保護されていないクライアント アプリケーションからの接続は拒否されます。 この設定は オフよりも安全ですが、最も安全ではありません。 混合環境では、この設定を使用します。 一部のオペレーティング システムでは拡張保護がサポートされ、サポートされていないオペレーティング システムもあります。

  • 保護されたオペレーティング システム上の保護されたアプリケーションからの接続のみを受け入れるには、[ 必須 ] に設定します。 この設定は最も安全ですが、拡張保護をサポートしていないオペレーティング システムまたはアプリケーションからの接続は、SQL Serverに接続できません。

推奨設定の詳細については、「 拡張保護による暗号化を有効にする」を参照してください。

承認された NTLM SPN

複数の SPN がサーバーを認識している場合は、Accepted NTLM SPN 変数を指定します。 クライアントがサーバーが認識していない有効な SPN を使用してサーバーに接続しようとすると、サービス バインドは失敗します。 この問題を回避するには、Accepted NTLM SPN を使用してサーバーを表す複数 の SPN を指定します受け入れ可能な NTLM SPN は、セミコロンで区切られた一連の SPN です。 たとえば、 MSSQLSvc/ HostName1.Contoso.com および MSSQLSvc/ HostName2.Contoso.comという SPN を許可するには、 [承認された NTLM SPN] ボックスに「 MSSQLSvc/HostName1.Contoso.com;MSSQLSvc/HostName2.Contoso.com 」と入力します。 変数の最大長は 2048 文字です。 [許可された NTLM SPN] はSQL Server 構成マネージャーの [MSSQLSERVER プロパティのプロトコル] ([詳細設定] タブ) にあります。

データベース エンジンの拡張保護を有効にする

拡張保護を使用するには、サーバーとクライアントの両方に、拡張保護をサポートするオペレーティング システムがあり、オペレーティング システムで有効にする必要があります。 オペレーティング システムの拡張保護を有効にする方法の詳細については、「 認証の拡張保護」を参照してください。

サポートされているすべてのバージョンのWindowsでは拡張保護NTLMv2 が既定で有効になっていますが、SQL Server接続に対して拡張保護は既定では有効になっていません。 SQL Server 構成マネージャーで手動で有効にする必要があります。

SQL Server接続に対して拡張保護を有効にするには、管理者は SQL Server 構成マネージャー で設定を構成する必要があります。 この構成には、さまざまな種類の認証リレー攻撃を軽減するためのサービス バインドとチャネル バインドのオプションが含まれています。 詳細な手順については、拡張保護の構成に関するSQL Serverドキュメントを参照してください。

拡張保護を使用して暗号化を有効にする

適用対象: SQL Server

Windows 認証を使用するときにセキュリティを強化するには、SQL Server 構成マネージャーで [拡張保護] を [必須] に設定し、[暗号化を強制する] を [はい] に設定します。

これらの設定は、SQL Serverの最も安全な構成を提供します。

Note

SQL Server 2022 (16.x) 以降のバージョンでは、Force Encryption ではなく Force Strict Encryption使用して、TDS 8.0 を介してより強力なセキュリティを有効にします。

これらの変更に合わせて 接続文字列 を更新します。

詳細については、以下を参照してください:

拡張保護を有効にした後

サーバー コンピューターで 拡張保護 を有効にした後、次の手順に従って 拡張保護を有効にします。

  1. Windowsスタート メニューからSQL Server 構成マネージャーに移動します。

  2. SQL Server Network Configuration を展開し、次に <InstanceName> のプロトコル を右クリックします。 [プロパティ] を選択します。

  3. [ 詳細設定 ] タブで、[ 拡張保護 ] をチャネル バインドとサービス バインドの両方の適切な設定に設定します。

  4. 必要に応じて、[設定] セクションの説明に従って、複数の SPN がサーバーを認識している場合は、[詳細設定] タブの [Accepted NTLM SPN] フィールドを構成します。

  5. チャネル バインドの場合、[ フラグ ] タブで[ 暗号化の強制 ] を [はい] に設定します。 この設定をお 勧めします

  6. データベース エンジン サービスを再起動します。

その他の SQL Server コンポーネントを構成する

Reporting Services を構成する方法の詳細については、「Reporting Services を使用した 認証の拡張保護」を参照してください。

IIS を使用して HTTP または HTTPS 接続で Analysis Services データにアクセスする場合、Analysis Services は IIS によって提供される拡張保護を利用できます。 拡張保護を使用するように IIS を構成する方法の詳細については、「 IIS 7.5 における拡張保護の構成」を参照してください。

接続文字列の例

次の C# の例では、接続文字列は Windows 認証 (Integrated Security=true) を使用しています。 チャネル バインド トークンは、TLS 暗号化 (Encrypt=true) によって有効になります。 証明書の検証は、 TrustServerCertificate=falseで適用されます。 必須ではありませんが、 HostNameInCertificate をお勧めします。この例には含まれています。

using (var conn = new SqlConnection(
    "Server=sql01.contoso.com;" +
    "Database=AdventureWorks2025;" +
    "Integrated Security=true;" +        
    "Encrypt=true;" +                   
    "TrustServerCertificate=false;" +    
    "HostNameInCertificate=sql01.contoso.com;")) 
{
    conn.Open();
}