gcp-secretmanager-read
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) — 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>) |
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).'