次の方法で共有


接続を暗号化するために SQL Serverデータベース エンジンを構成する

適用対象: SQL Server - Windows のみ

SQL Server へのすべての受信接続を暗号化することも、特定のクライアント セットに対して暗号化を有効にすることもできます。 これらのいずれのシナリオの場合も、サーバー コンピューターまたはクライアント コンピューターでデータを暗号化するための追加の手順を実行する前に、まず、SQL Server の証明書要件満たす証明書を使用するように SQL Server を構成する必要があります。

Note

この記事は SQL Server on Windows に適用されます。 接続の暗号化のために SQL Server on Linux を構成するには、「TLS 設定を指定する」を参照してください。

この記事では、証明書を使用するように SQL Server を構成する方法 (手順 1) と、SQL Server インスタンスの暗号化設定を変更する方法 (手順 2) について説明します。 パブリック商用機関発行の証明書を使用する場合、SQL Server へのすべての受信接続を暗号化するには、両方の手順を行う必要があります。 その他のシナリオについては、「SQL Server への接続を暗号化するための特殊なケース」を参照してください。

手順 1: 証明書を使用するように SQL Server を構成する

SQL Server の証明書要件」で説明されている証明書を使用するように SQL Server を構成するには、次の手順に従います。

  1. SQL Server を実行しているコンピューターに証明書をインストールします。
  2. インストールされた証明書を使用するように SQL Server を構成します。

SQL Server コンピューターでアクセスできる SQL Server 構成マネージャーのバージョンに応じて、次のいずれかの手順を使用して、SQL Server インスタンスをインストールして構成します。

SQL Server 2019 以降のバージョンのSQL Server 構成マネージャーを持つコンピュータ

SQL Server 2019 (15.x) 以降のバージョンでは、証明書の管理が SQL Server 構成マネージャーに統合され、以前のバージョンの SQL Server で使用することができます。 単一の SQL Server インスタンス、フェールオーバー クラスター構成、または可用性グループ構成に証明書を追加するには、「証明書の管理 (SQL Server 構成マネージャー)」を参照してください。 構成マネージャーを使用すると、証明書のインストールと、インストールされた証明書を使用するための SQL Server の構成をわずか数ステップで処理できるため、証明書の管理が大幅に簡素化されます。

証明書は、コンピューター上のユーザーにローカルに格納されます。 SQL Server で使用する証明書をインストールするには、ローカル管理者特権を持つアカウントで SQL Server 構成マネージャーを実行している必要があります。

SQL Server 2019 (15.x) 以降のバージョンの Express Edition を一時的にインストールして、統合証明書管理をサポートする SQL Server 構成マネージャーをすることができます。

SQL Server 2017 以前のバージョンのSQL Server 構成マネージャーを持つコンピュータ

SQL Server 2017 (14.x) 以前のバージョンを使用しており、SQL Server 2019 (15.x) 用の SQL Server 構成マネージャーを使用できない場合、次の手順に従って SQL Server コンピューターに証明書をインストールして構成します。

  1. [スタート] メニューの [ファイル名を指定して実行] を選択し、[名前] ボックスに「MMC」と入力して [OK] を選択します。
  2. MMC コンソールの [ファイル] メニューで、[スナップインの追加と削除...] を選択します。
  3. [スナップインの追加と削除] ダイアログ ボックスで、[証明書] を選択し、[追加] を選択します。
  4. [証明書スナップイン] ダイアログ ボックスで、[コンピューター アカウント] を選択し、[次へ]>[完了] の順に選択します。
  5. [スナップインの追加と削除] ダイアログ ボックスで、 [OK] を選択します。
  6. MMC コンソールで、[証明書 (ローカル コンピューター)]>[個人用] の順に展開し、[証明書] を右クリックし、[すべてのタスク] をポイントして、[インポート] を選択します。
  7. [証明書のインポート ウィザード] を完了して証明書をコンピューターに追加します。
  8. MMC コンソールで、インポートされた証明書を右クリックし、[すべてのタスク] をポイントし、[秘密キーの管理] を選択します。 [セキュリティ] ダイアログ ボックスで、SQL Server サービス アカウントが使用するユーザー アカウントに読み取りアクセス許可を追加します。
  9. SQL Server 構成マネージャーで、[SQL Server ネットワーク構成] を展開し、[<サーバー インスタンス> のプロトコル] を右クリックし、[プロパティ] を選択します。
  10. [<インスタンス名> のプロトコルのプロパティ] ダイアログ ボックスの [証明書] タブで、[証明書] ボックスのドロップダウン リストから目的の証明書を選択し、[OK] を選択します。
  11. SQL Server へのすべての接続を暗号化する必要がある場合は、「手順 2: SQL Server で暗号化設定を構成する」を参照してください。 特定のクライアントに対してのみ暗号化を有効にする場合は、「SQL Server への接続を暗号化するための特殊なケース」を参照してください。

Note

可用性グループ構成に証明書をインストールするには、プライマリ ノードを始めとして、可用性グループ内の各ノードで前の手順を繰り返します。

重要

SQL Server サービス アカウントには、SQL Server インスタンスで暗号化を強制するために使用される証明書の読み取りアクセス許可が必要です。 特権のないサービス アカウントの場合、読み取りアクセス許可を証明書に追加する必要があります。 この操作に失敗すると、SQL Server サービスを再起動できなくなる可能性があります。

フェールオーバー クラスター インスタンスの場合の追加手順

SQL Server で接続の暗号化に使用される証明書は、次のレジストリ キーで指定されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\SuperSocketNetLib\Certificate

このキーには、サムプリントと呼ばれる証明書のプロパティが含まれます。これは、サーバー内の各証明書を識別します。 クラスター化環境では、ストア内に正しい証明書が存在する場合でも、このキーは Null に設定されます。 この問題を解決するには、各ノードに証明書をインストールした後、各クラスター ノードで次の追加手順を実行する必要があります。

  1. 完全修飾ドメイン名 (FQDN) 証明書が格納されている証明書ストアに移動します。 証明書のプロパティ ページで、[詳細] タブに移動し、証明書のサムプリント値を [メモ帳] ウィンドウにコピーします。

  2. [メモ帳] で、サムプリント値の 16 進文字間のスペースを削除します。

  3. レジストリ エディターを起動し、次のレジストリ キーに移動して、手順 2 の値を貼り付けます。

    HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib\Certificate

  4. 現在 SQL 仮想サーバーがこのノード上にある場合、クラスター内の別のノードにフェールオーバーし、レジストリの変更が発生したノードを再起動します。

  5. すべてのノードで、この手順を繰り返します。

警告

レジストリを誤って編集すると、システムに重大な障害が発生する場合があります。 レジストリを変更する前に、コンピューター上の重要なデータをすべてバックアップすることをお勧めします。

注意

SQL Server 2008 R2 (10.50.x) および SQL Server 2008 R2 (10.50.x) Native Client (SNAC) では、ワイルドカード証明書がサポートされます。 その後、SNAC は廃止され、Microsoft OLE DB Driver for SQL ServerMicrosoft ODBC Driver for SQL Server に置き換わりました。 他のクライアントでは、ワイルドカード証明書がサポートされていない可能性があります。

SQL Server 構成マネージャーを使用してワイルドカード証明書を選択することはできません。 ワイルドカード証明書を使うには、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer\SuperSocketNetLib のレジストリ キーを編集し、Certificate の値に証明書の拇印を (スペースを含めずに) 入力する必要があります。

Note

フェールオーバー クラスターで暗号化を使用する場合、フェールオーバー クラスター内のすべてのノードに対して、仮想サーバーの完全修飾 DNS 名を使用してサーバー証明書をインストールする必要があります。 [SQL Server ネットワークの構成][virtsql のプロトコル] プロパティ ボックスの [強制的に暗号化] オプションを [はい] に設定します。

Azure 仮想マシン上の SQL Server に対する Azure Search インデクサーの暗号化された接続を作成する場合は、「Azure 仮想マシン上の SQL Server インスタンスへのインデクサー接続」を参照してください。

手順 2: SQL Server で暗号化設定を構成する

次の手順は、すべてのクライアントに対して暗号化された通信を強制する場合にのみ必要です。

  1. SQL Server 構成マネージャーで、[SQL Server ネットワーク構成] を展開し、[<サーバー インスタンス> のプロトコル] を右クリックし、[プロパティ] を選択します。
  2. [フラグ] タブの [ForceEncryption] ボックスの一覧の [はい] を選択し、[OK] を選択してダイアログ ボックスを閉じます。
  3. SQL Server サービスを再起動します。

Note

一部の証明書シナリオでは、クライアントとサーバーの間で暗号化された接続を確保するために、クライアント コンピューターとクライアント アプリケーションで追加の手順を実装することが必要な場合があります。 詳細については、「SQL Server への接続を暗号化するための特殊なケース」を参照してください。

詳細情報

ログイン パケット暗号化とデータ パケット暗号化

SQL Server クライアント アプリケーションと SQL Server との間のネットワーク トラフィックのパケットは、資格情報パケット (ログイン パケット) とデータ パケットの 2 種類に大別されます。 (サーバー側またはクライアント側のいずれかで) 暗号化を構成すると、これらの両方の種類のパケットが暗号化されます。 ただし、暗号化を構成しない場合でも、クライアント アプリケーションを SQL Server に接続するときに送信される資格情報 (ログイン パケット内) は常に暗号化されます。 SQL Server は、信頼できる証明機関から発行され、証明書要件を満たす証明書を使用します (使用可能な場合)。 この証明書は、この記事で前述した手順のいずれかを使用してシステム管理者が手動で構成したもの、または SQL Server コンピューター上の証明書ストアにあるもののいずれかになります。

SQL Server で生成された自己署名証明書

SQL Server は、信頼できる証明機関からの証明書を使用して (使用可能な場合)、ログイン パケットを暗号化します。 信頼できる証明書がインストールされていない場合、SQL Server は起動時に、自己署名証明書 (フォールバック証明書) を生成し、その自己署名証明書を使用して資格情報を暗号化します。 この自己署名証明書はセキュリティの強化に役立ちますが、サーバーによる ID スプーフィングから保護することはできません。 自己署名証明書を使用し、[ForceEncryption] オプションの値を [はい] に設定すると、SQL Server とクライアント アプリケーションとの間でネットワークを介して送信されるデータはすべて、自己署名証明書を使用して暗号化されます。

自己署名証明書を使用する場合、SQL Server は次のメッセージをエラー ログに記録します。

自動生成された証明書が暗号化用に正常に読み込まれました。

SQL Server 2016 (13.x) 以前のバージョンでは、SHA1 アルゴリズムが使用されます。 ただし、SQL Server 2016 (13.x) 以降では、SHA1 アルゴリズムおよび多くの古いアルゴリズムは非推奨になっています。 詳細については、「SQL Server 2016 (13.x) のデータベース エンジンの非推奨の機能」を参照してください。

これらの環境では、ログイン前のハンドシェイク、またはサーバーとクライアント間のすべての通信の暗号化のためだけに、SQL Server によって自動的に生成された自己署名証明書を使用する場合、脆弱性検出ソフトウェア、セキュリティ ソフトウェア、または会社のポリシーによって、この使用がセキュリティの問題としてフラグが設定される可能性があります。 これらのシナリオについては、次のようなオプションがあります。

  • より強力な暗号化アルゴリズムを使用する新しい自己署名証明書またはサードパーティ証明書を作成し、この新しい証明書を使用するように SQL Server を構成します。
  • フラグの理由がわかったので、メッセージを無視することができます (非推奨)。
  • 自己署名証明書により強力なハッシュ アルゴリズム (SHA256) を使用する SQL Server 2017 (14.x) 以降のバージョンにアップグレードします。

SQL Server 用の自己署名証明書を作成するための PowerShell スクリプト

次のコード スニペットを使用して、SQL Server を実行するコンピューターで自己署名証明書を作成できます。 証明書は、スタンドアロンの SQL Server インスタンスの暗号化要件を満たしており、ローカル コンピューターの証明書ストアに保存されます (PowerShell を管理者として起動する必要があります)。

# Define parameters
$certificateParams = @{
    Type = "SSLServerAuthentication"
    Subject = "CN=$env:COMPUTERNAME"
    DnsName = @("{0}" -f [System.Net.Dns]::GetHostByName($env:computerName).HostName, 'localhost')
    KeyAlgorithm = "RSA"
    KeyLength = 2048
    HashAlgorithm = "SHA256"
    TextExtension = "2.5.29.37={text}1.3.6.1.5.5.7.3.1"
    NotAfter = (Get-Date).AddMonths(36)
    KeySpec = "KeyExchange"
    Provider = "Microsoft RSA SChannel Cryptographic Provider"
    CertStoreLocation = "cert:\LocalMachine\My"
}

# Call the cmdlet
New-SelfSignedCertificate @certificateParams

ネットワークの暗号化を確認する

ネットワーク暗号化が構成され、正常に有効化されていることを確認するには、次の Transact-SQL クエリを実行します。

USE [master];
GO

SELECT DISTINCT (encrypt_option)
FROM sys.dm_exec_connections
WHERE net_transport <> 'Shared memory';
GO

encrypt_option は、この接続に対して暗号化が有効になっているかどうかを示すブール値です。 値が TRUE の場合、接続は安全に暗号化されます。 値が FALSE の場合、接続は暗号化されません。

アクセス許可を持つ SQL Server 証明書の動作

以下の条件がすべて満たされている場合、SQL Server サービスは証明書を自動的に検出して暗号化に使用します。

  • 証明書には、マシンの FQDN などサブジェクトがあります
  • 証明書をローカル・コンピュータの証明書ストアにインストールする。
  • SQL Server サービス アカウントには、証明書の秘密キーへのアクセス権を付与します

この使用は、SQL Server 構成マネージャーで証明書が選択されていなくても発生します。

この動作をオーバーライドするには次のようにします。

  • SQL Server 構成マネージャーで使用する別の証明書を構成します

    または

  • 望ましくない証明書に対する SQL Server サービス アカウントのアクセス許可を削除します