このページでは、すべての接続が暗号化されるようにインスタンスに SSL / TLS 暗号化を適用する方法について説明します。また、Cloud SQL でセルフマネージド SSL / TLS 証明書を使用して Cloud SQL インスタンスに安全に接続する方法についても説明します。
概要
Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書(server-ca.pem
)が自動的に作成されます。すべての接続で SSL / TLS を使用することをおすすめします。
SSL / TLS 暗号化を適用する
SSL モードの設定を使用して、次の方法で SSL 暗号化を適用できます。
非 SSL / 非 TLS 接続と SSL / TLS 接続の両方を許可します。 クライアント証明書は SSL / TLS 接続では検証されません。これがデフォルトです。
SSL / TLS で暗号化された接続のみを許可します。 クライアント証明書は SSL 接続では検証されません。
- 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/TLS の要求を有効にするには、次の操作を行います。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- 次のいずれかを選択します。
- 暗号化されていないネットワーク トラフィックを許可する(非推奨)
- SSL 接続のみを許可する。このオプションは、SSL / TLS 暗号化を使用する接続のみを許可します。証明書は検証されません。
- 信頼できるクライアント証明書を必須にする。このオプションは、有効なクライアント証明書を使用し、SSL で暗号化されたクライアントからの接続のみを許可します。
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
SSL_ENFORCEMENT_MODE は、次のいずれかのオプションに置き換えます。
ALLOW_UNENCRYPTED_AND_ENCRYPTED
は、非 SSL / 非 TLS 接続と SSL / TLS 接続を許可します。SSL 接続の場合、クライアント証明書は検証されません。これはデフォルト値です。ENCRYPTED_ONLY
は、SSL / TLS で暗号化された接続のみを許可します。クライアント証明書は SSL 接続では検証されません。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
は、SSL/TLS と有効なクライアント証明書で暗号化された接続のみを許可します。
詳細については、
Cloud SQL for MySQL の設定
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
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、以前に Terraform 構成で適用されたリソースを削除します。terraform destroy
REST v1
-
リクエストのデータを使用する前に、次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- SSL_ENFORCEMENT_MODE: 以下のいずれかの方法を選択します。
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: 非 SSL / 非 TLS 接続と SSL / TLS 接続を許可します。 SSL 接続の場合、クライアント証明書は検証されません。これはデフォルト値です。ENCRYPTED_ONLY
: SSL / TLS で暗号化された接続のみを許可します。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: 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 接続を許可します。SSL 接続の場合、クライアント証明書は検証されません。これはデフォルト値です。ENCRYPTED_ONLY
: SSL/TLS で暗号化された接続のみを許可します。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: 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 日前、前日に送信されます。
サーバー証明書に関する情報(作成日時や有効期限など)を取得できます。また、新しい証明書を手動で作成することもできます。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- [サーバー証明書の管理] セクションに移動します。
サーバー証明書の有効期限はテーブルに表示されています。
gcloud
- サービス証明書に関する情報を取得します。
gcloud beta sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- サーバー証明書を作成します。
gcloud beta sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- ローカル PEM ファイルに証明書情報をダウンロードします。
gcloud beta sql ssl server-ca-certs list \ --format="value(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
クライアント証明書
新しいクライアント証明書を作成する
クライアント証明書は、インスタンスごとに 10 件まで作成できます。クライアント証明書を作成するには、Cloud SQL Admin
IAM ロールが必要です。
クライアント証明書について、次の点にご留意ください。
- 証明書の秘密鍵を紛失した場合、その秘密鍵は復元できないため、新たに秘密鍵を作成する必要があります。
- デフォルトでは、クライアント証明書の有効期限は 10 年間です。
- クライアント証明書の有効期限が近づいても、通知されません。
- SSL 証明書を作成するには、Cloud SQL インスタンスが実行中の状態である必要があります。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- [クライアント証明書を作成] をクリックします。
- [クライアント証明書の作成] ダイアログ ボックスで、一意の名前を追加します。
- [作成] をクリックします。
- [新しい SSL 証明書を作成しました] ダイアログ ボックスの最初のセクションで [client-key.pem をダウンロード] をクリックして、秘密鍵を
client-key.pem
というファイルにダウンロードします。 - 2 番目のセクションで、[client-cert.pem をダウンロード] をクリックして、クライアント証明書を
client-cert.pem
というファイルにダウンロードします。 - 3 番目のセクションで [server-ca.pem をダウンロード] をクリックして、サーバー証明書を
server-ca.pem
というファイルにダウンロードします。 - [閉じる] をクリックします。
gcloud
ssl client-certs create
コマンドを使用して、クライアント証明書を作成します。gcloud sql ssl client-certs create CERT_NAME client-key.pem \ --instance=INSTANCE_NAME
作成した証明書の公開鍵を取得し、
ssl client-certs describe
コマンドを使用してclient-cert.pem
ファイルにコピーします。gcloud sql ssl client-certs describe CERT_NAME \ --instance=INSTANCE_NAME \ --format="value(cert)" > client-cert.pem
instances describe
コマンドを使用して、サーバー証明書をserver-ca.pem
ファイルにコピーします。gcloud sql instances describe INSTANCE_NAME \ --format="value(serverCaCert.cert)" > server-ca.pem
Terraform
クライアント証明書を作成するには、Terraform リソースを使用します。
REST v1
SSL / TLS 証明書を作成したうえで、このインスタンスにとって一意となる名前をその証明書に対して指定します。
リクエストのデータを使用する前に、次のように置き換えます。
- project-id: プロジェクト ID
- instance-id: インスタンス ID
- client-cert-name: クライアント証明書名
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts
リクエストの本文(JSON):
{ "commonName" : "client-cert-name" }
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
- 以下のようにして、レスポンスのうち引用符で囲まれた証明書の内容全体(引用符そのものは除く)をローカル ファイルにコピーします。
serverCaCert.cert
をserver-ca.pem
にコピーします。clientCert.cert
をclient-cert.pem
にコピーします。certPrivateKey
をclient-key.pem
にコピーします。
-
リクエストのデータを使用する前に、次のように置き換えます。
- project-id: プロジェクト ID
- instance-id: インスタンス ID
- activation-policy: アクティベーション ポリシーは ALWAYS または NEVER です
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart
リクエストの本文(JSON):
{ "settings": { "activationPolicy": "activation-policy" } }
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/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/v1/projects/project-id/operations/operation-id", "targetProject": "project-id" }
REST v1beta4
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 レスポンスが返されます。
- 以下のようにして、レスポンスのうち引用符で囲まれた証明書の内容全体(引用符そのものは除く)をローカル ファイルにコピーします。
serverCaCert.cert
をserver-ca.pem
にコピーします。clientCert.cert
をclient-cert.pem
にコピーします。certPrivateKey
をclient-key.pem
にコピーします。
-
リクエストのデータを使用する前に、次のように置き換えます。
- 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 クライアントとの接続をご覧ください。
次のステップ
- Cloud SQL インスタンスで SSL / TLS を管理する。
- Google Cloud での暗号化の処理方法について詳細を確認する。
- SSL / TLS 証明書を使用して Cloud SQL インスタンスに接続する。
- MySQL での SSL / TLS の使用について学習する。