gcp-secretmanager-read

secretmanager.versions.access reads the cleartext payload of a secret.

derived gcp emits CanReadSecret

match (effective permission)

{ "action": "secretmanager.versions.access", "resource_type": "google.secretmanager.Secret" }

where

action resolves to a secret/version in scope (per-secret allow policy OR inherited project/folder/org binding) secret is NOT CMEK-encrypted (customerManagedEncryption.kmsKeyName unset) — for CMEK see gcp-secretmanager-read-cmek-gate

emit

source<principal>
target<secret in scope>
permissionssecretmanager.versions.access
conditionsiam_permission resource_policy
state logicACTIVE if versions.access resolves at the secret scope; BLOCKED if a VPC-SC perimeter or IAM deny policy denies secretmanager.versions.access at the effective scope (denied_by=<perimeter/deny>)

Narrative

{principal.name} can read the payload of secret {secret.name} (secretmanager.versions.access / roles/secretmanager.secretAccessor).

Raw rule rules/derived/gcp/secretmanager.yaml

id: gcp-secretmanager-read
emits: CanReadSecret
description: secretmanager.versions.access reads the cleartext payload of a secret.
match_effective_permission:
  action: secretmanager.versions.access
  resource_type: google.secretmanager.Secret
where:
- action resolves to a secret/version in scope (per-secret allow policy OR inherited project/folder/org
  binding)
- "secret is NOT CMEK-encrypted (customerManagedEncryption.kmsKeyName unset) \u2014 for CMEK see gcp-secretmanager-read-cmek-gate"
emit:
  source: <principal>
  target: <secret in scope>
  permissions:
  - secretmanager.versions.access
  conditions:
  - iam_permission
  - resource_policy
  state_logic: ACTIVE if versions.access resolves at the secret scope; BLOCKED if a VPC-SC perimeter or
    IAM deny policy denies secretmanager.versions.access at the effective scope (denied_by=<perimeter/deny>)
  confidence: min(contributing_confidences) * 0.98
  derived_from:
  - <effective secretmanager.versions.access grant>
  false_positive_note: "versions.access (roles/secretmanager.secretAccessor), NOT versions.get, reads\
    \ the payload \u2014 do not emit from versions.get (metadata only). Grant is per-secret/per-scope:\
    \ accessor on secret-a does NOT read secret-b unless the binding is at a common ancestor. Honor IAM\
    \ inheritance scope precisely; a project-scoped grant covers all secrets, a secret-scoped grant does\
    \ not widen. A VPC-SC perimeter or IAM deny denying versions.access -> BLOCKED."
  narrative: '{principal.name} can read the payload of secret {secret.name} (secretmanager.versions.access
    / roles/secretmanager.secretAccessor).'
move · open · esc close