CIS_GCP_Foundation_4_0 — version 2.19
Source: presets
Purpose
The CIS GCP Foundation 4.0 organization-policy set, managed constraints included.
Every constraint the benchmark asks for as an org policy, with the six
superseded legacy twins declared OFF (spec { reset = true }) so that no
organisation ends up with both forms of a constraint enforcing. Some policies
have to be activated before they can be imported.
The benchmark: https://www.cisecurity.org/cis-gcp-foundation-4-0-policies/ Google's constraint catalogue: https://docs.cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints
Use it
params {
use_cis_baseline = true
// the pack's own defaults — copy only the lines you change
cis_block_project_ssh_keys = false
cis_require_shielded_vm = false
cis_confidential_computing = false
cis_cloud_sql_hardening = false
cis_cmek_required = false
cis_api_key_services = false
cis_bucket_retention = false
cis_access_approval = false
cis_cloud_sql_iam_and_deletion_protection = false
cis_sa_key_creation_rules = [ { enforce = "TRUE" } ]
cis_api_key_services_dry_run = false
cis_block_project_ssh_keys_dry_run = false
cis_bucket_retention_dry_run = false
cis_cloud_sql_hardening_dry_run = false
cis_confidential_computing_dry_run = false
cis_cloud_sql_iam_and_deletion_protection_dry_run = false
cis_dns_logging = true
cis_block_internet_ssh_rdp = true
allowed_resource_locations = [ "in:eu-locations", "in:us-locations" ]
allowed_policy_member_principal_sets = [
"//cloudresourcemanager.googleapis.com/organizations/{customer_organization_id}",
]
allowed_policy_member_subjects = [
"serviceAccount:service-org-{customer_organization_id}@security-center-api.iam.gserviceaccount.com",
"serviceAccount:service-org-{customer_organization_id}@gcp-sa-csc-hpsa.iam.gserviceaccount.com",
"serviceAccount:service-org-{customer_organization_id}@gcp-sa-dspm-hpsa.iam.gserviceaccount.com",
"serviceAccount:service-org-{customer_organization_id}@gcp-sa-ee-hpsa.iam.gserviceaccount.com",
"serviceAccount:service-org-{customer_organization_id}@gcp-sa-ktd-hpsa.iam.gserviceaccount.com",
]
allowed_protocol_forwarding_schemes = [ "INTERNAL" ]
essential_contacts_allowed_domains = [ "@{customer_domain}" ]
}
use "presets/cis/CIS-GCP-Foundation-4.0.satz" when use_cis_baseline
use_cis_baseline is the gate: while it is falsy the pack contributes nothing — no resources, no params, no claims. It is declared by estate_map, and the estate's own binding wins.
Needs from outside the pack:
customer_domain— declared byestate_core; use one of them alongside, or declare it in the estate.customer_organization_id— declared byestate_core; use one of them alongside, or declare it in the estate.
Params
| param | default |
|---|---|
cis_block_project_ssh_keys |
false |
cis_require_shielded_vm |
false |
cis_confidential_computing |
false |
cis_cloud_sql_hardening |
false |
cis_cmek_required |
false |
cis_api_key_services |
false |
cis_bucket_retention |
false |
cis_access_approval |
false |
cis |
false |
cis_sa_key_creation_rules |
[ { enforce = "TRUE" } ] |
cis |
false |
cis |
false |
cis |
false |
cis |
false |
cis |
false |
cis |
false |
cis_dns_logging |
true |
cis_block_internet_ssh_rdp |
true |
allowed_resource_locations |
[ "in:eu-locations", "in:us-locations" ] |
allowed |
[ " |
allowed |
[ "service |
allowed |
[ "INTERNAL" ] |
essential |
[ "@{customer_domain}" ] |
Questions
What to ask before this pack is configured, and what changing the answer costs.
| asks about | prompt | reversal | blast | recommends |
|---|---|---|---|---|
cis_block_project_ssh_keys |
Block project-wide SSH keys on every instance (CIS 4.3)? | edit | low | — |
cis_require_shielded_vm |
Require Shielded VM for every new instance (CIS 4.8)? | edit | high | — |
cis_confidential_computing |
Require Confidential Computing for every new instance (CIS 4.11, Level 2)? | edit | high | — |
cis_cloud_sql_hardening |
Forbid public IPs and open authorized networks on Cloud SQL (CIS 6.5, 6.6)? | edit | high | — |
cis |
Measure first: run 'API keys restricted to the services an application needs' as a DRY RUN instead of enforcing it? | edit | none | — |
cis |
Measure first: run 'project-wide SSH keys blocked on VM instances' as a DRY RUN instead of enforcing it? | edit | none | — |
cis |
Measure first: run 'bucket retention durations constrained organisation-wide' as a DRY RUN instead of enforcing it? | edit | none | — |
cis |
Measure first: run 'Cloud SQL public IPs and authorized networks restricted' as a DRY RUN instead of enforcing it? | edit | none | — |
cis |
Measure first: run 'Confidential Computing required on instances' as a DRY RUN instead of enforcing it? | edit | none | — |
cis |
Measure first: run 'Cloud SQL IAM authentication and deletion protection required' as a DRY RUN instead of enforcing it? | edit | none | — |
cis_cmek_required |
Require customer-managed encryption keys for new resources (CIS 7.2, 7.3, 8.1)? | edit | high | — |
cis_api_key_services |
Restrict API keys to the services an application needs (CIS 4.0 §1.14 / 5.0 §1.15)? | edit | high | — |
cis_bucket_retention |
Constrain bucket retention durations organisation-wide (CIS 4.0 §2.3 / 5.0 §2.4)? | edit | low | — |
cis_access_approval |
Require an approval before Google personnel reach the organisation's content (Access Approval, CIS 4.0 §2.15 / 5.0 §2.16)? | edit | low | — |
cis_block_internet_ssh_rdp |
Deny SSH and RDP from the internet across the whole organisation (CIS 3.6, 3.7)? | edit | high | — |
cis |
Require IAM database authentication and deletion protection on Cloud SQL (CIS 5.0 §6.6, §6.9)? | edit | high | — |
cis_dns_logging |
Require Cloud DNS policies to log queries (CIS 5.0 §2.13)? | edit | low | — |
allowed_resource_locations |
Where may resources be created (gcp.resourceLocations)? | edit | high | — |
allowed |
Which organisations' identities may be granted IAM roles (CIS §1.1, domain restricted sharing)? | edit | high | — |
allowed |
Which individual principals may be granted roles despite the lock (Google service agents)? | edit | high | — |
cis_block_project_ssh_keys — An estate that relies on project-wide keys for break-glass access loses it the moment this is enforced, and the managed constraint is still PREVIEW with no legacy form to fall back to. Per-instance keys and OS Login keep working.
cis_require_shielded_vm — Not every image supports Shielded VM: an organisation with custom or older images fails instance creation until they are rebuilt — and this is the one constraint with no dry-run, so it cannot be rehearsed before it bites.
cis_confidential_computing — Confidential VMs are limited to particular machine families and cost more; enforced organisation-wide this stops most ordinary workloads from starting.
cis_cloud_sql_hardening — Existing instances reached over a public IP lose connectivity the moment this is enforced; the private path has to exist first.
cis_api_key_services_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_api_key_services, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_api_key_services on.
cis_block_project_ssh_keys_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_block_project_ssh_keys, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_block_project_ssh_keys on.
cis_bucket_retention_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_bucket_retention, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_bucket_retention on.
cis_cloud_sql_hardening_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_cloud_sql_hardening, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_cloud_sql_hardening on.
cis_confidential_computing_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_confidential_computing, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_confidential_computing on.
cis_cloud_sql_iam_and_deletion_protection_dry_run — Google evaluates the rule and logs every action it would have blocked, blocking none of them, so the violation count is this organisation's own answer to whether enforcing it causes an outage. Turn this on INSTEAD of cis_cloud_sql_iam_and_deletion_protection, not beside it. Nothing is enforced while it runs and the control reports as unmet, which is the truth; promote by switching this off and cis_cloud_sql_iam_and_deletion_protection on.
cis_cmek_required — The most disruptive control in the set: every new resource of a listed service must be created with a CMEK, so the key rings, the keys and the grants have to exist first — and the pack cannot know which projects may supply keys.
cis_api_key_services — An API key that today calls anything stops working the moment this is enforced unless its targets are already narrowed. Set the allowed services first, then enforce.
cis_bucket_retention — It constrains EVERY bucket, not only the log sink's: once set, a bucket may carry a retention policy only if its duration is in the list, so buckets on other durations can no longer be updated.
cis_access_approval — Every support case that needs to look at the customer's content then waits for someone on the notification list to approve. Access Transparency (CIS 4.0 §2.14 / 5.0 §2.15) is a MANUAL prerequisite: an organisation administrator holding Access Transparency Admin (roles/axt.admin) switches it on in the Cloud console under IAM & Admin → Settings → Enable Access Transparency, before the apply that creates the Access Approval settings — there is no gcloud command, API or provider resource for it, it needs a Standard, Enhanced or Premium support plan, and the apply fails without it.
cis_block_internet_ssh_rdp — On by default, because an organisation that has not closed ports 22 and 3389 to the internet is one scan away from the finding it will be asked about. A hierarchical firewall policy on the organisation is read before every VPC rule: a session reaching an instance from a PUBLIC address on either port ends the moment the policy attaches. Internal administration is not touched — the pass list carries the three private blocks as well as Google's IAP range — so what breaks is a bastion with an external IP, which needs its range listed or its access moved to IAP. Every rule logs, which is what fills the firewall half of a SIEM. Answering no is a deviation and needs a reason an auditor will read.
cis_cloud_sql_iam_and_deletion_protection — Every Cloud SQL create and update in the organisation must then carry both settings; tooling that creates instances without them fails, and an existing instance that lacks one is refused its next update until that update adds it.
cis_dns_logging — On by default: DNS query logs are how a compromised host asking for its command-and-control domain becomes visible, and they are small beside flow logs — one entry per query, no sampling knob. What it enforces is only half the control: a DNS policy that exists must have logging on, because no org policy can require that a network HAS a policy at all. The other half is verified live — report-compliance names the networks without one. What it breaks: creating or updating a DNS policy with logging off is refused. Answering no is a deviation and needs a reason.
allowed_resource_locations — Data residency is the customer's decision, not the pack's. Narrowing later refuses creation outside the list and leaves what already exists elsewhere non-compliant; widening later is what an operator once did by hand, and the next apply undid it.
allowed_policy_member_principal_sets — The default is the customer's own organisation. A partner organisation whose identities need roles here has to be listed, or every grant to them is refused; one listed too many opens the estate to a directory the customer does not control.
allowed_policy_member_subjects — The default is Security Command Center's five organisation-level service agents, canonical and free to allow. A product whose service agent is not listed fails at the grant — Firebase Hosting, for one. Overriding REPLACES the list: keep the five when adding. A pack that needs a principal allowed contributes it itself; this answer is for the estate's own exceptions.
Notices
What to run once this pack is switched on. satz shows each notice when the pack goes on and until the estate binds its param true; every command that writes to the organisation refuses while one whose severity is error is open.
| param | run | severity | what and why |
|---|---|---|---|
cis_baseline_adopted |
satz adopt <estate> --execute --import |
error | Google sets some of these policies on every new organisation, and an administrator may have set others; an apply that creates a policy that exists stops on 409 POLICY_ALREADY_EXISTS. Run satz adopt once the baseline is on, so every live policy is in the state before the apply; with --import it binds this param itself when it has run. |
Contributes
| resource type | labels |
|---|---|
google_org_policy_policy |
compute-managed-disable, iam-managed-disable, iam-managed-disable, iam-managed-prevent, iam-automatic, storage-uniform, compute-set, compute-managed-restrict, compute-skip, gcp-resourceLocations, compute-managed-require, gcp-detailed, iam-disable, compute-requireVpcFlowLogs, storage-public, compute-managed-vm, compute-managed-vm, essentialcontacts-managed-allowed, iam-managed-allowed, iam-allowed (off), compute-require (off), essentialcontacts-allowed (off), iam-disable (off), iam-disable (off), compute-restrict (off) |
Claims
| framework | control | title | kind | witnesses | interpretation |
|---|---|---|---|---|---|
| cis-gcp 5.0 | 1.1.4 | Organization policies configured for centralized constraints | implements | googlegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegooglegoogle |
The organization carries a centrally managed org-policy baseline: every constraint this pack emits applies at the organization node and is inherited by every folder and project beneath it. |
| cis-gcp 4.0 | 1.1 | Corporate login credentials only | implements | google |
Domain Restricted Sharing, enforced by the MANAGED constraint alone: only the listed principal sets may be granted roles, plus the individually listed subjects. Consumer accounts cannot be granted roles. The legacy iam.allowedPolicyMemberDomains is deliberately declared OFF (reset = true) rather than merely left out, so a policy already set on the organisation cannot keep enforcing beside this one — see duty_legacy_superseded. |
| cis-gcp 5.0 | 1.2 | Corporate login credentials only | implements | google |
As for 4.0 §1.1 — 5.0 §1.2 (5.0 inserted a new §1.1 'Organization resources' subsection, shifting the former 1.x up by one). |
| cis-gcp 4.0 | 1.4 | Only GCP-managed service account keys | implements | googlegoogle |
User-managed service account keys can neither be created nor uploaded org-wide, leaving only Google-managed keys. |
| cis-gcp 5.0 | 1.5 | Only GCP-managed service account keys | implements | googlegoogle |
As for 4.0 §1.4 — 5.0 §1.5. |
| cis-gcp 4.0 | 1.5 | Service accounts without admin privileges | implements | google |
Default service accounts are prevented from holding privileged basic roles. |
| cis-gcp 5.0 | 1.6 | Service accounts without admin privileges | implements | google |
As for 4.0 §1.5 — 5.0 §1.6. |
| cis-gcp 4.0 | 1.5 | Service accounts without admin privileges | contributes | google |
Also disables the automatic Editor grant to default service accounts at project creation. |
| cis-gcp 5.0 | 1.6 | Service accounts without admin privileges | contributes | google |
As for 4.0 §1.5 — 5.0 §1.6. |
| cis-gcp 4.0 | 1.16 | Essential Contacts configured for the organisation | contributes | google |
Restricts which domains may be set as Essential Contacts. The contact itself is declared by the essential-contacts-organization pack, which carries the implements claim. |
| cis-gcp 5.0 | 1.17 | Essential Contacts configured for the organisation | contributes | google |
As for 4.0 §1.16 — 5.0 §1.17. |
| cis-gcp 4.0 | 2.1 | Cloud Audit Logging on all services | contributes | googlegoogle |
Detailed audit logging mode plus a ban on per-principal audit-logging exemptions keep the audit trail complete. The audit config itself is declared by the audit-logsink pack. |
| cis-gcp 5.0 | 2.1 | Cloud Audit Logging on all services | contributes | googlegoogle |
As for 4.0 §2.1 (5.0 §2.1, unchanged). |
| cis-gcp 5.0 | 2.14 | Cloud Asset Inventory enabled | implements | google |
The Cloud Asset API is enabled in the estate's infrastructure project, which is what makes the organisation's inventory and its history queryable — and is what report-compliance itself reads through to verify every other control live. |
| cis-gcp 4.0 | 3.1 | Default network does not exist | implements | google |
New projects are created without the auto-mode default VPC and its permissive firewall rules. |
| cis-gcp 5.0 | 3.1 | Default network does not exist | implements | google |
As for 4.0 §3.1 (5.0 §3.1, unchanged). |
| cis-gcp 4.0 | 3.8 | VPC Flow Logs enabled on subnets | implements | google |
Subnets must enable VPC Flow Logs. |
| cis-gcp 5.0 | 3.10 | VPC Flow Logs enabled on subnets | implements | google |
As for 4.0 §3.8 — 5.0 §3.10 (5.0 inserted 3.8 VPC Service Controls and 3.9 Private Service Connect). |
| cis-gcp 4.0 | 4.5 | Serial port access not enabled on VM instances | implements | google |
The serial-port-enable metadata key cannot be set to true, so no VM exposes an interactive serial console. |
| cis-gcp 5.0 | 4.5 | Serial port access not enabled on VM instances | implements | google |
As for 4.0 §4.5 (5.0 §4.5, unchanged). |
| cis-gcp 4.0 | 4.4 | OS Login enabled | implements | google |
OS Login is required, so VM SSH access is governed by IAM rather than metadata keys. |
| cis-gcp 5.0 | 4.4 | OS Login enabled | implements | google |
As for 4.0 §4.4 (5.0 §4.4, unchanged). |
| cis-gcp 4.0 | 4.6 | IP forwarding not enabled on instances | implements | google |
Instances may not enable IP forwarding. |
| cis-gcp 5.0 | 4.6 | IP forwarding not enabled on instances | implements | google |
As for 4.0 §4.6 (5.0 §4.6, unchanged). |
| cis-gcp 4.0 | 4.9 | Compute instances without public IP addresses | implements | google |
Compute instances may not be given external IP addresses. |
| cis-gcp 5.0 | 4.9 | Compute instances without public IP addresses | implements | google |
As for 4.0 §4.9 (5.0 §4.9, unchanged). |
| cis-gcp 4.0 | 5.1 | Storage buckets not anonymously or publicly accessible | implements | google |
Public access prevention is enforced, so buckets cannot be exposed to allUsers or allAuthenticatedUsers. |
| cis-gcp 5.0 | 5.1 | Storage buckets not anonymously or publicly accessible | implements | google |
As for 4.0 §5.1 (5.0 §5.1, unchanged). |
| cis-gcp 4.0 | 5.2 | Uniform bucket-level access enabled | implements | google |
Uniform bucket-level access disables object ACLs; bucket access is governed by IAM alone. |
| cis-gcp 5.0 | 5.2 | Uniform bucket-level access enabled | implements | google |
As for 4.0 §5.2 (5.0 §5.2, unchanged). |
What the controls ask (this project's paraphrase from the catalog — never the framework's own text):
- Cloud Asset Inventory enabled (cis-gcp 5.0 §2.14) — The Cloud Asset API is enabled so the organisation's resource inventory can be queried and its history kept.
- Cloud Audit Logging on all services (cis-gcp 4.0 §2.1, cis-gcp 5.0 §2.1) — Data Access audit logs (ADMIN_READ/DATA_READ/DATA_WRITE) enabled org-wide for all services.
- Compute instances without public IP addresses (cis-gcp 4.0 §4.9, cis-gcp 5.0 §4.9) — VMs are not reachable directly from the internet via external IPs.
- Corporate login credentials only (cis-gcp 4.0 §1.1, cis-gcp 5.0 §1.2) — IAM grants are restricted to identities from the organisation's own directory; consumer accounts cannot be granted roles.
- Default network does not exist (cis-gcp 4.0 §3.1, cis-gcp 5.0 §3.1) — New projects are created without the auto-mode default VPC and its permissive firewall rules.
- Essential Contacts configured for the organisation (cis-gcp 4.0 §1.16, cis-gcp 5.0 §1.17) — Organisation-level Essential Contacts are set so Google security, billing and legal notices reach a monitored address.
- IP forwarding not enabled on instances (cis-gcp 4.0 §4.6, cis-gcp 5.0 §4.6) — Instances may not forward packets for addresses other than their own.
- OS Login enabled (cis-gcp 4.0 §4.4, cis-gcp 5.0 §4.4) — VM SSH access goes through OS Login and IAM rather than project-wide or instance metadata keys.
- Only GCP-managed service account keys (cis-gcp 4.0 §1.4, cis-gcp 5.0 §1.5) — User-managed service account keys cannot be created or uploaded; only Google-managed keys exist.
- Organization policies configured for centralized constraints (cis-gcp 5.0 §1.1.4) — An organization-level policy baseline (resource locations, OS Login, external IPs, uniform bucket access, allowed member domains …) constrains every project centrally.
- Serial port access not enabled on VM instances (cis-gcp 4.0 §4.5, cis-gcp 5.0 §4.5) — Interactive serial console access is off, so a VM cannot be reached outside IAM-governed paths.
- Service accounts without admin privileges (cis-gcp 4.0 §1.5, cis-gcp 5.0 §1.6) — Default service accounts do not receive primitive or privileged roles automatically.
- Storage buckets not anonymously or publicly accessible (cis-gcp 4.0 §5.1, cis-gcp 5.0 §5.1) — Public access prevention is enforced so buckets cannot be exposed to allUsers/allAuthenticatedUsers.
- Uniform bucket-level access enabled (cis-gcp 4.0 §5.2, cis-gcp 5.0 §5.2) — Object ACLs are disabled; access is governed by IAM alone.
- VPC Flow Logs enabled on subnets (cis-gcp 4.0 §3.8, cis-gcp 5.0 §3.10) — Subnets record flow logs so network traffic is auditable.
Manual duties (a control stays partial until each is attested):
appliances(cis-gcp 4.0 §4.6, cis-gcp 5.0 §4.6) — NAT gateways and network appliances legitimately need IP forwarding; grant an exception deliberately rather than relaxing the org policy.existing-vms(cis-gcp 4.0 §4.4, cis-gcp 5.0 §4.4) — Enforcing OS Login can cut existing SSH access patterns; verify before enabling on an org with running VMs.legacy-superseded(cis-gcp 5.0 §1.2) — The legacy iam.allowedPolicyMemberDomains is superseded, not forgotten — see the 4.0 claim for why running it would weaken rather than strengthen the control.legacy-superseded(cis-gcp 4.0 §1.1) — The legacy iam.allowedPolicyMemberDomains is superseded, not forgotten. Google states it cannot configure exceptions for specific principals, so its only remedy for granting a Google service agent is to DISABLE the constraint, grant, and re-enable. Running it therefore does not add protection — it converts every service activation into a window where domain-restricted sharing is switched off org-wide. The managed constraint enforces the same control continuously while naming its exceptions explicitly, which is why this baseline runs the managed constraint alone and, since v2.5, declares the legacy one reset instead of simply omitting it: an omitted constraint that is already set on the organisation goes on enforcing, unseen by the apply.review-allowlist(cis-gcp 4.0 §1.1, cis-gcp 5.0 §1.2) — Re-check allowed_policy_member_principal_sets / _subjects whenever a partner directory is added or a Google-managed service agent needs a grant.review-baseline(cis-gcp 5.0 §1.1.4) — The baseline is a decision, not a default — re-read it when the organisation adds a workload class the current constraints were not chosen for.
Not every resource this pack contributes is a witness:
google— declared OFF (_org _policy _policy .iam _allowedPolicyMemberDomains _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.google— declared OFF (_org _policy _policy .compute _requireOsLogin _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.google— declared OFF (_org _policy _policy .essentialcontacts _allowedContactDomains _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.google— declared OFF (_org _policy _policy .iam _disable Service Account Key Creation _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.google— declared OFF (_org _policy _policy .iam _disable Service Account Key Upload _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.google— declared OFF (_org _policy _policy .compute _restrict Protocol Forwarding Creation For Types _superseded spec { reset = true }): a superseded legacy twin, which proves nothing by design.
History
| version | date | change |
|---|---|---|
| 2.19 | 2026-09-30 | every claim states its measure without satz: gcloud (the commands that meet the control the way the claim's resources do), gcloud_check (the commands that show whether it is met) and risk (what goes wrong without it); require and report-compliance carry them in each control's measures. Nothing emitted changes |
| 2.18 | 2026-09-30 | the header comment on the extensions says what compute.requireVpcFlowLogs does: it refuses a subnet without flow logs, so every subnet the estate or another pack declares carries a log_config. Nothing emitted changes |
| 2.17 | 2026-09-22 | the cis_access_approval question states Access Transparency (CIS 4.0 §2.14 / 5.0 §2.15) as the manual prerequisite it is: an organisation administrator with roles/axt.admin switches it on in the Cloud console before the apply, there is no gcloud command, API or provider resource for it, and it needs a Standard, Enhanced or Premium support plan. The catalogs now carry that control as organizational, so report-compliance lists it. Nothing emitted changes |
| 2.16 | 2026-09-20 | the notice's before = apply becomes severity = error: the same refusal, stated once by the pack instead of inside the two commands that read it — every command that writes to the organisation refuses while it is open. Nothing emitted changes, and the param that acknowledges it is unchanged |
| 2.15 | 2026-09-19 | a notice: once the baseline is switched on, satz adopt <estate> --execute --import is to run before the apply — Google sets some of these policies on every new organisation, and the first apply of the 2026-09-17 onboarding stopped on 409 POLICY_ALREADY_EXISTS for compute. The estate acknowledges it with cis_baseline_adopted = true, which adopt --execute --import binds itself when it has run; transpile --apply and bootstrap refuse while it is open. The param is never emitted, so the plan does not move |
| 2.14 | 2026-09-17 | the pack declares its own google_org_policy_policy { … } and is used bare at the top level, gated on use_cis_baseline, exactly like every CIS extension. Nothing emitted changes — both use forms resolve to the same addresses and the same manifest — so an estate's plan does not move. What changes is that the baseline is a pack like the others: the interview can switch it on, the compile reports it when its answer is true and its line is not in, and satz-studio lists it. An estate that keeps the old google_org_policy_policy { use … } wrapper is refused, because as a map's content the pack's type key would be read as a label and the whole baseline would collapse into one resource |
| 2.13 | 2026-09-13 | claims CIS 5.0 §2.14, Cloud Asset Inventory enabled — the last technical control of CIS 5.0 with no claim anywhere in the library. The estate already satisfied it: the scaffold enables cloudasset.googleapis.com in every infrastructure project, so the witness is the scaffold's own google rather than a second google_project_service declared here — two resources enabling one API on one project is a duplicate, not a merge. The address depends on the infra project label, which is already a contract (bootstrap imports by it) and is now held by the init-template test, so renaming it breaks a test rather than a customer's report |
| 2.12 | 2026-09-13 | iam takes its rules from cis_sa_key_creation_rules instead of writing them in place, so an estate can let ONE service account out with a tag condition without forking the pack. The default is the plain enforcing rule and the emitted policy is unchanged for an estate that says nothing. The one constraint here with a rules param, because it is the one organisations actually have to exempt — Google ships their own built-in exemption tag for it — and because a param per constraint would put forty list-of-object blocks into every estate's terraform.tfvars for a case nobody has |
| 2.11 | 2026-09-13 | six dry-run params and their questions: cis, cis, cis, cis, cis, cis. Each gates the dry-run twin of the extension it names, to be turned on INSTEAD of the enforcing flag — both at once declares the same policy twice and is refused. The other five extensions have no dry-run form: Shielded VM and both CMEK constraints are legacy, Access Approval is not an org policy, and the two on-by-default extensions have nothing to size |
| 2.10 | 2026-09-12 | cis_block_internet_ssh_rdp defaults to TRUE, the second flag to do so. An estate taking this version emits an organisation firewall policy it did not have: ports 22 and 3389 are denied from public addresses, the private ranges and IAP pass to the VPC rules, and the denies log. Answering no is a deviation whose reason the compliance report carries (ADR 0012) |
| 2.9 | 2026-09-12 | one new flag, and the first that defaults to TRUE: cis_dns_logging, for the new cis-extensions. It asks what the control covers and what it breaks; answering no is a deviation whose reason the compliance report carries |
| 2.8 | 2026-09-11 | three more opt-in flags with their questions — cis_access_approval, cis_block_internet_ssh_rdp, cis — for the three new cis-extensions/ fragments. Nothing emitted changes; an estate using the pack has three more questions, all defaulting to off |
| 2.7 | 2026-09-10 | ten question blocks: the seven opt-in controls and the three lists a customer decides (locations, principal sets, subjects), each with the sentence that says what breaks when the answer is wrong. Nothing emitted changes; an estate using the pack has ten questions to answer before bootstrap or apply — all with defaults, so satz interview --accept-defaults settles them in one pass. Not asked: the protocol-forwarding schemes and the contacts domain, which are technical defaults rather than decisions |
| 2.6 | 2026-09-08 | gcp.resourceLocations becomes the allowed_resource_locations param (default = the two multi-region groups it always emitted, so no estate changes on upgrade) — a hard-coded value silently widened a policy an operator had narrowed by hand. And the six superseded legacy blocks take a -superseded address suffix, which makes the switch to spec { reset = true } a REPLACE by construction: the provider PATCHes the rules it holds together with reset and the API refuses the pair (400 Cannot set PolicyRules if reset is true), so the in-place form v2.5 assumed never worked. Estates upgrading from 2.4 or 2.5 see one destroy + create per legacy policy, in the plan, instead of needing tofu apply -replace= by hand |
| 2.5 | 2026-09-04 | runs the MANAGED protocol-forwarding constraint (parameters.allowedSchemes, param allowed) and declares all six superseded legacy twins OFF with reset = true, so no estate ends up with both forms enforcing |
| 2.4 | 2026-09-04 | adds compute (4.5) to the baseline — safe by default — and declares the seven opt-in flags the cis-extensions/ fragments are gated on |
| 2.3 | 2026-09-03 | claims the SAME resources against CIS 5.0 as well as 4.0 — no second pack, because 5.0's org-policy content is identical and only renumbered (1.1→1.2, 1.4→1.5, 1.5→1.6, 1.16→1.17, 3.8→3.10; §2, §4, §5 unchanged). Plus a new 5.0 1.1.4 implements over the whole baseline: the control asks whether the organisation constrains its projects centrally, which is what the pack is |
| 2.2 | 2026-09-01 | essential becomes a LIST param with structured parameters (was the singular essential inside a JSON string) — several contact domains no longer fork the pack; estates that bound the singular param bind the list instead |
| 2.1 | 2026-08-24 | allowed default gains the fifth SCC service agent; structured parameters on the managed §1.1 policy |
| 2.0 | 2026-08-23 | retires the legacy iam (and its allowed param) in favour of the managed iam; the §1.1 claim carries duty_legacy_superseded |
| 1.6 | 2026-08-23 | allowed param: the canonical SCC service agents allowlisted under the managed §1.1 constraint |
| 1.5 | 2026-08-22 | the 23-control catalog; claims for every control the pack implements |
| 1.4 | 2026-08-22 | essential param (driven by E03's conversion) |
| 1.3 | 2026-08-21 | subjects param on iam (allowedMemberSubjects explicit) |
| 1.2 | 2026-08-20 | pristine baseline as converted to Satz |
The whole library's history: the changelog in presets/CHANGELOG.md.
Notes
Six of the twenty-six policies are the legacy twins of a managed constraint, declared off at -superseded addresses. An estate coming from an earlier version of this pack holds them at their old addresses, so satz adopt --only google_org_policy_policy --execute --import moves them before the first apply; a plan that proposes to DESTROY one of them is the sign that step is still owed. satz plan/apply add the -replace such a twin needs (the API refuses rules and reset = true in one update).
The ten cis_* params here are the gates of presets/cis/ — one page each, each with the cost of switching it on. allowed is where an external identity goes before any grant to it applies: Security Command Center's agents and Defender's scanning account among them.