Automatización en GCP: Exportación de Permisos de Cuentas de Servicio a csv utilizando gcloud + bash

Imagen creada con DALL-E

En este post les presento un script de bash para usar en GCP para obtener los permisos de las Cuentas de Servicio a nivel de Proyecto y a nivel de Recursos (o activos) utilizando la API de Cloud Assets.

El script es realmente sencillo, utiliza comandos gcloud para comunicarse con GCP y solicitar una lista de todas las cuentas de servicio y sus permisos. Utilizamos la API de Cloud Assets para obtener los permisos de IAM a nivel de recursos. Luego utilizamos jq para manejar las salidas json y convertirlas en archivos csv.

El script

Clona el script a tu computadora desde este repo

git clone https://github.com/mdiloreto/gcp-sa-iam-script

Vas a obtener el archivo Service_account-proj-iam.sh. Que es el script en Bash:

#!/bin/bash

output_csv="gcp_service_accounts_permissions.csv"
# imprimir cabecera
echo "Proyecto,CuentaServicio,Rol,Miembro" > "$output_csv"

organization_id="{tu ID}" #<<<<<<Reemplaza con tu ID de ORG>>>>>

# Establecer tiempo de espera para comandos gcloud
GCLOUD_TIMEOUT=300

# Obtener una lista de todos los proyectos
PROJECTS=$(gcloud projects list --format="value(projectId)")

echo "Proyectos: $PROJECTS"

# Iterar todos los proyectos y obtener los permisos de IAM
for project in $PROJECTS; do
    echo "Procesando proyecto: $project"
    # IAM del proyecto
    project_iam=$(timeout $GCLOUD_TIMEOUT gcloud projects get-iam-policy "$project" --format=json)
    echo "IAM del Proyecto $project. ¡Hecho!"

    # obtener cuentas de servicio
    service_accounts=$(timeout $GCLOUD_TIMEOUT gcloud iam service-accounts list --project="$project" --format="value(email)")
    echo "Cuentas de Servicio: $service_accounts"
    
    for service_account in $service_accounts; do
        echo "Procesando cuenta de servicio: $service_account"

        # formateando csv
        echo "$project_iam" | jq -r --arg sa "$service_account" --arg proj "$project" '
            .bindings[] | 
            select(.members[] | contains($sa)) | 
            .role as $role | 
            .members[] | 
            select(contains($sa)) | 
            [$proj, $sa, $role, .] | 
            @csv' >> "$output_csv"

    done
done
echo "Exportación completada: $output_csv"

echo "Obteniendo todos los Permisos IAM a nivel de organización"

# Usar la API de Google Cloud Assets para buscar todas las políticas de iam en formato json
gcloud asset search-all-iam-policies --scope=organizations/${organization_id} --format=json > policies.json

# procesar el JSON y convertir a csv
(
echo "Proyecto,Carpeta,Recurso,Miembro,Rol"
jq -r '.[] | 
        .project as $project | 
        (.

Prerrequisitos

Antes de ejecutar este script, necesitarás lo siguiente:

  • Habilitar las APIs de Resource Manager, IAM y Cloud Assets en GCP.
  • Acceso a una cuenta de GCP con los permisos necesarios para ver políticas de IAM y cuentas de servicio.
  • La CLI de gcloud instalada y configurada en tu sistema o puedes ejecutarla en Cloud Shell.
  • La utilidad jq para procesar JSON.

Setup

  • Clona el repositorio o descarga el script a tu máquina local.
  • Asegúrate de que la CLI de gcloud esté autorizada y configurada con tu cuenta de GCP. Puedes hacer esto ejecutando:
gcloud auth login
  • Setear la variable organization_id en el script a tu ID de organización de GCP.

Ejecutar el script en Bash

¡Ahora ejecuta el script en bash! En este caso lo he hecho desde Cloud Shell.

mdiloreto@cloudshell:~/script $ ./gcp_service_accounts_permissions_exporter.sh

Output

En el mismo directorio del script obtendrás dos archivos:

  1. gcp_service_accounts_permissions.csv – Contiene los permisos de las cuentas de servicio para cada proyecto.
  2. service_accounts_iam_permissions_org.csv – Contiene los permisos de las cuentas de servicio en todos los Activos a nivel de organización.

Enjoy!


Posted

in

, , ,

by

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.