Architecture GCP

GCP Landing Zone: Identity & Access — Cloud Identity, Groups, IAM, Service Accounts & Workload Identity Federation

Where this fits

In Part 1 we built the resource hierarchy — the Organization node, folders, and projects that give Google Cloud its shape. Identity & Access is the layer that decides who and what may act on that hierarchy, and with what privilege. On Google Cloud every authenticated action resolves to a principal (a human, a group, or a workload) evaluated against an IAM allow policy attached somewhere on the hierarchy and inherited downward. Get this layer wrong and the hierarchy is just expensive scaffolding; get it right and every later phase — networking, security, CI/CD — inherits clean, auditable, least-privilege access. This article goes deep on the five pillars that make that possible: Cloud Identity as the identity source of truth, Google Groups as the unit of grant, IAM roles and policies as the grammar of authorization, service accounts plus Workload Identity Federation for non-human and cross-cloud access, and least-privilege design as the discipline that ties them together.

Google Cloud Landing Zone Design — animated overview

Cloud Identity — the source of truth for principals

What it is. Cloud Identity is Google’s standalone Identity-as-a-Service (IDaaS) product — effectively Google Workspace without the productivity apps. It provisions the Google Cloud Organization resource the first time it is associated with a verified DNS domain, and it owns the lifecycle of every human principal (user: members), every group:, and the super administrators who sit above the entire org. Without a Cloud Identity (or Workspace) account you cannot have an Organization node, and without an Organization node you have no hierarchy to inherit policy through — so Cloud Identity is genuinely the foundation stone of the landing zone, not an afterthought.

Why it matters. Cloud Identity is where the authoritative list of people lives. In almost every enterprise that list already exists in an external IdP — Microsoft Entra ID (Azure AD), Okta, or Ping. The landing-zone decision is therefore not “do we use Cloud Identity?” but “how does our existing IdP federate and provision into it?” The standard pattern is SAML 2.0 / OIDC for authentication (the IdP issues the assertion, Google trusts it) combined with automated provisioning via SCIM or Google Cloud Directory Sync (GCDS) so that joiners, movers, and leavers in the HR-driven IdP flow into Cloud Identity without manual toil. Federating SSO but forgetting provisioning is a classic mistake — you end up with orphaned Google accounts that outlive employment.

How to do it well.

Key artifacts & decisions

Decision Options Landing-zone default
Identity edition Cloud Identity Free / Premium, or Workspace Cloud Identity Premium (device mgmt, security centre, more API quota)
Authentication Google-native vs federated SSO Federated SAML/OIDC to corporate IdP
Provisioning Manual, GCDS, or SCIM GCDS (AD-centric) or SCIM (Entra/Okta)
Super admins Count and protection 2–4 break-glass, FIDO2 + Advanced Protection
Domains Primary + secondaries Verify all corporate domains; block consumer-account takeover

Google Groups — the unit of grant, never the user

What it is. A Google Group is a named collection of members (group:platform-admins@example.com) that is itself a valid IAM principal. Crucially, IAM treats a group exactly like a user when evaluating policy — so you bind roles to groups, and membership of the group is what actually confers access. Groups can nest (a group can be a member of another group), and that nesting is the lever that lets you model business reality without exploding the number of IAM bindings.

Why it matters. This is the single highest-leverage practice in GCP access management. If you bind roles directly to individual user: members, then onboarding, offboarding, and audits become a sprawling search across hundreds of projects’ IAM policies. Bind to groups instead and the entire access posture of a person is governed by which groups they belong to — a question answered (and provisioned) by your IdP. Access reviews collapse from “audit every binding” to “audit group membership,” and offboarding becomes a single membership removal in the IdP that propagates everywhere.

How to do it well.

Group layer Example Bound to a role? Membership source
Function group gcp-org-billing-admins Yes (Billing Account Admin) Nested people groups
Environment group gcp-retail-prod-developers Yes (custom Developer role at folder) Nested team groups
People/team group team-checkout-engineering No (only nests upward) IdP / HR feed
Break-glass group gcp-org-breakglass Yes (Org Admin, time-boxed) Manual, tiny, alerted

IAM roles and policies — the grammar of authorization

What it is. Google Cloud IAM answers a single question: can this principal perform this permission on this resource? The answer is computed from an allow policy (Policy) — a set of bindings, each pairing a role (a bundle of permissions like roles/compute.networkAdmin) with one or more members and an optional IAM Condition. Policies attach to the Organization, a folder, a project, or in many cases an individual resource, and they inherit downward and are additive/union — a principal’s effective permissions are the union of everything granted at every level above and at the resource itself. There is no “deny by being more specific”; broad grants high in the hierarchy are dangerous precisely because they cannot be narrowed lower down except by IAM Deny policies.

Why it matters. Three role types exist and choosing among them is a real landing-zone decision:

Role type Examples When to use Caution
Basic (primitive) roles/owner, roles/editor, roles/viewer Almost never in production Thousands of permissions; editor can modify nearly everything — ban above sandbox
Predefined roles/compute.networkAdmin, roles/bigquery.dataViewer The default workhorse Google-maintained; granular; still review for scope
Custom org-level org.kvNetworkOperator When predefined is too broad/narrow You own maintenance as Google adds permissions

How to do it well.

A subtle but critical artifact is the IAM policy evaluation model your team must internalise: Deny policies are evaluated first and win; otherwise the union of all inherited allow bindings applies. Document this, because engineers coming from AWS expect explicit-deny-beats-allow everywhere, and on GCP allow policies are union-only.

Service accounts and Workload Identity Federation — identity for the things that aren’t people

What they are. A service account (SA) is a special principal that represents a workload rather than a human — a Compute Engine VM, a GKE pod, a Cloud Run service, a CI job. It is both an identity (it appears in IAM bindings as serviceAccount:...) and a resource (it has its own IAM policy controlling who may act as it). Historically workloads authenticated as an SA using a downloaded JSON service-account key — a long-lived static secret. That key is the single most common GCP credential-leak vector, which is why the modern landing zone treats exported SA keys as essentially forbidden and replaces them with two keyless mechanisms.

Why keyless matters — the two pillars:

How to do it well.

Workload location Recommended identity mechanism Static key?
Compute Engine / Cloud Run / Cloud Functions Attached SA + metadata server No
GKE pods GKE Workload Identity (KSA→GSA) No
GitHub Actions / GitLab CI Workload Identity Federation (OIDC) No
AWS or Azure workloads calling GCP WIF with AWS/Azure provider No
Legacy / unsupported external system SA key only as last resort, short rotation + Secret Manager Avoid

Least-privilege design — the discipline that ties it together

What it is. Least privilege is the operating principle that every principal — human or workload — holds the minimum roles needed for its task, at the narrowest scope, for the shortest time. On GCP this is not a single feature but a composition of the four pillars above plus a set of supporting tools that measure and enforce the principle continuously.

How to do it well — the GCP toolchain:

Discipline GCP tool / mechanism KPI to track
Remove unused permissions IAM Recommender Excess-permission ratio → 0
Eliminate standing privilege Privileged Access Manager (JIT) % of privileged access that is standing
Group-based grants Google Groups + IdP % of bindings to groups vs users (target ~100%)
Keyless workloads WIF + attached SAs + key-creation deny Count of exported SA keys (target 0)
Prevent misconfig Org Policy Service # of high-risk org-policy violations
Answer “who can do what” Policy Analyzer Time to complete an access review

Real-world enterprise scenario

MeridianPay, a fictional European payments platform (1,900 employees, PCI-DSS and DORA in scope), is standing up its Google Cloud landing zone. Its existing IdP is Microsoft Entra ID, fed by Workday HR. Engineering is split into a central Platform team and four product domains — checkout, ledger, risk, and partners — each with dev/staging/prod environments, mirroring the folder hierarchy from Part 1.

Cloud Identity. MeridianPay verifies meridianpay.eu and two secondary brand domains, provisioning Cloud Identity Premium. Authentication is federated via SAML to Entra ID, so corporate MFA and conditional access apply; user and group provisioning runs through SCIM from Entra so Workday joiner/leaver events propagate within minutes. They create 3 break-glass super admins with FIDO2 keys enrolled in the Advanced Protection Program, credentials sealed in the SecOps safe, and a Cloud Audit Logs alert on every super-admin sign-in. Entra remains the system of record; no production principal is ever hand-created.

Google Groups. Membership lives in Entra dynamic groups and syncs to Cloud Identity. They adopt gcp-<domain>-<env>-<function>@meridianpay.eu. Function groups such as gcp-checkout-prod-developers are bound to a custom Developer role at the checkout folder; team groups like team-checkout-eng are nested into the right environment groups. A gcp-org-breakglass group holds Org Admin via a PAM-gated, time-boxed grant. Net result: onboarding an engineer is one Entra group add; offboarding is one removal — both driven by Workday.

IAM roles and policies. Basic roles are banned above the sandbox folder via Org Policy and IAM Deny. The Platform team defines six org-level custom roles (network operator, security reviewer, billing operator, developer, deployer, read-only auditor) in Terraform. Workload-team grants are bound at each product folder, never at the Org node. IAM Conditions restrict the deployer role to resources whose names start with the team’s prefix, and a Deny policy blocks iam.serviceAccounts.getAccessToken for everyone outside the approved CI principals. Every binding is a reviewed Terraform PR.

Service accounts & WIF. Default Compute/App Engine SAs are stripped via iam.automaticIamGrantsForDefaultServiceAccounts, and SA key creation and upload are disabled org-wide. Each workload gets a dedicated SA; GKE pods use GKE Workload Identity. CI/CD runs in GitHub Actions authenticating through a Workload Identity Pool with a GitHub OIDC provider, and an attribute condition pinning assertion.repository_owner == 'meridianpay' and the protected refs/heads/main branch — so only main-branch builds from MeridianPay repos can impersonate the per-environment deployer SAs. Zero exported keys exist across the org.

Least privilege. IAM Recommender runs monthly and feeds a permission-pruning backlog; PAM provides JIT elevation so standing privileged access is near zero; Policy Analyzer powers the quarterly PCI access review.

Measurable outcome (first two quarters): exported SA keys went from an estimated 40+ in their legacy estate to 0; 100% of IAM bindings target groups, not users; the quarterly access review dropped from ~3 weeks of manual spreadsheet work to 2 days using Policy Analyzer; and standing privileged access fell to under 4% of all privileged grants, the rest brokered just-in-time through PAM — comfortably satisfying their DORA and PCI auditors.

Deliverables & checklist

Common pitfalls

What’s next

With principals, groups, IAM, service accounts, and keyless workload identity in place, Part 3 — Networking designs the Shared VPC, hierarchical firewall policies, hybrid connectivity, and the perimeter controls those identities will operate within.

GCPLanding ZoneIdentity & AccessEnterprise
Need this built for real?

Vinod is a Senior Cloud Architect (22+ yrs) — available for Azure / AWS / GCP architecture, landing zones, and migrations.

Work with me

Comments

// part 2 of 5 · Google Cloud Landing Zone Design

Keep Reading