CIS_GCP_Foundation_4_0 — version 2.19

Source: presets/cis/CIS-GCP-Foundation-4.0.satz

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:

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_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}" ]

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_api_key_services_dry_run Measure first: run 'API keys restricted to the services an application needs' as a DRY RUN instead of enforcing it? edit none —
cis_block_project_ssh_keys_dry_run Measure first: run 'project-wide SSH keys blocked on VM instances' as a DRY RUN instead of enforcing it? edit none —
cis_bucket_retention_dry_run Measure first: run 'bucket retention durations constrained organisation-wide' as a DRY RUN instead of enforcing it? edit none —
cis_cloud_sql_hardening_dry_run Measure first: run 'Cloud SQL public IPs and authorized networks restricted' as a DRY RUN instead of enforcing it? edit none —
cis_confidential_computing_dry_run Measure first: run 'Confidential Computing required on instances' as a DRY RUN instead of enforcing it? edit none —
cis_cloud_sql_iam_and_deletion_protection_dry_run 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_cloud_sql_iam_and_deletion_protection 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_policy_member_principal_sets Which organisations' identities may be granted IAM roles (CIS §1.1, domain restricted sharing)? edit high —
allowed_policy_member_subjects 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-disableSerialPortAccess, iam-managed-disableServiceAccountKeyCreation, iam-managed-disableServiceAccountKeyUpload, iam-managed-preventPrivilegedBasicRolesForDefaultServiceAccounts, iam-automaticIamGrantsForDefaultServiceAccounts, storage-uniformBucketLevelAccess, compute-setNewProjectDefaultToZonalDNSOnly, compute-managed-restrictProtocolForwardingCreationForTypes, compute-skipDefaultNetworkCreation, gcp-resourceLocations, compute-managed-requireOsLogin, gcp-detailedAuditLoggingMode, iam-disableAuditLoggingExemption, compute-requireVpcFlowLogs, storage-publicAccessPrevention, compute-managed-vmCanIpForward, compute-managed-vmExternalIpAccess, essentialcontacts-managed-allowedContactDomains, iam-managed-allowedPolicyMembers, iam-allowedPolicyMemberDomains-superseded (off), compute-requireOsLogin-superseded (off), essentialcontacts-allowedContactDomains-superseded (off), iam-disableServiceAccountKeyCreation-superseded (off), iam-disableServiceAccountKeyUpload-superseded (off), compute-restrictProtocolForwardingCreationForTypes-superseded (off)

Claims

framework control title kind witnesses interpretation
cis-gcp 5.0 1.1.4 Organization policies configured for centralized constraints implements google_org_policy_policy.compute_managed_requireOsLogin
google_org_policy_policy.compute_managed_vmCanIpForward
google_org_policy_policy.compute_managed_vmExternalIpAccess
google_org_policy_policy.compute_requireVpcFlowLogs
google_org_policy_policy.compute_managed_restrictProtocolForwardingCreationForTypes
google_org_policy_policy.compute_setNewProjectDefaultToZonalDNSOnly
google_org_policy_policy.compute_skipDefaultNetworkCreation
google_org_policy_policy.essentialcontacts_managed_allowedContactDomains
google_org_policy_policy.gcp_detailedAuditLoggingMode
google_org_policy_policy.gcp_resourceLocations
google_org_policy_policy.iam_automaticIamGrantsForDefaultServiceAccounts
google_org_policy_policy.iam_disableAuditLoggingExemption
google_org_policy_policy.iam_managed_allowedPolicyMembers
google_org_policy_policy.iam_managed_disableServiceAccountKeyCreation
google_org_policy_policy.iam_managed_disableServiceAccountKeyUpload
google_org_policy_policy.iam_managed_preventPrivilegedBasicRolesForDefaultServiceAccounts
google_org_policy_policy.storage_publicAccessPrevention
google_org_policy_policy.storage_uniformBucketLevelAccess
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_org_policy_policy.iam_managed_allowedPolicyMembers 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_org_policy_policy.iam_managed_allowedPolicyMembers 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 google_org_policy_policy.iam_managed_disableServiceAccountKeyCreation
google_org_policy_policy.iam_managed_disableServiceAccountKeyUpload
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 google_org_policy_policy.iam_managed_disableServiceAccountKeyCreation
google_org_policy_policy.iam_managed_disableServiceAccountKeyUpload
As for 4.0 §1.4 — 5.0 §1.5.
cis-gcp 4.0 1.5 Service accounts without admin privileges implements google_org_policy_policy.iam_managed_preventPrivilegedBasicRolesForDefaultServiceAccounts Default service accounts are prevented from holding privileged basic roles.
cis-gcp 5.0 1.6 Service accounts without admin privileges implements google_org_policy_policy.iam_managed_preventPrivilegedBasicRolesForDefaultServiceAccounts As for 4.0 §1.5 — 5.0 §1.6.
cis-gcp 4.0 1.5 Service accounts without admin privileges contributes google_org_policy_policy.iam_automaticIamGrantsForDefaultServiceAccounts 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_org_policy_policy.iam_automaticIamGrantsForDefaultServiceAccounts As for 4.0 §1.5 — 5.0 §1.6.
cis-gcp 4.0 1.16 Essential Contacts configured for the organisation contributes google_org_policy_policy.essentialcontacts_managed_allowedContactDomains 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_org_policy_policy.essentialcontacts_managed_allowedContactDomains As for 4.0 §1.16 — 5.0 §1.17.
cis-gcp 4.0 2.1 Cloud Audit Logging on all services contributes google_org_policy_policy.gcp_detailedAuditLoggingMode
google_org_policy_policy.iam_disableAuditLoggingExemption
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 google_org_policy_policy.gcp_detailedAuditLoggingMode
google_org_policy_policy.iam_disableAuditLoggingExemption
As for 4.0 §2.1 (5.0 §2.1, unchanged).
cis-gcp 5.0 2.14 Cloud Asset Inventory enabled implements google_project_service.infra_cloudasset_googleapis_com 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_org_policy_policy.compute_skipDefaultNetworkCreation 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_org_policy_policy.compute_skipDefaultNetworkCreation 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_org_policy_policy.compute_requireVpcFlowLogs Subnets must enable VPC Flow Logs.
cis-gcp 5.0 3.10 VPC Flow Logs enabled on subnets implements google_org_policy_policy.compute_requireVpcFlowLogs 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_org_policy_policy.compute_managed_disableSerialPortAccess 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_org_policy_policy.compute_managed_disableSerialPortAccess As for 4.0 §4.5 (5.0 §4.5, unchanged).
cis-gcp 4.0 4.4 OS Login enabled implements google_org_policy_policy.compute_managed_requireOsLogin 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_org_policy_policy.compute_managed_requireOsLogin 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_org_policy_policy.compute_managed_vmCanIpForward Instances may not enable IP forwarding.
cis-gcp 5.0 4.6 IP forwarding not enabled on instances implements google_org_policy_policy.compute_managed_vmCanIpForward 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_org_policy_policy.compute_managed_vmExternalIpAccess Compute instances may not be given external IP addresses.
cis-gcp 5.0 4.9 Compute instances without public IP addresses implements google_org_policy_policy.compute_managed_vmExternalIpAccess 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_org_policy_policy.storage_publicAccessPrevention 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_org_policy_policy.storage_publicAccessPrevention As for 4.0 §5.1 (5.0 §5.1, unchanged).
cis-gcp 4.0 5.2 Uniform bucket-level access enabled implements google_org_policy_policy.storage_uniformBucketLevelAccess 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_org_policy_policy.storage_uniformBucketLevelAccess 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):

Manual duties (a control stays partial until each is attested):

Not every resource this pack contributes is a witness:

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.managed.restrictProtocolForwardingCreationForTypes. 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_project_service.infra_cloudasset_googleapis_com 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.managed.disableServiceAccountKeyCreation 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_api_key_services_dry_run, cis_block_project_ssh_keys_dry_run, cis_bucket_retention_dry_run, cis_cloud_sql_hardening_dry_run, cis_cloud_sql_iam_and_deletion_protection_dry_run, cis_confidential_computing_dry_run. 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/dns-logging.satz. 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_cloud_sql_iam_and_deletion_protection — 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_protocol_forwarding_schemes) 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.managed.disableSerialPortAccess (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_contacts_allowed_domains becomes a LIST param with structured parameters (was the singular essential_contacts_allowed_domain 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_policy_member_subjects default gains the fifth SCC service agent; structured parameters on the managed §1.1 policy
2.0 2026-08-23 retires the legacy iam.allowedPolicyMemberDomains (and its allowed_policy_member_customers param) in favour of the managed iam.managed.allowedPolicyMembers; the §1.1 claim carries duty_legacy_superseded
1.6 2026-08-23 allowed_policy_member_subjects 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_contacts_allowed_domain param (driven by E03's conversion)
1.3 2026-08-21 subjects param on iam_managed_allowedPolicyMembers (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_policy_member_subjects is where an external identity goes before any grant to it applies: Security Command Center's agents and Defender's scanning account among them.