このページでは、すべての接続が暗号化されるようにインスタンスに SSL / TLS 暗号化を適用する方法について説明します。また、Cloud SQL でセルフマネージド SSL / TLS 証明書を使用して Cloud SQL インスタンスに安全に接続する方法についても説明します。
概要
Cloud SQL では、お客様がインスタンスを作成した時点で、サーバー証明書(server-ca.pem
)が自動的に作成されます。すべての接続で SSL / TLS を使用することをおすすめします。
sslMode
を ENCRYPTED_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 の要求を有効にするには、次の操作を行います。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [接続] をクリックします。
- [セキュリティ] タブを選択します。
- 次のいずれかを選択します。
- 暗号化されていないネットワーク トラフィックを許可する(非推奨)
- 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 リソースを使用します。
変更を適用する
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 接続を許可します。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
-
リクエストのデータを使用する前に、次のように置き換えます。
- 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 日前、前日に送信されます。
サーバー証明書に関する情報(作成日時や有効期限など)を取得できます。また、新しい証明書を手動で作成することもできます。
コンソール
-
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
暗号化された接続を使用する
詳しくは、SQL Server での暗号化された接続の使用方法をご覧ください。
次のステップ
- Cloud SQL インスタンスで SSL / TLS を管理する。
- Google Cloud での暗号化の処理方法について詳細を確認する。