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: " + .)
)
),
""
'