s2_security_groups — version 1.2
Source: presets
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
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:
customer_domain— declared byestate_core; use one of them alongside, or declare it in the estate.infra_project_name— declared byestate_core; use one of them alongside, or declare it in the estate.svc_iac_account— declared byestate_core; use one of them alongside, or declare it in the estate.
Params
| param | default |
|---|---|
gcp |
"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 |
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, {gcp_project_admins_name}, {gcp_network_admins_name}, {gcp_security_admins_name}, {gcp_security_viewers_name}, {gcp_billing_admins_name} |
google |
domain:{customer_domain} (grant map), group:{gcp, group:{gcp, group:{gcp, group:{gcp, group:{gcp, group:{gcp |
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, 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, networkmanagement.admin, compute.viewer, resourcemanager, 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.