Udržiavanie bezpečnej a spravovateľnej politiky kontroly prístupu v Google Cloud si vyžaduje minimalizáciu príliš širokých alebo zbytočných priamych priradení rolí IAM. S rastom organizácií sa bežne hromadia väzby IAM špecifické pre používateľov, čo často vedie k nesprávnym konfiguráciám alebo nadmerným prístupovým oprávneniam.

Na pomoc s týmto problémom som vyvinul skript, ktorý identifikuje nepotrebné priame priradenia rolí IAM naprieč všetkými projektmi v rámci GCP organizácie. Toto môže byť silný nástroj na auditovanie a čistenie priamych väzieb v prospech identít založených na skupinách alebo spravovaných identít.

🎯 Účel Link to heading

Skript analyzuje politiky IAM v celej organizácii GCP a vyhľadáva explicitné priradenia rolí založené na používateľoch, potom ich krížovo overuje so zoznamom používateľov, ktorých chcete auditovať.

# by pduchnovsky, https://duchnovsky.com/sk/2025/07/gcp-iam-audit-direct-roles
# Nájsť nepotrebné priame priradenia rolí
org=1234567890
USERS=(
  "xxxxx" "xxxxx"
)
USERS_JSON=$(printf '%s\n' "${USERS[@]}" | jq -R . | jq -s .)
QUERY=$(printf "policy:\"user:%s\" OR " "${USERS[@]}") && QUERY="${QUERY% OR }"
gcloud asset search-all-iam-policies \
  --scope="organizations/$org" \
  --query="${QUERY}" \
  --format=json | jq --argjson users "$USERS_JSON" -r '
  group_by(.project) |
  map({
    projectId: .[0].project,
    projectName: (.[0].resource | capture("projects/(?<name>[^/]+)").name // .[0].project),
    userRoles: (
      [.[]
        | .resource as $res
        | .policy.bindings[]
        | {role, members: [.members[]
            | select(startswith("user:"))
            | sub("^user:"; "")
          ], resource: $res}
      ]
      | map({role, resource, member: .members[]})
      | map(select((.member | split("@")[0]) as $id | $users | index($id)))
      | group_by(.member)
      | map({
          member: .[0].member,
          rolesByResource: (
            group_by(.resource) 
            | map({
                resource: .[0].resource,
                roles: map(.role) | unique
              })
          )
        })
    )
  }) |
  .[] |
  "--- Project: \(.projectName) (\(.projectId)) ---",
  "Google Cloud Console IAM Link: https://console.cloud.google.com/iam-admin/iam?project=\(.projectName)",
  (.userRoles[]? |
    "  Member: \(.member)",
    (.rolesByResource[] | 
      "    Resource: \(.resource)",
      (.roles[] | "      Role: " + .)
    )
  ),
  ""
'