Secret Manager を使用して Cloud SQL でシークレットを処理する

概要

機密情報を正しく管理することは、安全な開発ワークフローを作成するうえで非常に重要です。Cloud SQL では、機密情報を Secret Manager で作成したシークレットとして保存することをおすすめします。シークレットには、機密システムにアクセスするために使用する可能性のある API キー、パスワード、機密情報、認証情報が含まれています。

Secret Manager は、利便性を提供し、セキュリティを強化します。シークレットにバージョニングを適用して、チーム間で共有することもできます。シークレットをチームと共有する方法の詳細については、アクセス制御(IAM)をご覧ください。

このページでは、Secret Manager を使用して Cloud SQL でシークレットを管理する 4 つのユースケースについて説明します。

始める前に

Secret Manager を使用して Cloud SQL でシークレットを処理する前に:

ユーザー名とパスワード

Secret Manager を使用して Cloud SQL ユーザー アカウントのユーザー名とパスワードをシークレットとして保存することは、この機密情報を管理する安全かつ信頼性の高い方法です。

まず、Cloud SQL でユーザーを作成する必要があります。このユーザーを作成する際に、ユーザー名とパスワードを指定する必要があります。Cloud SQL でユーザーを作成する方法については、ユーザーの作成と管理をご覧ください。

ユーザーを作成したら、Secret Manager にシークレットを作成してユーザー名とパスワードを保存します。これにより、この機密情報が消失するのを防ぐことができます。Secret Manager でのシークレットの作成とアクセスの詳細については、シークレットの作成とアクセスをご覧ください。

Cloud SQL のインスタンス

Cloud SQL インスタンスに接続するときは、Secret Manager を使用してシークレットを管理し、安全な開発ワークフローを作成できます。

まず、ローカル コンピュータから Cloud SQL インスタンスに接続します。インスタンスを実行したら、環境変数を使用してそのインスタンスに接続します。変数に関連付けられる一部の値(インスタンス接続名など)は機密性が高くなります。値ごとに、Secret Manager にシークレットを作成してこの情報を保存および管理できます。環境変数を使用して Cloud SQL インスタンスに接続する方法については、サンプルアプリを構成して実行するをご覧ください。

シークレットとして保存されているインスタンス接続名は、Secret Manager から直接取得できます。この柔軟性の高いワークフローにより、チームはこの機密情報を複数のアプリケーションで共有し、一元管理された場所から管理できます。Secret Manager からシークレットを取得する方法の詳細については、Secret Manager でシークレットを作成するをご覧ください。

アプリケーションを使用するには、シークレット内の情報が必要です。この情報には、アプリケーションへの接続に使用される環境変数に関連付けられた値が含まれます。アプリケーションは起動時にシークレットにアクセスし、シークレットを使用して Cloud SQL への接続を構成します。関連するシークレットが Secret Manager で更新された場合は、アプリケーションを再起動する必要があります。

SSL / TLS 証明書

パブリック IP アドレスまたはプライベート IP アドレスを使用して Cloud SQL インスタンスに接続する場合は、送信中のデータを保護する Transport Layer Security(TLS)証明書を使用する必要があります。各 TLS 証明書には公開鍵証明書と秘密鍵が含まれています。TLS 証明書の構成の詳細については、SSL/TLS 証明書を構成するをご覧ください。

TLS 証明書、公開鍵証明書、秘密鍵をシークレットとして保存して安全に保ち、チームと共有できます。シークレットの作成とアクセスの詳細については、Secret Manager でシークレットを作成するをご覧ください。シークレットの共有の詳細については、アクセス制御(IAM)をご覧ください。

障害復旧シナリオ

Cloud SQL のプライマリ インスタンスで障害が発生した場合、リードレプリカをプライマリ インスタンスに昇格できます。リードレプリカがプライマリ インスタンスになったら、この昇格を反映するためにインスタンス接続名を更新する必要があります。インスタンス接続名がシークレットに保存されている場合は、新しいプライマリ インスタンスの名前でシークレットを更新する必要があります。詳細については、シークレットを編集するをご覧ください。

フェイルオーバーに Secret Manager を使用する方法の一つとして、プライマリ インスタンスの名前をシークレットに保存して、シークレットが更新されるたびに更新されるように Cloud SQL コネクタを構成する方法があります。

Cloud SQL Auth Proxy で次の bash ラッパー スクリプトを使用すると、インスタンス接続名の値がいつ更新されたかを検出し、新しい値でプロキシを再起動できます。

#!/bin/bash

SECRET_ID="my-secret-id" # TODO(developer): replace this value
REFRESH_INTERVAL=5
PORT=5432                # TODO(developer): change this port as needed

# Get the latest version of the secret and start the proxy
INSTANCE=$(gcloud secrets versions access "latest" --secret="$SECRET_ID")
cloud_sql_proxy -instances="$INSTANCE"=tcp:"$PORT" &
PID=$!

# Every 5s, get the latest version of the secret. If it's changed, restart the
# proxy with the new value.
while true; do
    sleep $REFRESH_INTERVAL
    NEW=$(gcloud secrets versions access "latest" --secret="$SECRET_ID")
    if [ "$INSTANCE" != "$NEW" ]; then
        INSTANCE=$NEW
        kill $PID
        wait $PID
        cloud_sql_proxy -instances="$INSTANCE"=tcp:"$PORT" &
        PID=$!
    fi
done

プライマリ レプリカのインスタンス接続名を含むシークレットの作成とアクセスの詳細については、Secret Manager でシークレットを作成するをご覧ください。Cloud SQL Auth プロキシの使用について詳しくは、Cloud SQL Auth プロキシを使用して Cloud SQL に接続するをご覧ください。

次のステップ