轮替密文

本主题讨论了如何通过 Secret Manager 为密文管理计划轮替通知。

概览

Secret Manager 支持密文的轮替时间表。Secret Manager 会根据提供的轮替频率和轮替时间向密文上配置的 Pub/Sub 主题发送消息。本指南介绍了如何为密文设置一次性时间表或定期时间表,以便在轮替密文时接收通知。

定期轮替密文有助于:

  • 限制泄露的密文保持有效并公开漏洞的时长。
  • 持续执行轮替流程,以确保流程可靠性。

工作原理

Secret Manager 会在密文的 next_rotation_time 时向密文上配置的 Pub/Sub 主题发送 SECRET_ROTATE 消息。此时间戳通过以下两种方式之一设置:

  1. 由用户在创建或更新密文时提供。

  2. 如果提供了 rotation_period,则 Secret Manager 将在经过 rotation_period 后发送 SECRET_ROTATE 消息。next_rotation_time 将会更新,以反映新的下一次轮替时间。

您必须配置 Pub/Sub 订阅者以接收 SECRET_ROTATE 消息并针对其执行操作。如有必要,请实现其他工作流,例如添加新的密文版本和触发应用部署。

备注

  • 只能通过 Secret Manager v1 API 和 gcloud 命令行工具管理轮替政策。

  • 必须在密文上配置 Pub/Sub 主题。如需了解如何创建 Pub/Sub 主题和订阅,请参阅 Pub/Sub 快速入门。如需了解如何在密文上配置主题,请参阅 Secret Manager 的事件通知

  • 如果指定了 rotation_period,则必须设置 next_rotation_time

  • next_rotation_time 不能设置为将来不到五分钟的时间。rotation_period 的时长不能小于一小时。如需了解时间戳格式设置指导信息,请参阅 gcloud datetime 参考文档

  • 传送错误:Secret Manager 会自动重试失败的发送消息尝试。如果密文或主题配置、权限或配额配置错误,则 Secret Manager 无法为传送做出保证。

  • 进行中的轮替必须先完成,然后才能开始另一次轮替,以防止并发轮替产生意外行为。当 Secret Manager 尝试向 Pub/Sub 发送消息时,通知被视为进行中。如果存在进行中的轮替,则跳过计划轮替。Secret Manager 会自动重试失败发送消息尝试,最多尝试七天,之后轮替将中止。

示例

为密文配置轮替

使用 next_rotation_time 创建密文,该密文自 2021 年 6 月 1 日起每 30 天轮替一次:

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