シークレットのローテーション

このトピックでは、Secret Manager を使用して、スケジュール設定されたシークレットのローテーション通知を管理する方法について説明します。

概要

Secret Manager では、シークレットのローテーション スケジュールがサポートされています。Secret Manager は、指定されたローテーションの頻度とローテーション時間に基づいて、シークレットで構成されている Pub/Sub トピックにメッセージを送信します。このガイドでは、シークレットをローテーションタイミングに通知を受け取るように、シークレットに 1 回だけまたは定期的なスケジュールを設定する方法を説明します。

シークレットを定期的にローテーションすると、次のことに役立ちます。

  • 漏洩したシークレットが有効である期間と、脆弱性が公開される期間を制限する。
  • ローテーション フローを継続的に実施して、プロセスの信頼性を確保する。

仕組み

Secret Manager は、シークレットに構成された Pub/Sub トピックに、SECRET_ROTATE メッセージをシークレットの next_rotation_time に送信します。このタイムスタンプは、次のいずれかの方法で設定されます。

  1. シークレットを作成または更新するときに、ユーザーが指定します。

  2. rotation_period が指定されている場合、Secret Manager は、rotation_period 経過後に SECRET_ROTATE メッセージを送信します。next_rotation_time は、次の新しいローテーション時間を反映するように更新されます。

SECRET_ROTATE メッセージを受信して動作するように Pub/Sub サブスクライバーを構成する必要があります。必要に応じて、新しいシークレット バージョンの追加やアプリケーションのデプロイのトリガーなど、追加のワークフローを実装します。

メモ

  • ローテーション ポリシーの管理は、Secret Manager v1 API と gcloud コマンドライン ツールでのみ使用できます。

  • 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 パスは rotationrotation.next_rotation_timerotation.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
  {
    "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_timerotation_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