IAM Role Management
Basic Role Operations
# List predefined roles
gcloud iam roles list
# List custom roles
gcloud iam roles list --project=PROJECT_ID
# Get role details
gcloud iam roles describe roles/ROLE_NAME
# Create custom role
gcloud iam roles create ROLE_NAME \
--project=PROJECT_ID \
--title="Role Title" \
--description="Role Description" \
--stage=GA \
--permissions=compute.instances.list,compute.instances.get
# Update custom role
gcloud iam roles update ROLE_NAME \
--project=PROJECT_ID \
--add-permissions=compute.instances.start,compute.instances.stop \
--remove-permissions=compute.instances.delete
# Disable/Enable role
gcloud iam roles disable ROLE_NAME --project=PROJECT_ID
gcloud iam roles enable ROLE_NAME --project=PROJECT_ID
Advanced Role Management
# Create role from YAML
cat > role-definition.yaml << EOF
title: "Custom Admin Role"
description: "Custom role for administrative tasks"
includedPermissions:
- compute.instances.list
- compute.instances.get
- compute.instances.start
- compute.instances.stop
stage: "GA"
EOF
gcloud iam roles create ROLE_NAME \
--project=PROJECT_ID \
--file=role-definition.yaml
# Clone existing role
gcloud iam roles copy \
--source="roles/compute.admin" \
--destination=ROLE_NAME \
--dest-project=PROJECT_ID
# Export role definition
gcloud iam roles describe roles/ROLE_NAME \
--project=PROJECT_ID \
--format=yaml > role-definition.yaml
Service Account Management
Service Account Creation and Configuration
# Create service account
gcloud iam service-accounts create SA_NAME \
--display-name="Display Name" \
--description="Service Account Description"
# List service accounts
gcloud iam service-accounts list
# Update service account
gcloud iam service-accounts update SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--display-name="New Display Name" \
--description="Updated Description"
# Create and manage keys
gcloud iam service-accounts keys create key.json \
--iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--key-file-type=json
# List keys
gcloud iam service-accounts keys list \
--iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com
# Delete key
gcloud iam service-accounts keys delete KEY_ID \
--iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com
Service Account IAM Bindings
# Add role binding
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/compute.admin"
# Add multiple roles
for role in compute.admin storage.admin bigquery.admin; do
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/$role"
done
# Remove role binding
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/compute.admin"
Organization and Project Administration
Organization Management
# List organizations
gcloud organizations list
# Get organization details
gcloud organizations describe ORGANIZATION_ID
# List organization policies
gcloud resource-manager org-policies list \
--organization=ORGANIZATION_ID
# Set organization policy
gcloud resource-manager org-policies set-policy \
compute.disableSerialPortAccess \
--organization=ORGANIZATION_ID \
--boolean-policy=true
# Create folder
gcloud resource-manager folders create \
--display-name="Folder Name" \
--organization=ORGANIZATION_ID
# Move project to folder
gcloud projects move PROJECT_ID \
--folder=FOLDER_ID
Project Administration
# Create project with advanced settings
gcloud projects create PROJECT_ID \
--name="Project Name" \
--folder=FOLDER_ID \
--labels=environment=prod,team=infrastructure \
--set-as-default
# Update project
gcloud projects update PROJECT_ID \
--name="New Project Name"
# Set project policies
gcloud resource-manager org-policies set-policy \
compute.vmExternalIpAccess \
--project=PROJECT_ID \
--boolean-policy=false
# Enable APIs
gcloud services enable \
compute.googleapis.com \
container.googleapis.com \
cloudfunctions.googleapis.com \
--project=PROJECT_ID
# List enabled APIs
gcloud services list --enabled \
--project=PROJECT_ID
# Disable APIs
gcloud services disable SERVICE_NAME \
--project=PROJECT_ID \
--force
Security and Compliance
Audit Configuration
# Create audit logs sink
gcloud logging sinks create SINK_NAME \
storage.googleapis.com/BUCKET_NAME \
--log-filter='resource.type="iam_role" OR
resource.type="service_account" OR
resource.type="project"'
# Update audit logs configuration
gcloud organizations set-iam-policy ORGANIZATION_ID policy.yaml
# Export audit logs
gcloud logging read 'resource.type="iam_role"' \
--project=PROJECT_ID \
--format=json > audit_logs.json
Security Scanning
# Enable Security Command Center
gcloud scc settings enable \
--organization=ORGANIZATION_ID
# List security findings
gcloud scc findings list \
--organization=ORGANIZATION_ID \
--filter="state=ACTIVE" \
--format=json
# Create notification config
gcloud scc notifications create NOTIFICATION_ID \
--organization=ORGANIZATION_ID \
--pubsub-topic=projects/PROJECT_ID/topics/TOPIC_ID
Access Management Scripts
Role Audit Script
#!/bin/bash
# Comprehensive role audit script
PROJECT_ID="your-project-id"
OUTPUT_DIR="iam_audit"
DATE=$(date +%Y%m%d)
mkdir -p "$OUTPUT_DIR"
# Function to get all IAM bindings
get_iam_bindings() {
local scope=$1
local id=$2
local output_file="$OUTPUT_DIR/${scope}_iam_bindings_${DATE}.json"
case $scope in
"project")
gcloud projects get-iam-policy "$id" \
--format=json > "$output_file"
;;
"organization")
gcloud organizations get-iam-policy "$id" \
--format=json > "$output_file"
;;
esac
echo "IAM bindings exported to $output_file"
}
# Function to audit service accounts
audit_service_accounts() {
local project_id=$1
local output_file="$OUTPUT_DIR/service_accounts_${DATE}.json"
# Get service accounts
gcloud iam service-accounts list \
--project="$project_id" \
--format=json > "$output_file"
# Get keys for each service account
while read -r sa_email; do
gcloud iam service-accounts keys list \
--iam-account="$sa_email" \
--project="$project_id" \
--format=json >> "$OUTPUT_DIR/sa_keys_${DATE}.json"
done < <(jq -r '.[].email' "$output_file")
}
# Function to audit custom roles
audit_custom_roles() {
local project_id=$1
local output_file="$OUTPUT_DIR/custom_roles_${DATE}.json"
gcloud iam roles list \
--project="$project_id" \
--format=json > "$output_file"
# Get detailed role definitions
while read -r role_name; do
gcloud iam roles describe "$role_name" \
--project="$project_id" \
--format=json >> "$OUTPUT_DIR/role_definitions_${DATE}.json"
done < <(jq -r '.[].name' "$output_file")
}
# Main execution
get_iam_bindings "project" "$PROJECT_ID"
audit_service_accounts "$PROJECT_ID"
audit_custom_roles "$PROJECT_ID"
Automated IAM Setup Script
#!/bin/bash
# Automated IAM setup script
PROJECT_ID="your-project-id"
TEAM_NAME="platform-team"
# Create custom roles
create_custom_roles() {
local project_id=$1
# Developer role
gcloud iam roles create "${TEAM_NAME}_developer" \
--project="$project_id" \
--title="${TEAM_NAME} Developer" \
--description="Custom developer role" \
--permissions="compute.instances.get,compute.instances.list,compute.instances.start,compute.instances.stop"
# Admin role
gcloud iam roles create "${TEAM_NAME}_admin" \
--project="$project_id" \
--title="${TEAM_NAME} Admin" \
--description="Custom admin role" \
--permissions="compute.instances.*,storage.buckets.*"
}
# Create service accounts
create_service_accounts() {
local project_id=$1
# Application service account
gcloud iam service-accounts create "${TEAM_NAME}-app" \
--display-name="${TEAM_NAME} Application" \
--description="Service account for applications"
# CI/CD service account
gcloud iam service-accounts create "${TEAM_NAME}-cicd" \
--display-name="${TEAM_NAME} CI/CD" \
--description="Service account for CI/CD pipelines"
}
# Set up IAM bindings
setup_iam_bindings() {
local project_id=$1
# Developer group bindings
gcloud projects add-iam-policy-binding "$project_id" \
--member="group:${TEAM_NAME}[email protected]" \
--role="projects/$project_id/roles/${TEAM_NAME}_developer"
# Admin group bindings
gcloud projects add-iam-policy-binding "$project_id" \
--member="group:${TEAM_NAME}[email protected]" \
--role="projects/$project_id/roles/${TEAM_NAME}_admin"
# Service account bindings
gcloud projects add-iam-policy-binding "$project_id" \
--member="serviceAccount:${TEAM_NAME}-app@$project_id.iam.gserviceaccount.com" \
--role="roles/compute.instanceAdmin.v1"
}
# Main execution
create_custom_roles "$PROJECT_ID"
create_service_accounts "$PROJECT_ID"
setup_iam_bindings "$PROJECT_ID"
Remember:
- Always follow the principle of least privilege
- Regularly audit IAM policies
- Rotate service account keys
- Document all IAM changes
- Use groups instead of individual users
- Implement proper monitoring
- Regular security reviews
- Maintain change logs
For detailed information, consult the Google Cloud IAM documentation and gcloud
command reference (gcloud help
).
Would you like me to cover any specific aspect of IAM or administrative commands in more detail?