Secret Manager では、シークレットのローテーション スケジュールがサポートされています。Secret Manager は、指定されたローテーションの頻度とローテーション時間に基づいて、シークレットで構成されている Pub/Sub トピックにメッセージを送信します。このトピックでは、シークレットを 1 回だけまたは定期的にスケジュールするように設定して、シークレットをローテーションするタイミングで通知を受け取る方法を説明します。
シークレットを定期的にローテーションすると、次のことに役立ちます。
- 漏洩したシークレットが有効である期間と、脆弱性が公開される期間を制限することができる。
- ローテーション フローを継続的に実施して、プロセスの信頼性を確保する。
仕組み
Secret Manager は、SECRET_ROTATE
メッセージをシークレットの next_rotation_time
で構成された Pub/Sub トピックに送信します。このタイムスタンプは、次の 2 つの方法のいずれかで設定されます。
シークレットを作成または更新するときに、ユーザーが指定します。
rotation_period
が指定されている場合、Secret Manager は、rotation_period
が経過した後にSECRET_ROTATE
メッセージを送信します。next_rotation_time
は、次の新しいローテーション時間を反映するように更新されます。
SECRET_ROTATE
メッセージを受信して処理するように Pub/Sub サブスクライバーを構成する必要があります。必要に応じて、新しいシークレット バージョンの追加やアプリケーションのデプロイのトリガーなど、追加のワークフローを実装します。
メモ
ローテーション ポリシーの管理は、Secret Manager
v1
API と Google Cloud CLI でのみ行えます。Pub/Sub トピックはシークレットに構成する必要があります。Pub/Sub のトピックとサブスクリプションを作成する方法については、Pub/Sub のクイックスタートをご覧ください。シークレットにトピックを構成する方法については、Secret Manager のイベント通知をご覧ください。
rotation_period
が指定されている場合は、next_rotation_time
を設定する必要があります。next_rotation_time
は以降 5 分未満には設定できません。rotation_period
は 1 時間以上にする必要があります。タイムスタンプのフォーマットに関するガイダンスについては、gcloud datetime リファレンスをご覧ください。配信エラー: Secret Manager は失敗したメッセージの送信を自動的に再試行します。Secret Manager で、シークレットまたはトピック構成、権限、割り当てに関する構成ミスがある場合、配信に関する保証は行われません。
処理中のローテーションは、同時実行ローテーションによって予期しない動作が発生しないように、別のローテーションを開始する前に完了する必要があります。Secret Manager が Pub/Sub にメッセージを送信しようとしている間は、通知は処理中とみなされます。処理中のローテーションがある場合、スケジュールされたローテーションはスキップされます。 Secret Manager は、失敗したメッセージ送信を最大 7 日間、自動的に再試行します。その後、ローテーションは中止されます。
例
シークレットのローテーションを構成する
2021 年 6 月 1 日から 30 日ごとにローテーションされる next_rotation_time
を含むシークレットを作成します。
gcloud
gcloud secrets create secret-id \ --replication-policy "automatic" \ --next-rotation-time="2021-06-01T09:00:00Z" \ --rotation-period="2592000s" \ --topics="full-topic-name"
API
curl "https://secretmanager.googleapis.com/v1/projects/${PROJECT_ID}/secrets?secretId=${SECRET_ID}" \
--request "POST" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @- <<EOF
{
"replication":{
"automatic":{}
},
"topics": {"name" : "projects/${PROJECT_ID}/topics/${TOPIC_NAME}"},
"rotation":
{
"next_rotation_time": "2021-06-01T09:00:00Z",
"rotation_period" : '2592000s'
},
}
EOF
シークレットのローテーション設定を更新する
ローテーションの有効な updateMask パスは rotation
、rotation.next_rotation_time
、rotation.rotation_period
です。
シークレットの next_rotation_time
を更新します。
gcloud
gcloud secrets update secret-id \ --next-rotation-time "2022-06-01T09:00:00Z"
API
$ curl "https://secretmanager.googleapis.com/v1/projects/${PROJECT_ID}/secrets/${SECRET_ID}?updateMask=rotation.next_rotation_time" \
--request "PATCH" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-Type: application/json" \
--data-binary @- <<EOF
{
"rotation": {"next_rotation_time": "2040-06-01T09:00:00Z"}
}
EOF
シークレットのローテーションを無効にする
シークレットの next_rotation_time
を削除します。
gcloud
gcloud secrets update secret-id \ --remove-next-rotation-time
API
$ curl "https://secretmanager.googleapis.com/v1/projects/${PROJECT_ID}/secrets/${SECRET_ID}?updateMask=rotation.next_rotation_time" \
--request "PATCH" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-Type: application/json" \
--data-binary @- <<EOF
{}
EOF
シークレットのローテーション スケジュールを削除する。これにより、next_rotation_time
と rotation_period
の両方が削除されます。
gcloud
gcloud secrets update secret-id \ --remove-rotation-schedule
API
$ curl "https://secretmanager.googleapis.com/v1/projects/${PROJECT_ID}/secrets/${SECRET_ID}?updateMask=rotation" \
--request "PATCH" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-Type: application/json" \
--data-binary @- <<EOF
{}
EOF
次のステップ
オプティミスティック同時実行制御に ETag を使用する方法を確認する。