Amazon Web Services ブログ
AWS Certificate Manager プライベート認証機関を使用して Microsoft SQL Server への SSL 暗号化接続を有効にする
重要なデータを保護するために対策を取っている組織は、保管中も転送中も心配が尽きません。リレーショナルデータベースは、ビジネスに不可欠なデータを保護する必要がある状況のよくある例です。Microsoft SQL Server では、Secure Sockets Layer (SSL) 暗号化を使用して転送中のデータを保護できます。
この記事では、AWS Certificate Manager (ACM) および AWS Certificate Manager Private Certificate Authority (ACM プライベート CA) を使用して、SQL Server 接続の SSL 暗号化を有効にするプロセスを説明します。
SQL Server の SSL 暗号化オプションの説明
Microsoft SQL Server は、接続の暗号化を有効にする次の 2 つのメカニズムがあります。
- すべてのクライアントからの暗号化を強制する
- サーバーからの暗号化を強制する
クライアントとサーバー間の安全な接続を確保するには、暗号化された接続を要求するようにクライアントを設定します。これにより、クライアントが SQL Server を実行しているサーバーに接続する前に、サーバーが提示した証明書を検証します。
Force Server Encryption オプションを使用することもできます。ただし、このオプションを単独で使用すると、クライアントが証明書を検証せずに暗黙的に信頼するため、中間者攻撃に対して脆弱になります。
この記事では、最初のオプションについてのみ説明します。
ACM ルート CA とプライベート CA の概要
ACM プライベート CA は、ACM 証明書管理をプライベート証明書に拡張し、1 つのコンソールでパブリック証明書とプライベート証明書を管理できるようにします。これは、認証機関インフラストラクチャとプライベート証明書を簡単かつ安全に管理するマネージド型プライベート認証機関 (CA) サービスです。ACM プライベート CA は、独自の認証機関を運用するための投資およびメンテナンスコストなしで、可用性の高いプライベート CA サービスを提供します。
前提条件
Windows Server マシンに OpenSSL がインストールされていることを確認してください。また、OpenSSL 実行可能ファイルが PATH 環境変数に追加されていることを確認してください。
ソリューションを実装する手順
ACM と ACM プライベート CA を使用して、SQL Server 接続の SSL 暗号化を有効にするには、次の手順に従います。
ルート CA を作成する
次の手順に従って、ルート CA を作成します。
- Certificate Manager を開く
- 次のスクリーンショットに示すように、左側のナビゲーションペインの [Private certificate authority] で、[Private CAs]、[Create CA] を選択します。
- 次のスクリーンショットに示すように、[Select the Authority (CA) type] で、[Root CA] を選択してから、[Next] を選択します。
- [Configure the certificate authority (CA) name] ダイアログのフィールドに入力します。次のスクリーンショットは、test.db のルート CA を作成するための値を示しています。
この例では次の値を使用します。
– 組織 (O): testdb
– 組織単位 (OU): dbaCountry
– 名前 (C): United States
– 州または県の名前: TX
– 地域名: DL
– 共通名 (CN): test.db
- 画面の残りのデフォルト値はそのままにします。[Confirm] と [Create] を選択します。次の画面に成功メッセージが表示されます。[Get started] を選択して、ルート CA 証明書をインストールします。
- 次のスクリーンショットに示すように、ルート CA に対して [Install] を選択し、デフォルト値を保持して、[Next] を選択します。
- 次の画面で [Confirm and install] を選択します。次の画面に成功メッセージが表示されます。
これで、ルート CA が正常に作成されました。この例では、ルート CA を使用して証明書を発行します。
ルートにチェーンする下位 CA からクライアントとサーバーを識別する証明書を発行することがベストプラクティスです。この記事の例では、簡単にするために、ルート CA を使用して証明書を発行します。この例で作成されたルート CA にチェーンする中間 Windows 認証機関など、少なくとも 2 レベルの CA 階層が推奨されます。
ルート CA を使用してサーバー証明書を発行する
次の手順に従って、ルート CA を使用してサーバー証明書を発行します。
- ACM は、作成したばかりの CA を使用してキーペアと証明書を生成します。開始するには、コンソールのホームに戻ります。次のスクリーンショットに示すように、左側のナビゲーションペインで Certificate Manager を見つけ、[Request a certificate] を選択します。
- 作成したばかりのルート CA (test.db) を選択します。
- 次のスクリーンショットに示すように、ドメイン名を追加します。SSL 証明書を生成しようとしている SQL Server の完全修飾ドメイン名 (FQDN) を使用してください。
- [Confirm and request] を選択します。
これでプライベート証明書が発行され、次のスクリーンショットに示す成功メッセージが表示されます。
SSL 証明書をインポートして SQL Server にインストールします
次の手順に従って、SSL 証明書をインポートしてインストールします。
- サーバー (SQL Server マシン) にログオンします。
- サーバーに c:\certs という名前のフォルダを作成します。このフォルダを使用して、証明書とキーを保存します。
- ブラウザを使用して、コンソールのホームに戻ります。左側のナビゲーションページで、[Certificate Manager] をクリックします。
- 適切な証明書を選択し、[Actions]、[Export] をクリックします。
- 次のスクリーンショットに示すように、パスフレーズを入力して PEM エンコーディングを生成します。
- 次の画面で証明書本文とプライベートキーをダウンロードします。証明書本文の名前は certificate.txt で、プライベートキーの名前は private_key.txt です。両方のファイルを c:\certs に保存します。
- SQL Server で発行された証明書を使用する前に、次の OpenSSL コマンドを使用して作成したプライベートキーと証明書を組み合わせる必要があります。
C:\certs>openssl pkcs12 -export -out sqldb1.pfx -inkey private_key.txt -in certificate.txt
- 作成したパスフレーズを入力します。
- admin コマンドプロンプトを開き、次のコマンドを実行します。これにより、Windows 個人証明書ストアに証明書がインポートされます。
C:\certs>certutil -f -p <password> -importpfx "c:\certs\sqldb1.pfx"
SQL Server マシンにルート証明書をインポートします
次の手順に従って、ルート証明書をインポートします。
- ブラウザを使用して、コンソールのホームに戻ります。左側のナビゲーションペインで、[Certificate Manager] を選択します。
- [Private CA] を選択します。作成した test.db ルート CA を選択します。[CA Certificate] を選択します。
- 証明書本文までスクロールします。次のスクリーンショットに示すように、[Export Certificate body] を選択します。これにより、certificate.pem という名前のファイルが Downloads フォルダにダウンロードされます。
- certificate.pem の名前を cacert.pem に変更し、c:\certs フォルダにコピーします。
- 証明書は、base64 でエンコードされた PEM 形式です。次の OpenSSL コマンドを使用して、DER 形式に変換します。
C:\certs>openssl.exe x509 -outform der -in cacert.pem -out cacert.cer
- admin コマンドプロンプトから次のコマンドを実行して、証明書を Windows ルート証明書ストアにインポートします。
C:\certs>certutil –f -addstore Root "c:\certs\cacert.cer"
サーバーで SQL Server の設定を変更する
サーバーの設定を変更するには、次の手順に従います。
- [Start]、[Run] を選択し、msc と入力します。これにより、ローカルコンピューターの ACM mmc スナップインが開きます。
- [Personal]、[Certificates] を選択します。右側のペインで、インポートされた証明書を選択して右クリックします。この証明書は、このソリューションの前の手順でインポートされました。
- [All tasks]、[Manage private keys] を選択します。次のスクリーンショットに示すように、アクセス許可ボックスで、SQL Server サービスアカウントの読み取りアクセス許可を追加します。
- [Start]、[Microsoft SQL Server <version>]、[SQL Server <version> configuration manager] を開きます。
- SQL Server ネットワーク設定を展開します。Protocols では、SQL Server 名のコンテキスト (右クリック) メニューを開き、[Properties] を選択します。
- [Certificate] を選択し、証明書を選択します。[OK] を選択します。この証明書は接続の暗号化に使用します。
- [Restart] をクリックして、SQL Server サービスを再起動します。
クライアントマシンに証明書をインポートしてインストールする
SQL Server と通信する各クライアントマシンでこれらの手順を繰り返します。これにより、アプリケーションが実行されるクライアントマシンに必要な証明書階層が作成されます。クライアントマシンと SQL Server の間で SSL を使用して接続を保護する必要があります。
- クライアントマシンにログオンします。
- c:\certs という名前のフォルダを作成します。
- SQL Server マシンから sqldbl.pfx および cacert.cer 証明書ファイルをコピーし、クライアントマシンの c:\certs フォルダに貼り付けます。前の手順でこれらのファイルを作成しました。
- admin コマンドプロンプトから次のコマンドを実行して、証明書を Windows ルート証明書ストアにインポートします。
C:\certs>certutil –f -addstore Root "c:\certs\cacert.cer"
- admin コマンドプロンプトを開き、次のコマンドを実行します。これにより、証明書が Windows 個人証明書ストアにインポートされます。
C:\certs>certutil -f -p <password> -importpfx "c:\certs\sqldb1.pfx"
これで、SQL Server との SSL 暗号化接続を確立するために必要なインフラストラクチャが整いました。これにより、クライアントマシンは、作成したルート CA によって発行された証明書を信頼できます。
一般的なクライアント接続のシナリオと設定
以下にリストされているすべてのシナリオは、クライアントマシンにインポートされた証明書があることを前提としています。これをまだ行っていない場合は、前の手順に従ってください。
SSL を使用して SQL Server Management Studio 接続を暗号化する
SQL Server Management Studio 接続を暗号化するには、次の手順を実行します。
- SSMS をダウンロードしてインストールします。
- 次のスクリーンショットに示すように、SSMS を開き、[File]、次に [Connect Object Explorer…] を選択します。
- 次のスクリーンショットに示すように、サーバー名とログインの詳細を入力します。次に、[Options] を選択します。
- [Connection Properties] を選択し、次のスクリーンショットに示すように、[Encrypt connection] チェックボックスがチェックされていることを確認してください。また、[Trust server certificate] チェックボックスの [not] がチェックされていることを確認します。このボックスをチェックすると、クライアントによる証明書の検証がスキップされます。
- [Connect] を選択します。
- 接続中にエラー「The target principal name is incorrect」(ターゲットプリンシパル名が正しくありません) を受け取った場合、証明書で指定されている FQDN を使用していません。接続文字列は、証明書の発行中に指定された名前と同じ名前を使用する必要があります。たとえば、接続に IP アドレスを使用している場合、次のスクリーンショットに示すエラーが表示されます。
- 次のクエリを実行して、暗号化された接続があることを確認します。スクリーンショットに示すように、encrypt_option 列の値は TRUE である必要があります。
クライアントマシンからのすべての SQL Server 接続で暗号化を強制する
すべての SQL Server 接続をクライアントマシンから強制的に暗号化するには、次の手順を実行します。
- [Start]、[Microsoft SQL Server] <version> を選択してから、[SQL Server <version> configuration manager] をクリックします。
WMI エラーが発生した場合は、このガイドを使用して修正します。
- [SQL Server configuration manager] を展開し、[SQL Native Client Configuration] を右クリックして [Properties] を選択します。
- 次のスクリーンショットに示すように、Flags タブで、Force Protocol Encryption の値を Yes に変更します。
- Trust Server Certificate の値は No のままにしてください。
接続文字列パラメータを介してアプリケーション接続を暗号化する
接続文字列パラメータ Encrypt を使用して、クライアントからの SSL 暗号化を有効にできます。
Trust Server Certificate パラメータを使用しないでください。これにより、クライアントは検証なしでサーバーからの証明書を信頼するようになります。
マネージド型証明書の更新
ACM は、Amazon が発行した SSL/TLS 証明書のマネージド型更新を提供しています。可能な場合、ACM はユーザーからのアクションなしで証明書を自動的に更新します。証明書は、発行または最後に更新されてからエクスポートされた後、更新の対象となります。前の手順で証明書をエクスポートしたため、マネージド型自動更新の対象となります。
次のスクリーンショットに示すように、コンソールの Certificate Manager で証明書の Renewal Eligibility ステータスを確認することにより、証明書の更新資格を確認できます。
ACM 管理の更新ワークフローを手動でテストすることもできます。これにより、有効期限が切れると証明書が自動更新されます。
証明書の更新ステータスを確認するには、コンソール、CLI、API、パーソナルヘルスダッシュボードの確認など、さまざまな方法を使用できます。
Amazon CloudWatch イベントを使用して、更新時に証明書をダウンロードするプロセスを自動化することもできます。自動更新後、ACM プライベート CA は CloudWatch 通知を送信します。クライアント側のコードを記述して、更新された証明書とプライベートキーをダウンロードし、アプリケーションにデプロイできます。
まとめ
上記のプロセスを使用して、Windows Server を実行しているサーバー上の他のいくつかのシナリオでプライベート証明書を発行できます。証明書を使用して、クライアント、サーバー、アプリケーション、サービス、デバイス、ユーザーなどのリソースを識別できます。内部 API エンドポイント、ウェブサーバー、VPN ユーザー、IoT デバイスや他の多くのアプリケーションは、プライベート証明書を使用して、安全な運用に必要な暗号化された通信チャネルを確立しています。
著者について
Aditya Samant は、データベースを専門とする アマゾン ウェブ サービス のソリューションアーキテクトです。彼はレトロな技術が好きで、コンピューターゲームをプレイし、家族や友人と余暇を過ごしています。