シークレットの有効期限を設定する

このトピックでは、Secret Manager でシークレットの有効期限を設定する方法について説明します。また、シークレットに設定されている有効期限を更新または削除する方法についても説明します。

概要

デフォルトでは、Secret Manager に保存されているシークレットは、ユーザーが削除するまで存在します。シークレットを既知の限られた時間だけ保存する必要がある場合は、シークレットに有効期限を設定できます。シークレットに構成された時間になると、シークレットは自動的に削除されます。

シークレットを削除しなければならない要件がない場合は、IAM Conditions またはバージョン状態の無効化を使用して、安全な方法でアクセスを取り消すことを検討してください。

有効期限は、タイムスタンプまたは期間のいずれかとして入力できます。シークレット メタデータが取得されると、指定方法に関係なく、有効期限は常にタイムスタンプとして返されます。

有効期限は、いつでもシークレットに対して追加、更新、削除できます。

制限事項

  • シークレットの有効期限は、Secret Manager v1 API と gcloud コマンドライン ツールでのみ使用できます。

  • シークレットの有効期限は 60 秒未満、100 年以上にはできません。

有効期限付きシークレットの安全な使用

Secret Manager でシークレットが期限切れになると、削除され、元に戻すことはできません。期限切れが近いシークレットを検出する最善の方法は、期限切れになる前に IAM Conditions を使用して、そのシークレットを使用するアカウントから権限を削除することです。

これを行うには、シークレットの権限を付与するときに、時間ベースの条件をバインディングに関連付けます。シークレットが使用されなくなると予想された後、バインディングは期限切れになるはずですが、シークレットが期限切れになる前に削除されたアクセス許可が通知されるのに十分な早さです。権限が取り消された後にシークレット ブレークが使用されなくなったと判断されたワークフローは、権限を追加してすばやく緩和できます。さらに時間が必要な場合は、シークレットの有効期限を更新したり削除したりできます。

たとえば、サービス アカウントが 30 日間にわたって毎日シークレットにアクセスする見込みであると想定します。シークレットの有効期限を、作成から 60 日間に設定し、条件付き IAM バインディングを使用して、サービス アカウントに Secret Accessor のロールを 45 日間付与するとします。サービス アカウントが 45 日経過後にシークレットにアクセスしようとすると、権限拒否エラーが返され、そのシークレットを必要とするワークフローが中断します。シークレット自体はこの先 15 日間は削除されないため、調査中に素早く緩和するために、管理者は Secret Accessor のロールをサービス アカウントに再び付与します。

また、まもなく期限切れになるシークレットのログ警告に基づいてアラートを作成することもできます。詳細については、有効期限のロギングをご覧ください。

タイムスタンプと期間の指定

  • タイムスタンプ値は、RFC 3339 形式にする必要があります(例: 2100-01-01T09:00:00-05:00)。

  • 期間の値は、「s」接尾辞を含む秒数の形式にする必要があります(例: 86400s)。

有効期限付きシークレットを作成する

タイムスタンプを使用して有効期限付きシークレットを作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets create "SECRET_ID" \
    --replication-policy "automatic" \
    --expire-time "TIMESTAMP"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "replication": {"automatic": {}},
  "expire_time": "TIMESTAMP"
}
EOF

期間を使用して有効期限付きシークレットを作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets create "SECRET_ID" \
    --replication-policy "automatic" \
    --ttl "DURATION"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "replication": {"automatic": {}},
  "ttl": "DURATION"
}
EOF

シークレットの有効期限を更新する

有効期限がすでに設定されているかどうかにかかわらず、どのシークレットに対しても、新しい有効期限を適用できます。各シークレットに構成できる有効期限は一度に 1 つのみです。すでに有効期限が設定されているシークレットの有効期限を更新すると、既存の有効期限は上書きされます。

タイムスタンプを使用してシークレットの有効期限を更新します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets update "SECRET_ID" \
    --expire-time "TIMESTAMP"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=expire_time" \
    --request "PATCH" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "expire_time": "TIMESTAMP"
}
EOF

期間を使用してシークレットの有効期限を更新します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets update "SECRET_ID" \
    --ttl "DURATION"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=ttl" \
    --request "PATCH" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "ttl": "DURATION"
}
EOF

シークレットの有効期限を削除する

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets update "SECRET_ID" \
    --remove-expiration

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

expire_time または ttl のいずれかを updateMask に含めても、どちらも値を指定しないと、有効期限は削除されます。

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=ttl" \
    --request "PATCH" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary '{}'

有効期限のロギング

シークレットが自動的に期限切れになると、Cloud Audit Logs は生成されません。代わりに、Secret Manager は、シークレットの有効期限までの特定の間隔で、Secret Manager Secret リソースにログを書き込みます。

ログのタイミング シークレット イベントのタイプ
有効期限の 30 日前 EXPIRES_IN_30_DAYS
有効期限の 7 日前 EXPIRES_IN_7_DAYS
有効期限の 1 日前 EXPIRES_IN_1_DAY
有効期限の 6 時間前 EXPIRES_IN_6_HOURS
有効期限の 1 時間前 EXPIRES_IN_1_HOUR
有効期限 EXPIRED

これらのログを表示する方法については、Logging クイックスタート ガイドをご覧ください。ログベースの指標を作成し、それらを使用して以降の有効期限のアラートを作成できます。

次のステップ