SQL Server Native Clientでの検証なしの暗号化の使用

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

SQL Server は、常に、ログインに関連するネットワーク パケットを暗号化します。 サーバーの起動時に証明書がサーバーにプロビジョニングされていない場合、SQL Server は、ログイン パケットの暗号化に使用される自己署名証明書を生成します。

自己署名証明書では、セキュリティは保証されません。 暗号化されたハンドシェイクは、NT LAN Manager (NTLM) に基づいています。 セキュリティで保護された接続には、SQL Server で検証可能な証明書をプロビジョニングすることを強くお勧めします。 トランスポート層セキュリティ (TLS) は、証明書の検証によってのみセキュリティで保護することができます。

アプリケーションでは、接続文字列キーワードまたは接続プロパティを使用して、すべてのネットワーク トラフィックの暗号化を要求することもできます。 IDbInitialize::Initialize でプロバイダー文字列を使用する場合、ODBC および OLE DB のキーワードは 、IDataInitialize で初期化文字列を使用する場合は ADO と OLE DB の場合は "データの暗号化を使用する" です。 これは、[プロトコル暗号化の強制] オプションを使用してSQL Server 構成マネージャーし、暗号化された接続を要求するようにクライアントを構成することによっても構成できます。 既定では、接続のネットワーク トラフィックをすべて暗号化するには、証明書をサーバーに提供する必要があります。 クライアントがサーバー上の証明書を信頼するように設定すると、中間者攻撃に対して脆弱になる可能性があります。 検証可能な証明書をサーバーに展開する場合は、証明書の信頼に関するクライアント設定を確実に FALSE に変更してください。

接続文字列キーワードの詳細については、「SQL Server Native Clientでの接続文字列キーワードの使用」を参照してください。

証明書がサーバーにプロビジョニングされていない場合に暗号化を使用できるようにするには、SQL Server 構成マネージャーを使用して、[プロトコル暗号化の強制] オプションと [サーバー証明書の信頼] オプションの両方を設定できます。 このように、検証可能なサーバー証明書がプロビジョニングされていない場合、暗号化には検証を伴わない自己署名入りのサーバー証明書が使用されます。

アプリケーションでは、暗号化が行われることを保証するために "TrustServerCertificate" キーワードまたはそれに関連する接続属性も使用できます。 アプリケーションの設定によって、SQL Server クライアント構成マネージャーで設定されるセキュリティのレベルを緩和することはできません。ただし、厳密にすることはできます。 たとえば、クライアントに [Force Protocol Encryption] オプションが設定されていない場合、アプリケーションから暗号化自体を要求することができます。 サーバー証明書が提供されなかった場合でも暗号化を保証するには、アプリケーションから暗号化と "TrustServerCertificate" を要求できます。 ただし、クライアントの構成で "TrustServerCertificate" が有効になっていない場合は、サーバー証明書を提供する必要があります。 次の表ですべてのケースを説明します。

[プロトコルの暗号化を設定する] クライアント設定 [サーバー証明書を信頼する] クライアント設定 接続文字列/接続属性 Encrypt/Use Encryption for Data 接続文字列/接続属性 Trust Server Certificate 結果
いいえ 該当なし 無効 (既定値) 無視 暗号化は行われません。
いいえ 該当なし はい 無効 (既定値) 暗号化は、検証可能なサーバー証明書が提供されている場合にのみ行われます。それ以外の場合は、接続試行が失敗します。
いいえ 該当なし はい はい 暗号化は常に行われますが、自己署名入りのサーバー証明書を使用することがあります。
はい いいえ 無視 無視 暗号化は、検証可能なサーバー証明書が提供されている場合にのみ行われます。それ以外の場合は、接続試行が失敗します。
はい はい 無効 (既定値) 無視 暗号化は常に行われますが、自己署名入りのサーバー証明書を使用することがあります。
はい はい はい 無効 (既定値) 暗号化は、検証可能なサーバー証明書が提供されている場合にのみ行われます。それ以外の場合は、接続試行が失敗します。
はい はい はい はい 暗号化は常に行われますが、自己署名入りのサーバー証明書を使用することがあります。

注意事項

上の表では、さまざまな構成でのシステムの動作についてのみ説明しています。 セキュリティで保護された接続を実現するには、クライアントとサーバーの両方で暗号化が必要であることを確実にします。 また、確実にサーバーに検証可能な証明書があり、クライアントの TrustServerCertificate 設定が FALSE に設定されているようにします。

SQL Server Native Client OLE DB プロバイダー

SQL Server Native Client OLE DB プロバイダーは、DBPROPSET_SQLSERVERDBINIT プロパティ セットに実装されているSSPROP_INIT_TRUST_SERVER_CERTIFICATE データ ソース初期化プロパティを追加して、検証なしで暗号化をサポートします。 また、新しい接続文字列のキーワードとして "TrustServerCertificate" が追加されました。 "TrustServerCertificate" は、yes または no を値として受け取ります。既定値は no です。 サービス コンポーネントを使用しているときは、"TrustServerCertificate" は true または false を値として受け取ります。既定値は false です。

DBPROPSET_SQLSERVERDBINIT プロパティ セットに行われた機能強化の詳細については、「初期化プロパティと承認プロパティ」を参照してください。

SQL Server Native Client ODBC ドライバー

SQL Server Native Client ODBC ドライバーは、SQLSetConnectAttr 関数と SQLGetConnectAttr 関数に追加して、検証なしで暗号化サポートします。 SQL_TRUST_SERVER_CERTIFICATE_YES または SQL_TRUST_SERVER_CERTIFICATE_NO を受け取る、SQL_COPT_SS_TRUST_SERVER_CERTIFICATE が追加されました。既定値は SQL_TRUST_SERVER_CERTIFICATE_NO です。 また、新しい接続文字列のキーワードとして "TrustServerCertificate" が追加されました。 "TrustServerCertificate" は、"yes" または "no" を値として受け取ります。既定値は "no" です。

参照

SQL Server Native Client の機能