SQL Server Native Clientで検証なしで暗号化を使用する
適用対象: 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 は、常に、ログインに関連するネットワーク パケットを暗号化します。 サーバーの起動時に証明書がサーバーにプロビジョニングされていない場合、SQL Server は、ログイン パケットの暗号化に使用される自己署名証明書を生成します。
自己署名証明書では、セキュリティは保証されません。 暗号化されたハンドシェイクは、NT LAN Manager (NTLM) に基づいています。 セキュリティで保護された接続には、SQL Server で検証可能な証明書をプロビジョニングすることを強くお勧めします。 トランスポート層セキュリティ (TLS) は、証明書の検証によってのみセキュリティで保護することができます。
アプリケーションでは、接続文字列キーワードまたは接続プロパティを使用して、すべてのネットワーク トラフィックの暗号化を要求することもできます。 キーワードは、 IDbInitialize::Initialize でプロバイダー文字列を使用する場合は ODBC および OLE DB の場合は "Encrypt" で、 IDataInitialize で初期化文字列を使用する場合は ADO と OLE DB の場合は "Use Encryption for Data" です。 これは、Force Protocol Encryption オプションを使用してSQL Server 構成マネージャーし、暗号化された接続を要求するようにクライアントを構成することによって構成することもできます。 既定では、接続のネットワーク トラフィックをすべて暗号化するには、証明書をサーバーに提供する必要があります。 クライアントがサーバー上の証明書を信頼するように設定すると、中間者攻撃に対して脆弱になる可能性があります。 検証可能な証明書をサーバーに展開する場合は、証明書の信頼に関するクライアント設定を確実に FALSE に変更してください。
接続文字列キーワードの詳細については、「 SQL Server Native Client での接続文字列キーワードの使用」を参照してください。
証明書がサーバーにプロビジョニングされていない場合に暗号化を使用できるようにするには、SQL Server 構成マネージャーを使用して、Force Protocol Encryption と Trust Server Certificate オプションの両方を設定できます。 このように、検証可能なサーバー証明書がプロビジョニングされていない場合、暗号化には検証を伴わない自己署名入りのサーバー証明書が使用されます。
アプリケーションでは、暗号化が行われることを保証するために "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" です。