このページでは、すべての接続が暗号化されるようにインスタンスに SSL / TLS 暗号化を適用する方法について説明します。また、Cloud SQL でセルフマネージド SSL / TLS 証明書を使用して Cloud SQL インスタンスに安全に接続する方法についても説明します。
概要
Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書が自動的に作成されます。すべての接続で SSL / TLS を使用することをおすすめします。
SQL Server は、暗号化された接続が必要であるとクライアント リクエストで明示的に指定された場合にのみ、証明書の検証を行います。この場合、サーバー証明書をクライアント マシンにインストールする必要があります。それ以外の場合、クライアントは接続文字列や証明書を変更せずに接続できます。sslMode
を ENCRYPTED_ONLY
に設定するようにインスタンスを構成しても同様です。詳細については、SQL Server ドキュメントのデータベース エンジンへの暗号化された接続を有効にするをご覧ください。
インスタンスに SSL を適用する場合、インスタンスの再起動が必要になります。SSL/TLS 証明書を変更した後に再起動が必要になることもあります。再起動が必要になると、Cloud SQL はインスタンスを自動的に再起動します。インスタンスを再起動するとダウンタイムが発生する可能性があります。SSL / TLS 暗号化を適用する
SSL モードの設定を使用して、次の方法で SSL 暗号化を適用できます。
非 SSL / 非 TLS 接続と SSL / TLS 接続の両方を許可します。これがデフォルトです。
SSL / TLS で暗号化された接続のみを許可します。
Cloud SQL インスタンスで [非 SSL / 非 TLS 接続と SSL / TLS 接続を許可する] を選択すると、SSL / TLS 接続に加えて、暗号化されておらず安全性の低い接続も承認されます。 すべての接続で SSL / TLS を必須としていない場合は、暗号化されていない接続が許可されます。このため、パブリック IP を使用してインスタンスにアクセスする場合は、すべての接続に SSL を適用することを強くおすすめします。
SSL / TLS 証明書を使用してインスタンスに直接接続することも、Cloud SQL Auth Proxy または Cloud SQL コネクタを使用して接続することもできます。 Cloud SQL Auth Proxy または Cloud SQL コネクタを使用して接続する場合、接続は SSL / TLS で自動的に暗号化されます。Cloud SQL Auth Proxy と Cloud SQL コネクタでは、SSL モードの設定に関係なく、クライアント ID とサーバー ID も自動的に検証されます。
SSL を適用すると、すべての接続が暗号化されます。SSL/TLS の要求を有効にするには、次の操作を行います。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- 次のいずれかを選択します。
- 暗号化されていないネットワーク トラフィックを許可する(非推奨)
- SSL 接続のみを許可する。このオプションは、SSL / TLS 暗号化を使用する接続のみを許可します。
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
SSL_ENFORCEMENT_MODE は、次のいずれかのオプションに置き換えます。
ALLOW_UNENCRYPTED_AND_ENCRYPTED
は、非 SSL / 非 TLS 接続と SSL / TLS 接続を許可します。これがデフォルト値です。ENCRYPTED_ONLY
は、SSL / TLS で暗号化された接続のみを許可します。
Terraform
SSL / TLS 暗号化を適用するには、Terraform リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行う必要があります。
terraform init
必要に応じて、最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行し、プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」のメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行し、プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
以前に Terraform 構成で適用されたリソースを削除するには、次のコマンドを実行して、プロンプトに「
yes
」と入力します。terraform destroy
REST v1
-
リクエストのデータを使用する前に、次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- SSL_ENFORCEMENT_MODE: 以下のいずれかの方法を選択します。
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: 非 SSL / 非 TLS 接続と SSL / TLS 接続を許可します。ENCRYPTED_ONLY
: SSL / TLS で暗号化された接続のみを許可します。
- INSTANCE_ID: インスタンス ID
HTTP メソッドと URL:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
リクエストの本文(JSON):
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
REST v1beta4
-
リクエストのデータを使用する前に、次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- SSL_ENFORCEMENT_MODE: 以下のいずれかの方法を選択します。
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: 非 SSL / 非 TLS 接続と SSL / TLS 接続を許可します。ENCRYPTED_ONLY
: SSL / TLS で暗号化された接続のみを許可します。
- INSTANCE_ID: インスタンス ID
HTTP メソッドと URL:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
リクエストの本文(JSON):
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
サーバー証明書
Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書が自動的に作成されます。サーバー証明書が有効である限り、お客様が積極的にサーバー証明書を管理する必要はありません。Cloud SQL では、2 つの異なる認証局(CA)階層から選択できます。選択した CA 階層が、インスタンスのサーバー CA モードになります。インスタンスのサーバー CA モードとしてインスタンスごとの CA を使用している場合、サーバー証明書の有効期限は 10 年です。インスタンスのサーバー CA モードとして共有 CA を使用している場合(プレビュー)、サーバー証明書の有効期限は 1 年です。有効期限が切れると、サーバー証明書は無効になり、クライアントはその証明書を使用してインスタンスに安全な接続を確立できなくなります。クライアントが CA の検証またはサーバー証明書のホスト名の検証を構成している場合、期限切れのサーバー証明書を持つ Cloud SQL インスタンスへのクライアントの接続は失敗します。クライアント接続の中断を防ぐため、証明書の有効期限が切れる前にサーバー証明書をローテーションします。サーバー証明書の有効期限が近づくと、繰り返し通知されます。通知は、有効期限の 90 日前、30 日前、10 日前、2 日前、前日に送信されます。
サーバー証明書に関する情報(作成日時や有効期限など)を取得できます。有効期限が切れる前に、新しい証明書を手動で作成できます。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- [サーバー証明書の管理] セクションに移動します。
サーバー証明書の有効期限はテーブルに表示されています。
gcloud
自己署名サーバー証明書を使用するインスタンス(インスタンスごとの CA)の場合:
- サーバー証明書に関する情報を取得するには、sql ssl server-ca-certs list コマンドを使用します。
gcloud sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- サーバー証明書を作成するには、sql ssl server-ca-certs create コマンドを使用します。
gcloud sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- ローカル PEM ファイルに証明書情報をダウンロードします。
gcloud sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- ダウンロードしたファイルをクライアント ホストマシンにコピーすることにより既存の
server-ca.pem
ファイルを置き換え、すべてのクライアントが新しい情報を使用するように更新します。
共有 CA によって発行されたサーバー証明書を使用するインスタンスの場合(プレビュー):
- サーバー証明書に関する情報を取得するには、beta sql ssl server-certs list コマンドを使用します。
gcloud beta sql ssl server-certs list \ --instance=INSTANCE_NAME
- サーバー証明書を作成するには、beta sql ssl server-certs create コマンドを使用します。
gcloud beta sql ssl server-certs create \ --instance=INSTANCE_NAME
- ローカル PEM ファイルに証明書情報をダウンロードします。
gcloud beta sql ssl server-certs list \ --format="value(ca_cert.cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- ダウンロードしたファイルをクライアント ホストマシンにコピーすることにより既存の
server-ca.pem
ファイルを置き換え、すべてのクライアントが新しい情報を使用するように更新します。
Terraform
サーバー証明書の情報を出力として指定するには、Terraform データソースを使用します。
- Terraform 構成ファイルに以下を追加します。
data "google_sql_ca_certs" "ca_certs" { instance = google_sql_database_instance.default.name } locals { furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0] latest_ca_cert = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time] } output "db_latest_ca_cert" { description = "Latest CA certificate used by the primary database server" value = local.latest_ca_cert sensitive = true }
server-ca.pem
ファイルを作成するには、次のコマンドを実行します。terraform output db_latest_ca_cert > server-ca.pem
暗号化された接続を使用する
詳しくは、SQL Server での暗号化された接続の使用方法をご覧ください。
サーバー ID の確認について
サーバー ID の検証は、Cloud SQL インスタンスのサーバー 認証局(CA)階層の構成によって異なります。
インスタンスがインスタンスごとの CA を使用するように構成されている場合、各インスタンスに一意の CA があるため、CA を検証するとサーバーの ID も検証されます。
インスタンスが共有 CA を使用するように構成されている場合(プレビュー版)、サーバー CA はインスタンス間で共有されるため、サーバー ID の検証には CA の検証とともにホスト名の検証が必要です。
インスタンスごとの CA がある場合、Private Service Connect インスタンスに対して DNS 名ベースのサーバー ID 検証のみを実行できます。
共有 CA(プレビュー)がある場合は、Private Service Connect、プライベート サービス アクセス、パブリック IP インスタンスなど、すべてのタイプのインスタンスに対して DNS 名ベースのサーバー ID 検証を実行できます。
Cloud SQL インスタンスに構成されている CA 階層は、インスタンスの詳細を表示することで確認できます。
詳細については、インスタンス情報を表示するまたは次のセクションのサーバー ID の確認を有効にするをご覧ください。
サーバー ID の確認を有効にする
Cloud SQL インスタンスのサーバー CA モードとして共有 CA を選択する場合(プレビュー版)は、サーバー ID の検証も有効にすることをおすすめします。サーバー CA モードとして共有 CA を使用するインスタンスには、サーバー証明書のサブジェクト代替名(SAN)フィールドにインスタンスの DNS 名が含まれています。この DNS 名は、インスタンス ルックアップ API を使用して取得し、そのレスポンスをサーバー ID の検証用のホスト名として使用します。DNS 名の DNS 解決を設定する必要があります。
サーバー ID の確認を有効にするには、次の手順を完了します。
DNS 名を取得します。
Cloud SQL インスタンスの概要情報(インスタンスの DNS 名など)を表示するには、
gcloud sql instances describe
コマンドを使用します。gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
次のように置き換えます。
- INSTANCE_NAME: Cloud SQL インスタンスの名前
- PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
レスポンスに DNS 名が表示されていることを確認します。この名前には、次のようなパターンがあります。
INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
次に例を示します。
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.
DNS ゾーンに DNS レコードを作成します。非公開で接続する場合は、対応する Virtual Private Cloud(VPC)ネットワークの限定公開 DNS ゾーンに DNS レコードを作成します。
Cloud SQL for SQL Server インスタンスに接続する場合は、DNS 名または IP アドレスをホスト名として構成します。次に、
sqlcmd
に-N
フラグを指定するか、SSMS の [Encrypt Connection/Encryption] オプションを選択して、サーバー ID の検証を有効にします。他の SQL Server ドライバにも同様のフラグまたは構成があります。
次のステップ
- Cloud SQL インスタンスで SSL / TLS を管理する。
- Google Cloud での暗号化の処理方法について詳細を確認する。