Skip to content
Community previewValidate controls against current Google documentation.Report a gap

Access Control (AC) - Google Cloud Platform

This guide provides gcloud commands and automated methods for collecting evidence related to NIST SP 800-53 and FedRAMP Access Control (AC) family controls in Google Cloud Platform environments.

  • Cloud IAM: Role-based access control and identity management
  • Cloud Identity: Enterprise identity services and directory
  • Organization Policies: Centralized control constraints
  • VPC Service Controls: Perimeter-based access controls
  • Cloud Audit Logs: Access monitoring and logging

List all IAM policy bindings for a project

Terminal window
gcloud projects get-iam-policy PROJECT_ID --format=json

List all service accounts in a project

Terminal window
gcloud iam service-accounts list --project=PROJECT_ID

Get IAM policy for an organization

Terminal window
gcloud organizations get-iam-policy ORGANIZATION_ID

List custom roles in organization

Terminal window
gcloud iam roles list --organization=ORGANIZATION_ID --show-deleted

Export audit logs for account activities

Terminal window
gcloud logging read "protoPayload.methodName:(\"SetIamPolicy\" OR \"CreateServiceAccount\" OR \"DeleteServiceAccount\")" \
--project=PROJECT_ID \
--format=json \
--freshness=30d

List all members with specific roles

Terminal window
gcloud asset search-all-iam-policies \
--scope=organizations/ORGANIZATION_ID \
--query="policy:roles/owner"

Check effective permissions for a user

Terminal window
gcloud projects get-iam-policy PROJECT_ID \
--flatten="bindings[].members" \
--filter="bindings.members:user:EMAIL_ADDRESS" \
--format="table(bindings.role)"

List organizational policies

Terminal window
gcloud resource-manager org-policies list --organization=ORGANIZATION_ID

Verify VPC Service Controls

Terminal window
gcloud access-context-manager perimeters list

Get specific organizational policy details

Terminal window
gcloud resource-manager org-policies describe CONSTRAINT_NAME \
--organization=ORGANIZATION_ID

List VPC firewall rules

Terminal window
gcloud compute firewall-rules list --project=PROJECT_ID

Show VPC Service Control perimeters

Terminal window
gcloud access-context-manager perimeters describe PERIMETER_NAME

List Cloud Armor security policies

Terminal window
gcloud compute security-policies list --project=PROJECT_ID

Get details of specific firewall rules

Terminal window
gcloud compute firewall-rules describe RULE_NAME --project=PROJECT_ID

Create custom role with specific permissions

Terminal window
gcloud iam roles create ROLE_ID \
--organization=ORGANIZATION_ID \
--title="Custom Role Title" \
--description="Role description" \
--permissions=permission1,permission2

Audit users with multiple privileged roles

Terminal window
gcloud asset search-all-iam-policies \
--scope=organizations/ORGANIZATION_ID \
--query="policy:roles/owner OR policy:roles/editor"

List all custom roles

Terminal window
gcloud iam roles list --organization=ORGANIZATION_ID --format="table(name,title,description)"

Find all primitive role assignments

Terminal window
gcloud asset search-all-iam-policies \
--scope=organizations/ORGANIZATION_ID \
--query="policy:(roles/owner OR roles/editor OR roles/viewer)"

List permissions for a specific role

Terminal window
gcloud iam roles describe roles/compute.admin

Check for overly permissive service account keys

Terminal window
gcloud iam service-accounts keys list \
--iam-account=SERVICE_ACCOUNT_EMAIL \
--managed-by=user \
--format="table(name,validAfterTime,validBeforeTime)"

Query failed login attempts from audit logs

Terminal window
gcloud logging read "protoPayload.authenticationInfo.principalEmail:* AND severity=ERROR AND protoPayload.status.code=7" \
--project=PROJECT_ID \
--format=json \
--freshness=7d

Monitor authentication events

Terminal window
gcloud logging read "protoPayload.serviceName=\"cloudresourcemanager.googleapis.com\" AND protoPayload.authenticationInfo.principalEmail:*" \
--project=PROJECT_ID \
--limit=100

List all Compute Engine instances with external IPs

Terminal window
gcloud compute instances list \
--format="table(name,networkInterfaces[0].accessConfigs[0].natIP:label=EXTERNAL_IP)" \
--filter="networkInterfaces[0].accessConfigs[0].natIP:*"

Check IAP (Identity-Aware Proxy) tunnel instances

Terminal window
gcloud compute instances list \
--filter="labels.use-iap-tunnel=true" \
--format="table(name,status,labels)"

List Cloud VPN tunnels

Terminal window
gcloud compute vpn-tunnels list --project=PROJECT_ID

AC-20: Use of External Information Systems

Section titled “AC-20: Use of External Information Systems”

List all external IP addresses

Terminal window
gcloud compute addresses list --project=PROJECT_ID --filter="addressType=EXTERNAL"

Check Private Google Access status

Terminal window
gcloud compute networks subnets list \
--project=PROJECT_ID \
--format="table(name,privateIpGoogleAccess,region)"
#!/bin/bash
# Export complete IAM configuration for compliance audit
ORG_ID="YOUR_ORG_ID"
OUTPUT_DIR="iam_audit_$(date +%Y%m%d)"
mkdir -p $OUTPUT_DIR
# Organization level IAM
gcloud organizations get-iam-policy $ORG_ID --format=json > $OUTPUT_DIR/org_iam_policy.json
# All folders
gcloud resource-manager folders list --organization=$ORG_ID --format=json > $OUTPUT_DIR/folders.json
# All projects
gcloud projects list --format=json > $OUTPUT_DIR/projects.json
# Service accounts across all projects
for project in $(gcloud projects list --format="value(projectId)"); do
echo "Processing project: $project"
gcloud iam service-accounts list --project=$project --format=json > $OUTPUT_DIR/service_accounts_$project.json
gcloud projects get-iam-policy $project --format=json > $OUTPUT_DIR/project_iam_$project.json
done
#!/bin/bash
# Monitor changes to privileged roles
gcloud logging read '
protoPayload.methodName="SetIamPolicy" AND
(protoPayload.request.policy.bindings.role="roles/owner" OR
protoPayload.request.policy.bindings.role="roles/editor" OR
protoPayload.request.policy.bindings.role="roles/iam.securityAdmin")' \
--project=PROJECT_ID \
--format=json \
--freshness=24h
#!/bin/bash
# Quick compliance check for common access control issues
echo "=== Checking for primitive roles usage ==="
gcloud asset search-all-iam-policies \
--scope=organizations/$ORG_ID \
--query="policy:(roles/owner OR roles/editor)" \
--format="table(resource,policy.bindings.role,policy.bindings.members)"
echo "=== Checking for service accounts with user-managed keys ==="
for sa in $(gcloud iam service-accounts list --format="value(email)"); do
keys=$(gcloud iam service-accounts keys list --iam-account=$sa --managed-by=user --format="value(name)")
if [ ! -z "$keys" ]; then
echo "Service Account: $sa has user-managed keys"
fi
done
echo "=== Checking for external IP addresses ==="
gcloud compute instances list \
--format="table(name,networkInterfaces[0].accessConfigs[0].natIP)" \
--filter="networkInterfaces[0].accessConfigs[0].natIP:*"

Page provenance

Community-maintained guidance. Use the edit link below to propose a sourced correction.

Contributors

Was this page useful?

Help us prioritize the next improvement.