s2_security_groups — version 1.2

Source: presets/security-group-models/s2-security-groups.satz

Purpose

The S2 security group model: S1's five admin groups plus a distinct NETWORK ADMINS group, and the org-level grants split accordingly. In S1 the network authority is folded into project-admins (compute.networkAdmin, compute.xpnAdmin — "Hybrid Connectivity administrators … Network administrators" in their description); S2 carves it out so a network team can own VPCs, Shared VPC, firewalls, DNS and connectivity without the project-admin power over everything else, and project-admins lose exactly those two network roles. Everything else is S1 unchanged.

Groups and grants in ONE file (typed sections beside the estate's own):

To adopt groups that already exist in the tenant: satz adopt --only google_cloud_identity_group --execute Memberships are NOT part of this pack: presets define groups, humans grant membership.

Required from the estate: customer_domain, svc_iac_account, infra_project_name

Use it

params {
  // the pack's own defaults — copy only the lines you change
  gcp_organization_admins_name = "gcp-organization-admins"
  gcp_project_admins_name = "gcp-project-admins"
  gcp_network_admins_name = "gcp-network-admins"
  gcp_security_admins_name = "gcp-security-admins"
  gcp_security_viewers_name = "gcp-security-viewers"
  gcp_billing_admins_name = "gcp-billing-admins"
}

use "presets/security-group-models/s2-security-groups.satz"

Needs from outside the pack:

Params

param default
gcp_organization_admins_name "gcp-organization-admins"
gcp_project_admins_name "gcp-project-admins"
gcp_network_admins_name "gcp-network-admins"
gcp_security_admins_name "gcp-security-admins"
gcp_security_viewers_name "gcp-security-viewers"
gcp_billing_admins_name "gcp-billing-admins"

Questions

What to ask before this pack is configured, and what changing the answer costs.

asks about prompt reversal blast recommends
gcp_organization_admins_name The organization admins group's name (the local part; the customer domain is added) recreate low —
gcp_project_admins_name The project admins group's name (the local part; the customer domain is added) recreate low —
gcp_network_admins_name The network admins group's name (the local part; the customer domain is added) recreate low —
gcp_security_admins_name The security admins group's name (the local part; the customer domain is added) recreate low —
gcp_security_viewers_name The security viewers group's name (the local part; the customer domain is added) recreate low —
gcp_billing_admins_name The billing admins group's name (the local part; the customer domain is added) recreate low —

gcp_organization_admins_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted. This group holds the organisation's highest roles.

gcp_project_admins_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted.

gcp_network_admins_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted. S2's reason to exist: the network authority carved out of project admins.

gcp_security_admins_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted.

gcp_security_viewers_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted.

gcp_billing_admins_name — The address is the group's identity: renaming it later means a new group, every member moved by hand and every role re-granted.

Contributes

resource type labels
google_cloud_identity_group {gcp_organization_admins_name}, {gcp_project_admins_name}, {gcp_network_admins_name}, {gcp_security_admins_name}, {gcp_security_viewers_name}, {gcp_billing_admins_name}
google_organization_iam_member domain:{customer_domain} (grant map), group:{gcp_organization_admins_name}@{customer_domain} (grant map), group:{gcp_project_admins_name}@{customer_domain} (grant map), group:{gcp_network_admins_name}@{customer_domain} (grant map), group:{gcp_security_admins_name}@{customer_domain} (grant map), group:{gcp_security_viewers_name}@{customer_domain} (grant map), group:{gcp_billing_admins_name}@{customer_domain} (grant map)

Claims

None — this pack proves no control by itself.

History

version date change
1.2 2026-09-11 the security-admins group's description says what its roles do — organisation policies, folder IAM, Security Command Center, logging and monitoring, read access — instead of the Security Admin role and organisation, folder and project IAM admin, which the group never held. An in-place description update on the group; no role changes
1.1 2026-09-10 six question blocks, one per group name — each a group's identity, so changing it later is a new group, moved members and re-granted roles. Nothing emitted changes
1.0 2026-09-02 S2 = S1 plus a distinct gcp-network-admins group (compute.networkAdmin, compute.xpnAdmin, compute.securityAdmin, dns.admin, networkconnectivity.hubAdmin, networkmanagement.admin + viewer roles); project-admins lose compute.networkAdmin and compute.xpnAdmin; one typed file

The whole library's history: the changelog in presets/CHANGELOG.md.

Notes

S1 vs S2 — who holds what

Group S1 S2
gcp-organization-admins org/folder/project admin, org-role admin, org-policy admin, project creator, support, billing user unchanged
gcp-project-admins day-2 project ownership (owner, project IAM admin, tag admin, SA creator, bigquery/pubsub admin, logging/monitoring admin) + compute.networkAdmin, compute.xpnAdmin the same minus the two network roles
gcp-network-admins — compute.networkAdmin, compute.xpnAdmin, compute.securityAdmin, dns.admin, networkconnectivity.hubAdmin, networkmanagement.admin, compute.viewer, resourcemanager.folderViewer, logging.viewer, monitoring.viewer
gcp-security-admins org-policy admin, folder IAM admin, SCC admin, security reviewer, cloudasset viewer, logging/monitoring unchanged
gcp-security-viewers viewer + org viewer, security reviewer, cloudasset viewer, log/monitoring viewers unchanged
gcp-billing-admins org viewer, billing admin, billing creator unchanged

Why the split: Shared VPC host projects, firewall policies and hybrid connectivity are org-wide blast radius; S1 hands them to every project admin. S2 gives them to one team without owner or any IAM-admin role — a network admin can wire a project but cannot grant anyone anything. compute.securityAdmin is included because firewall policies (hierarchical rules) need it and compute.networkAdmin alone cannot edit them; dns.admin because private zones and peering are network work in practice.

Roles and teams — who sits where

Group Role in the organization Typical people
gcp-organization-admins Owns the organization: folder tree, org policies, org-level IAM, custom roles. The break-glass tier — a handful of people, ideally never used day to day. Cloud platform lead, the IaC/landing-zone owners
gcp-project-admins Day-2 operation of workload projects: project IAM, service accounts, data/messaging services, logging and monitoring. Cannot change the org or its policies. Platform engineers, application-team leads who run their own projects
gcp-network-admins (S2) Everything that connects: VPCs and subnets, Shared VPC host/service wiring, firewall rules and hierarchical policies, Cloud DNS, VPN/Interconnect/NCC hubs, network diagnostics. No project ownership, no IAM. Network / connectivity team, often the on-prem network team's cloud arm
gcp-security-admins Sets and enforces guardrails: org policies, SCC configuration, folder IAM, log routing. Reads everything for investigations. Security engineering / SOC leads
gcp-security-viewers Read-only across the organization for audit and review; SCC viewer; compliance evidence (report-compliance needs exactly this — cloudasset viewer included). Auditors, compliance, security analysts, external assessors
gcp-billing-admins Billing accounts, budgets, cost allocation, procurement. Finance / FinOps, the commercial owner of the contract

Which model — a team-shape decision

S1 fits when one platform team does both the project administration and the networking — typically up to the low tens of projects, one or two hub VPCs, and the same two or three engineers touching both. The network roles ride along in project-admins because the people are the same; a separate group would only add membership overhead.

S2 fits as soon as network and project administration are different people — a dedicated network/connectivity team, Shared VPC with many service projects, hierarchical firewall policies, hybrid connectivity to an on-prem estate, or a regulator who asks for separation of duties. The network team gets org-wide reach over connectivity and nothing else; project admins keep their projects but can no longer re-wire the network. Choose S2 on day 0 when that team split is already visible on the org chart: moving from S1 to S2 later is a pack swap plus re-adopting the new group, but every project admin silently loses two roles at that apply — announce it.

Both are typed packs for a top-level use, one line each.

Memberships are never in a pack: adopt the groups (satz adopt --only google_cloud_identity_group --execute), then humans add members in the console or with gcloud.