SSL / TLS 証明書を構成する

このページでは、SSL / TLS を使用するようにインスタンスを構成する方法について説明します。Cloud SQL での SSL / TLS の使用については、別途詳細を確認してください。

概要

Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書(server-ca.pem)が自動的に作成されます。

SSL / TLS を使用するには、クライアント証明書を作成して、MySQL クライアント ホストマシンにダウンロードする必要があります。

SSL / TLS を使用して接続する場合は、すべての接続で SSL / TLS を使用することをおすすめします。

SSL / TLS 証明書を変更した後にインスタンスを再起動する必要はありません。再起動が必須の場合は、SSL 更新イベント中に再起動が自動的に行われます。

SSL / TLS の要求

SSL / TLS の有効化が必須の場合、Cloud SQL Auth Proxy または SSL / TLS 証明書を使用して Cloud SQL インスタンスに接続できます。SSL / TLS を必須としない場合は、有効な証明書を持たないクライアントの接続が許可されます。

SSL / TLS の使用を必須とするには、次の操作を行います。

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. 左側のナビゲーション パネルで [接続] リンクをクリックします。
  4. [セキュリティ] セクションまで下にスクロールします。
  5. [SSL 接続のみ許可] をクリックします。

gcloud

gcloud sql instances patch [INSTANCE_NAME] --require-ssl
  

REST API 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 日前、前日に送信されます。

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

Console

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

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. 左側のナビゲーション パネルで [接続] リンクをクリックします。
  4. [サーバー証明書の管理] セクションまでスクロールします。

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

gcloud

  1. サービス証明書に関する情報を取得します。
    gcloud beta sql ssl server-ca-certs list --instance=[INSTANCE_NAME]
           
  2. サーバー証明書を作成します。
    gcloud beta sql ssl server-ca-certs create --instance=[INSTANCE]
  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 ファイルを置き換え、すべてのクライアントを更新し、新しい情報を使用します。

クライアント証明書

新しいクライアント証明書を作成する

クライアント証明書は、インスタンスごとに 10 件まで作成できます。証明書の秘密鍵を紛失した場合、その秘密鍵は復元できないため、新たに秘密鍵を作成する必要があります。デフォルトでは、クライアント証明書の有効期限は 10 年間です。クライアント証明書の有効期限が近づいても、通知されません。

Console

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

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. 左側のナビゲーション パネルで [接続] リンクをクリックします。
  4. [セキュリティ] セクションまで下にスクロールします。
  5. [クライアント証明書を作成] をクリックします。
  6. [クライアント証明書の作成] ダイアログ ボックスで、一意の名前を追加します。
  7. [作成] をクリックします。
  8. [新しい SSL 証明書を作成しました] ダイアログ ボックスの最初のセクションで [client-key.pem をダウンロード] をクリックして、秘密鍵を client-key.pem というファイルにダウンロードします。
  9. 2 番目のセクションで、[client-cert.pem をダウンロード] をクリックして、クライアント証明書を client-cert.pem というファイルにダウンロードします。
  10. 3 番目のセクションで [server-ca.pem をダウンロード] をクリックして、サーバー証明書を server-ca.pem というファイルにダウンロードします。
  11. [閉じる] をクリックします。

gcloud

  1. ssl client-certs create コマンドを使用して、クライアント証明書を作成します。

    gcloud sql ssl client-certs create [CERT_NAME] client-key.pem --instance=[INSTANCE_NAME]
    
  2. 先ほど作成した証明書の公開鍵を取得し、ssl client-certs describe コマンドを使用して client-cert.pem ファイルにコピーします。

    gcloud sql ssl client-certs describe [CERT_NAME] --instance=[INSTANCE_NAME] --format="value(cert)" > client-cert.pem
    
  3. instances describe コマンドを使用して、サーバー証明書を server-ca.pem ファイルにコピーします。

    gcloud sql instances describe [INSTANCE_NAME]  --format="value(serverCaCert.cert)" > server-ca.pem
    
  4. gcloud sql instances restart [INSTANCE_NAME]
    

REST API v1beta4

  1. SSL / TLS 証明書を作成したうえで、このインスタンスにとって一意となる名前をその証明書に対して指定します。

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

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • client-cert-name: クライアント証明書名

    HTTP メソッドと URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts

    JSON 本文のリクエスト:

    {
      "commonName" : "client-cert-name"
    }
    

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

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

  2. 以下のようにして、レスポンスのうち引用符で囲まれた証明書の内容全体(引用符そのものは除く)をローカル ファイルにコピーします。
    1. serverCaCert.certserver-ca.pem にコピーします。
    2. clientCert.certclient-cert.pem にコピーします。
    3. certPrivateKeyclient-key.pem にコピーします。
  3. 後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • activation-policy: アクティベーション ポリシーは ALWAYS または NEVER です

    HTTP メソッドと URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart

    JSON 本文のリクエスト:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

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

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

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
      "status": "PENDING",
      "user": "user@example.com",
      "insertTime": "2020-01-20T21:30:35.667Z",
      "operationType": "RESTART",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

この時点でお客様が保持している証明書は以下のとおりです。

  • server-ca.pem という名前で保存されたサーバー証明書。
  • client-cert.pem という名前で保存されたクライアントの公開鍵証明書。
  • client-key.pem という名前で保存されたクライアント秘密鍵。

接続に使用するツールにより、これら 3 つのアイテムの指定方法が異なります。たとえば、MySQL クライアントを使用して接続するときは、これら 3 つのファイルをそれぞれ --ssl-ca--ssl-cert--ssl-key コマンド オプションの値として指定します。MySQL クライアントと SSL / TLS を使用した接続の例については、MySQL クライアントとの接続をご覧ください。

次のステップ