Identity and Access Management - GCP Professional Cloud Security Engineer¶
Overview¶
IAM architecture, access control, service accounts, organization policies, and identity management for securing GCP resources.
IAM Fundamentals¶
IAM Model¶
Components: - Member: Who (user, group, service account, domain) - Role: What permissions (collection of permissions) - Resource: Where (project, folder, organization, resource)
Policy Binding:
{
"bindings": [
{
"role": "roles/storage.objectViewer",
"members": [
"user:alice@example.com",
"group:developers@example.com",
"serviceAccount:sa@project.iam.gserviceaccount.com"
]
}
]
}
Role Types¶
Basic Roles (Avoid in production): - Owner: Full access - Editor: Modify resources - Viewer: Read-only access
Predefined Roles: - Curated by Google - Service-specific - Regularly updated - Examples: roles/storage.admin, roles/compute.instanceAdmin.v1
Custom Roles:
title: "Custom Network Admin"
description: "Manage networks and firewalls"
stage: "GA"
includedPermissions:
- compute.networks.*
- compute.firewalls.*
- compute.subnetworks.*
IAM Best Practices¶
- Least Privilege: Grant minimum necessary permissions
- Use Groups: Assign roles to groups, not individuals
- Avoid Basic Roles: Use predefined or custom roles
- Service Accounts: For applications, not users
- Regular Reviews: Audit IAM policies quarterly
- Organization Policies: Enforce constraints
- Conditional Access: Use IAM conditions for context-aware access
Service Accounts¶
Service Account Types¶
User-Managed: - Created by you - You control lifecycle - Used for applications
Google-Managed: - Automatically created - Managed by Google services - Example: App Engine default service account
Best Practices¶
- Workload Identity: Use for GKE instead of keys
- Avoid Key Creation: Minimize service account keys
- Key Rotation: Rotate keys every 90 days
- Dedicated Accounts: One per application/service
- Naming Convention: Descriptive names
- Access Scopes: Use IAM, not access scopes
- Impersonation: Use for elevated privileges
Workload Identity Example:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
annotations:
iam.gke.io/gcp-service-account: app-sa@project.iam.gserviceaccount.com
# Bind KSA to GSA
gcloud iam service-accounts add-iam-policy-binding \
app-sa@project.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:project.svc.id.goog[namespace/my-app]"
Organization Policies¶
Common Constraints¶
Resource Location:
constraint: constraints/gcp.resourceLocations
listPolicy:
allowedValues:
- in:us-locations
- in:eu-locations
VM External IP:
constraint: constraints/compute.vmExternalIpAccess
listPolicy:
deniedValues:
- "*"
Service Account Key Creation:
constraint: constraints/iam.disableServiceAccountKeyCreation
booleanPolicy:
enforced: true
Policy Hierarchy¶
Organization
ββ Folder (Development)
ββ Project (dev-app-1)
ββ Folder (Production)
ββ Project (prod-app-1)
Policies inherit and merge down the hierarchy.
Identity Federation¶
Workforce Identity Federation¶
Use Case: Corporate identity provider (Okta, Azure AD)
Configuration:
# Create workload identity pool
gcloud iam workload-identity-pools create corporate-idp \
--organization=ORG_ID \
--location=global
# Create provider
gcloud iam workload-identity-pools providers create-oidc okta \
--workload-identity-pool=corporate-idp \
--issuer-uri=https://example.okta.com \
--allowed-audiences=gcp-audience
Workload Identity Federation¶
Use Case: External workloads (AWS, Azure, on-premises)
Benefits: - No service account keys - Short-lived credentials - External identity provider
Access Control Patterns¶
Resource Hierarchy Access¶
Organization (Admin Group)
ββ Folder: Production (Prod Admin Group)
ββ Project: App1 (App1 Developers)
ββ Resource: Cloud Storage Bucket (Data Analysts)
Break-Glass Access¶
Emergency Access Procedure: 1. Dedicated emergency accounts 2. Strong authentication required 3. Monitoring and alerting 4. Regular access reviews 5. Clear activation process
Implementation:
def request_break_glass_access(justification):
# Log request
log_access_request(user, justification)
# Notify security team
send_alert_to_security(user, justification)
# Grant temporary access (2 hours)
grant_temporary_role(user, "roles/owner", duration=7200)
# Schedule automatic revocation
schedule_access_revocation(user, 7200)
Just-in-Time Access¶
Temporary Privilege Elevation: - Time-bound access grants - Approval workflow - Automatic revocation - Audit trail
Security Best Practices¶
IAM Security¶
- Enable MFA for all users
- Regular access reviews
- Use managed groups
- Implement least privilege
- Monitor IAM changes
- Avoid wildcard permissions
- Use IAM conditions
- Separate duties
Monitoring and Auditing¶
-- BigQuery query for IAM changes
SELECT
timestamp,
protoPayload.authenticationInfo.principalEmail,
protoPayload.methodName,
protoPayload.resourceName
FROM
`project.dataset.cloudaudit_googleapis_com_activity_*`
WHERE
protoPayload.serviceName = 'iam.googleapis.com'
AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
timestamp DESC;
Common Scenarios¶
Scenario: Multi-tenant SaaS application Solution: Service account per tenant, IAM conditions based on tenant ID, organization policies for isolation
Scenario: Developer access management Solution: Groups for teams, predefined roles per environment, separate dev/prod access
Scenario: External contractor access Solution: Time-bound access, specific role grants, monitoring, automatic revocation
Study Tips¶
- Understand IAM hierarchy and inheritance
- Practice with custom roles
- Know service account best practices
- Implement Workload Identity
- Configure organization policies
- Monitor IAM changes with audit logs
- Understand federation patterns
Key Commands¶
# IAM Policy Management
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=user:alice@example.com \
--role=roles/viewer
# Service Accounts
gcloud iam service-accounts create SA_NAME \
--display-name="Service Account Display Name"
# Organization Policies
gcloud resource-manager org-policies set-policy policy.yaml \
--organization=ORG_ID
# Audit IAM
gcloud projects get-iam-policy PROJECT_ID \
--flatten="bindings[].members" \
--format="table(bindings.role, bindings.members)"