SSL / TLS を構成する

このページでは、SSL/TLS を使用できるようにインスタンスを構成する方法と、ご使用のサーバー証明書やクライアント証明書を管理する方法について説明します。

MySQL で SSL/TLS を使用する方法については、MySQL リファレンス マニュアルの暗号化された接続の使用をご覧ください。

はじめに

Cloud SQL では、Transport Layer Security(SSL/TLS)プロトコルを使用したインスタンスへの接続がサポートされています。インスタンスへの接続にパブリック IP アドレスを使用する場合は、Cloud SQL との間で送受信するデータのセキュリティが確保されるよう、必ず SSL/TLS を使用してください。

プライベート IP を使用して接続する場合、SSL/TLS の構成は任意です。プライベート サービス アクセス トラフィックは常に Google ネットワーク内に留まります。

Cloud SQL では、インスタンスごとの自己署名サーバー証明書とクライアント(Cloud SQL インスタンスにアクセスする外部アプリケーションなど)の証明書(公開鍵 / 秘密鍵のペア)が使用されます。この 2 つの証明書を連携させることにより、サーバー(インスタンス)とクライアント(アプリケーション)の通信を暗号化することが可能となります。暗号化された通信を実現するためには、有効なサーバー証明書と有効なクライアント証明書(鍵ペア)を保持していることが必要です。

SSL/TLS を適用する

SSL/TLS 接続を受け入れるように Cloud SQL インスタンスを設定すると、そのインスタンスの SSL/TLS 接続が有効になりますが、安全性の低い接続も引き続き受け入れられます。すべての接続に SSL/TLS を適用しない場合、SSL/TLS 構成になんらかの問題が生じると、すべての接続で通知なく暗号化が解除されることがあります。このため、IP を使用してインスタンスにアクセスする場合は、すべての接続に SSL を適用することを強くおすすめします。

Cloud SQL Proxy を介したインスタンスへの接続は、SSL/TLS が構成または適用されているかどうかにかかわらず、暗号化されます。SSL/TLS 構成は、IP アドレスを使用する接続にのみ影響を与えます。

インスタンスへのすべての接続で SSL/TLS を適用するには:

Console

  1. Google Cloud Console の Cloud SQL インスタンス ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL 接続] セクションまでスクロールします。
  5. [SSL 接続のみ許可] をクリックします。

gcloud

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

cURL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{"settings" :
                 { "ipConfiguration" : {
                       "requireSsl" : "true" }}}' \
     -X PATCH \
     https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>

サーバー証明書を管理する

Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書が自動的に作成されます。サーバー証明書は、有効である限り、お客様が積極的に管理する必要はありません。ただし、証明書には有効期限があり、期限を過ぎた証明書は無効になります。そうなると、クライアントでは、その証明書を使用したインスタンスへの安全な接続が確立できなくなります。

Cloud SQL では、サーバー証明書をローテーションして、古い証明書が期限切れになる前に新しい証明書とシームレスに交換できます。

サーバー証明書のローテーションの仕組み

Cloud SQL インスタンスのサーバー証明書が期限切れになる約 3 か月前に、プロジェクト オーナーは、そのインスタンスに対する証明書ローテーション プロセスが開始されたことを伝えるメールを Cloud SQL から受信します。メールではインスタンスの名前が示され、新しいサーバー証明書がプロジェクトに追加されたことがプロジェクト所有者に通知されます。既存のサーバー証明書およびクライアント証明書は、引き続き正常に機能します。事実上、インスタンスにはこの間、2 つのサーバー証明書があります。

プロジェクト管理者または適切な権限を持つユーザーは、現在のサーバー証明書と新しいサーバー証明書の両方の証明書情報を含む新しいサーバー証明書の PEM ファイルをダウンロードします。その後、新しい PEM ファイルを使用するために、SSL/TLS を使用して Cloud SQL インスタンスにアクセスするすべてのクライアントを更新する必要があります。

すべてのクライアントが更新された後、プロジェクト管理者は、新しいサーバー証明書にローテーションするよう Cloud SQL に指示します。これにより、古いサーバー証明書が認識されなくなり、新しいサーバー証明書だけが使用されます。

この時点で、ローテーションは完了しています。これ以上の操作は必要ありません。クライアント証明書は、サーバー証明書のローテーションの影響を受けません。

サーバー証明書のローテーション

証明書の期限切れに関する通知を受け取った場合やローテーションを開始した場合は、ローテーションを完了するために次の手順を実行する必要があります。

  1. 新しいサーバー証明書情報をダウンロードします。
  2. クライアントを更新して新しいサーバー証明書情報を使用するようにします。
  3. ローテーションを完了します。これにより、現在アクティブな証明書が「前の」スロットに移動し、新しく追加された証明書がアクティブな証明書に更新されます。

Console

新しいサーバー証明書情報をダウンロードします。

  1. Google Cloud Console の Cloud SQL インスタンス ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL サーバー証明書の構成] セクションまでスクロールします。
  5. [新しい証明書を作成] をクリックします。
  6. [SSL サーバー証明書のダウンロード] セクションまでスクロールします。
  7. [ダウンロード] をクリックします。

    PEM ファイルとしてエンコードされたサーバー証明書情報が表示され、ローカル環境にダウンロードされます。

  8. 新しい情報を使用するようにすべてのクライアントを更新します。

クライアントの更新後、ローテーションを完了します。

  1. [SSL サーバー証明書の構成] セクションに戻ります。
  2. [証明書をローテーション] をクリックします。
  3. クライアントが正しく接続していることを確認します。

    新しくローテーションされた証明書を使用して接続しているクライアントが存在しない場合は、[証明書をロールバック] をクリックして前の構成にロールバックできます。

gcloud

  1. ローカル PEM ファイルに証明書情報をダウンロードします。

    gcloud beta sql ssl server-ca-certs list --format="value(cert)" \
        --instance=[INSTANCE_NAME] > [FILE_PATH]/[FILE_NAME].pem
    
  2. 新しい情報を使用するようにすべてのクライアントを更新します。

  3. クライアントの更新後、ローテーションを完了します。

    gcloud beta sql ssl server-ca-certs rotate --instance=[INSTANCE_NAME]
    
  4. クライアントが正しく接続していることを確認します。

    新しくローテーションされた証明書を使用して接続していないクライアントがある場合は、以前の構成にロールバックできます。

cURL

  1. サーバー証明書をダウンロードします。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X GET \
         https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>/listServerCas
    
  2. ローテーションを完了します。

    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>/rotateServerCa
    

証明書ローテーション オペレーションのロールバック

証明書のローテーションを完了したら、クライアントはすべて新しい証明書を使用して Cloud SQL インスタンスに接続する必要があります。クライアントが新しい証明書情報を使用するように正しく更新されていない場合は、SSL/TLS を使用してインスタンスに接続できません。この場合、前の証明書構成にロールバックできます。

ロールバック オペレーションにより、現在アクティブな証明書が「今後の」スロットに移動されます(現在の「今後の」証明書が置き換えられます)。「前」の証明書が現在アクティブな証明書になり、証明書構成がローテーションの完了前の状態に戻ります。

以前の証明書構成にロールバックするには:

Console

  1. Google Cloud Console の Cloud SQL インスタンス ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL サーバー証明書の構成] セクションまでスクロールします。
  5. [証明書をローテーション] をクリックします。処理が完了するまで数秒かかります。
  6. [証明書をロールバック] をクリックします。

gcloud

  gcloud beta sql ssl server-ca-certs rollback --instance=[INSTANCE_NAME]

cURL

  1. サーバー証明書をダウンロードします。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X GET \
         https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>/listServerCas
    
  2. ロールバック先のバージョンの sha1Fingerprint フィールドをコピーします。

    activeVersion として表示される sha1Fingerprint 値の直前の createTime 値を使用したバージョンを探します。

  3. ローテーションをロールバックします。

    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{"rotateServerCaContext" :
                     { "nextVersion" : "<SHA1FINGERPRINT>"}}' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>/rotateServerCa
    

ローテーションの開始

ローテーションの開始では、Cloud SQL からのメールを待つ必要はありません。いつでも開始できます。ローテーションを開始すると、新しい証明書が作成され、「今後の」スロットに配置されます。証明書がすでに「今後の」スロットにある場合、その証明書は削除されます。今後の証明書は 1 つだけです。

ローテーションを開始するには:

Console

  1. Google Cloud Console の Cloud SQL インスタンス ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL サーバー証明書の構成] セクションまでスクロールします。
  5. [新しい証明書を作成] をクリックします。
  6. サーバー証明書のローテーションの説明に従って、ローテーションを完了します。

gcloud

  1. ローテーションを開始します。

      gcloud beta sql ssl server-ca-certs create --instance=[INSTANCE_NAME]
    
  2. サーバー証明書のローテーションの説明に従って、ローテーションを完了します。

cURL

  gcloud auth login
  ACCESS_TOKEN="$(gcloud auth print-access-token)"
  curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
       -X POST \
       https://www.googleapis.com/sql/v1beta4/projects/<PROJECT-ID>/instances/<INSTANCE_NAME>/rotateServerCa

サーバー証明書のローテーションの説明に従って、ローテーションを完了します。

サーバー証明書に関する情報を取得する

サーバー証明書については、その有効期限や暗号化レベルなどの情報を取得できます。

Console

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL サーバー証明書の構成] セクションまでスクロールします。

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

    証明書のタイプを確認するには、gcloud コマンドライン ツールを使用します。

gcloud

gcloud beta sql ssl server-ca-certs list --instance=[INSTANCE_NAME]

cURL

インスタンスについて説明コマンド(describe)を使用すると、サーバー証明書に関する詳細を確認できます。

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     -X GET \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]?fields=serverCaCert

SSL/TLS 構成のリセット

SSL/TLS 構成を完全にリセットする必要がある場合は、これを実行できます。

gcloud

第 1 世代インスタンスに対して以下の作業を行う場合、その途中で Cloud SQL インスタンスの再起動が必要になります。

  1. 証明書を更新します。

    gcloud sql instances reset-ssl-config [INSTANCE_NAME]
    
  2. 第 1 世代のインスタンスの場合は、更新を完了するためにインスタンスを再起動します。

    gcloud sql instances restart [INSTANCE_NAME]
    
  3. 新しいクライアント証明書を作成します

cURL

第 1 世代インスタンスに対して以下の作業を行う場合、その途中で Cloud SQL インスタンスの再起動が必要になります。

  1. 証明書を更新します。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --header 'Content-Length: 0' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/resetSslConfig
    
  2. 第 1 世代インスタンスの場合はインスタンスを再起動します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Length: 0' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/restart
    
  3. 新しいクライアント証明書を作成します

クライアント証明書を管理する

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

クライアント証明書は、インスタンスごとに 10 件まで作成できます。証明書の秘密鍵を紛失した場合、その秘密鍵は復元できないため、新たに秘密鍵を作成する必要があります。

Console(第 2 世代)

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL クライアント証明書の構成] セクションまでスクロールします。
  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. [閉じる] をクリックします。

Console(第 1 世代)

以下の作業では、途中 Cloud SQL インスタンスを再起動します。

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [クライアント証明書] セクションで、[クライアント証明書を作成] をクリックします。
  5. [新しいクライアント証明書] ダイアログ ボックスで、証明書に固有の名前を指定して、[追加] をクリックします。
  6. [新しい SSL 証明書を作成しました] ダイアログ ボックスの最初のセクションにあるリンクをクリックして、client-key.pem というファイルに秘密鍵をダウンロードします。
  7. 2 番目のセクションで、リンクをクリックして、クライアント証明書を client-cert.pem というファイルにダウンロードします。
  8. 3 番目のセクションで、リンクをクリックして、サーバー証明書を server-ca.pem というファイルにダウンロードします。
  9. インスタンスをすぐに再起動する場合は [閉じて再起動] をクリックします。後でインスタンスを手動で再起動する場合は [閉じる] をクリックします。

    証明書を有効にするためには、インスタンスを必ず再起動しなければなりません。

gcloud

第 1 世代インスタンスに対して以下の作業を行う場合は、途中 Cloud SQL インスタンスを再起動する必要があります。

  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. 第 1 世代のインスタンスの場合は、証明書と SSL/TLS 構成の変更内容を有効にするため、インスタンスを再起動します。

    gcloud sql instances restart [INSTANCE_NAME]
    

cURL

第 1 世代インスタンスに対して以下の作業を行う場合、その途中で Cloud SQL インスタンスの再起動が必要になります。

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

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{"commonName" : "[CERT_NAME]"}' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/sslCerts
    
  2. 以下のようにして、レスポンスのうち引用符で囲まれた証明書の内容全体(引用符そのものは除く)をローカル ファイルにコピーします。
    1. serverCaCert.certserver-ca.pem にコピーします。
    2. clientCert.certclient-cert.pem にコピーします。
    3. certPrivateKeyclient-key.pem にコピーします。
  3. 第 1 世代インスタンスの場合はインスタンスを再起動します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Length: 0' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/restart
    

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

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

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

クライアント証明書を取得する

クライアント証明書のうち、公開鍵の部分は取得することができます。ただし、秘密鍵は取得できません。秘密鍵を紛失した場合は、新たに秘密鍵を作成する必要があります。

Console

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL クライアント証明書の構成] セクションまでスクロールします。
  5. 証明書名をクリックします。[SSL クライアント証明書] ダイアログ ボックスが開き、クライアント証明書(client-cert.pem)が表示されます。

gcloud

ssl client-certs describe コマンドを使用して、クライアント証明書の公開鍵を取得します。

gcloud sql ssl client-certs describe [CERT_NAME] --instance=[INSTANCE_NAME] --format="value(cert)" > client-cert.pem

cURL

  1. 目的の証明書のフィンガープリントを取得するため、インスタンス上にある証明書のリストを表示します。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X GET \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]sslCerts
    

    取得する証明書の sha1Fingerprint フィールドを記録します。引用符は除外してください。

  2. 証明書を取得します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X GET \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/sslCerts/[FINGERPRINT]
    
  3. 引用符で囲まれたすべての証明書データをファイルにコピーします。たとえば、client-cert.pem のようになります。引用符そのものはコピーしないてください。

クライアント証明書を削除する

Console(第 2 世代)

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL クライアント証明書の構成] セクションまでスクロールします。
  5. 削除する証明書を選択して 削除 アイコンをクリックします。
  6. [クライアント証明書の削除] ダイアログ ボックスで、[OK] をクリックします。

Console(第 1 世代)

以下の作業では、途中 Cloud SQL インスタンスを再起動します。

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

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

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [SSL クライアント証明書の構成] セクションまでスクロールします。削除する証明書を選択して 削除 をクリックします。
  5. [クライアント証明書の削除] ダイアログ ボックスで、[今すぐ再起動] をクリックします。

    このオペレーションを完了するには、インスタンスの再起動が必要です。

gcloud

第 1 世代インスタンスに対して以下の作業を行う場合、その途中で Cloud SQL インスタンスの再起動が必要になります。

  1. ssl client-certs delete コマンドを使用してクライアント証明書を削除します。

    gcloud sql ssl client-certs delete [CERT_NAME] --instance=[INSTANCE_NAME]
    
  2. 第 1 世代インスタンスの場合はインスタンスを再起動します。

    gcloud sql instances restart [INSTANCE_NAME]
    

cURL

第 1 世代インスタンスに対して以下の作業を行う場合、その途中で Cloud SQL インスタンスの再起動が必要になります。

  1. 削除する証明書のフィンガープリントを取得するため、インスタンス上にある証明書のリストを表示します。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X GET \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/sslCerts
    

    削除する証明書の sha1Fingerprint フィールドを記録します。引用符は除外してください。

  2. 証明書を削除します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         -X DELETE \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/sslCerts/[FINGERPRINT]
    
  3. 第 1 世代インスタンスの場合はインスタンスを再起動します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Length: 0' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]/restart
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...