SSL / TLS 証明書を構成する

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

概要

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

SQL Server は、暗号化された接続が必要であるとクライアント リクエストで明示的に指定された場合にのみ、証明書の検証を行います。この場合、サーバー証明書をクライアント マシンにインストールする必要があります。それ以外の場合、クライアントは接続文字列や証明書を変更せずに接続できます。sslModeENCRYPTED_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 の要求を有効にするには、次の操作を行います。

コンソール

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

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

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [接続] をクリックします。
  4. [セキュリティ] タブを選択します。
  5. 次のいずれかを選択します。
    • 暗号化されていないネットワーク トラフィックを許可する(非推奨)
    • 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 リソースを使用します。

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
    • 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

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

    • 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 では、お客様がインスタンスを作成した時点で、サーバー証明書が自動的に作成されます。サーバー証明書が有効である限り、お客様が積極的にサーバー証明書を管理する必要はありません。ただし、証明書には 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 での暗号化された接続の使用方法をご覧ください。

次のステップ