SSL / TLS 証明書の構成

このページでは、SSL/TLS を使用するようにインスタンスを構成する方法について説明します。また、Cloud SQL でセルフマネージド SSL / TLS 証明書を使用して Cloud SQL インスタンスに安全に接続する方法についても説明します。

概要

Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書(server-ca.pem)が自動的に作成されます。すべての接続で SSL / TLS を使用することをおすすめします。

SQL Server は、暗号化された接続が必要であるとクライアント リクエストで明示的に指定された場合にのみ、証明書の検証を行います。この場合、サーバー証明書をクライアント マシンにインストールする必要があります。それ以外の場合、クライアントは接続文字列や証明書を変更せずに接続できます。Cloud SQL インスタンスで requireSsl が有効になっている場合も同様です。

詳細については、SQL Server ドキュメントのデータベース エンジンへの暗号化された接続を有効にするをご覧ください。

インスタンスに SSL を適用する場合、インスタンスの再起動が必要になります。SSL/TLS 証明書を変更した後に再起動が必要になることもあります。再起動が必要になると、Cloud SQL はインスタンスを自動的に再起動します。インスタンスを再起動するとダウンタイムが発生する可能性があります。

SSL / TLS 暗号化を適用する

SSL を適用すると、すべての接続が暗号化されます。

SSL/TLS の要求を有効にするには、次の操作を行います。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [接続] をクリックします。
  4. [セキュリティ] タブを選択します。
  5. [SSL 接続のみ許可] をクリックします。

gcloud

  gcloud sql instances patch INSTANCE_NAME \
  --require-ssl
  

Terraform

SSL / TLS 暗号化を適用するには、Terraform リソースを使用します。

resource "google_sql_database_instance" "sqlserver_instance" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      require_ssl = "true"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の手順を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 次のコマンドを実行しています。プロンプトで「yes」と入力して、以前に Terraform 構成で適用されたリソースを削除します。

    terraform destroy

REST v1

  1. リクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID

    リクエストの本文(JSON):

    
    {
      "settings": {
        "ipConfiguration": {"requireSsl": "true"}
      }
    }
    
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

REST v1beta4

  1. リクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID

    リクエストの本文(JSON):

    
    {
      "settings": {
        "ipConfiguration": {"requireSsl": "true"}
      }
    }
    
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

サーバー証明書

Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書が自動的に作成されます。サーバー証明書は、有効な限り、お客様が積極的に管理する必要はありません。ただし、証明書には 10 年間の有効期限があり、期限が切れた証明書は無効になります。無効になると、クライアントは、証明書を使用してインスタンスへの安全な接続を確立できなくなります。サーバー証明書の有効期限が近づくと、繰り返し通知されます。通知は、有効期限の 90 日前、30 日前、10 日前、2 日前、前日に送信されます。

サーバー証明書に関する情報(作成日時や有効期限など)を取得できます。また、新しい証明書を手動で作成することもできます。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [接続] をクリックします。
  4. [セキュリティ] タブを選択します。
  5. [サーバー証明書の管理] セクションまでスクロールします。

    サーバー証明書の有効期限はテーブルに表示されています。

gcloud

  1. サービス証明書に関する情報を取得します。
    gcloud beta sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
    
  2. サーバー証明書を作成します。
    gcloud beta sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
    
  3. ローカル PEM ファイルに証明書情報をダウンロードします。
    gcloud beta sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
    
  4. ダウンロードしたファイルをクライアント ホストマシンにコピーすることにより既存の server-ca.pem ファイルを置き換え、すべてのクライアントを更新して、新しい情報を使用します。

Terraform

サーバー証明書の情報を出力として指定するには、Terraform データソースを使用します。

  1. 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
       }
       
  2. server-ca.pem ファイルを作成するには、次のコマンドを実行します。
       terraform output db_latest_ca_cert > server-ca.pem
       

暗号化された接続を使用する

詳しくは、SQL Server での暗号化された接続の使用方法をご覧ください。

次のステップ