reports/sample/iam.rego (131 lines of code) (raw):

package reports.iam import data.validator.gcp.lib as lib import data.assets as assets service_accounts_report[{ "name": name, "email": email }] { a := assets[_] count({a.asset_type} & {"iam.googleapis.com/ServiceAccount","google.iam.ServiceAccount"}) == 1 name := a.name email := a.resource.data.email } bindings_report[{ "name": name, "role": role, "member": member, "member_type": member_type }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") member_type := str_array[0] } bindings_sa_report[{ "name": name, "role": role, "member": member }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") str_array[0] = "serviceAccount" } bindings_group_report[{ "name": name, "role": role, "member": member }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") str_array[0] = "group" } bindings_user_report[{ "name": name, "role": role, "member": member }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") str_array[0] = "user" } bindings_special_report[{ "name": name, "role": role, "member": member }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") re_match("(allUsers|allAuthenticatedUsers|domain)", str_array[0]) } bindings_primitive_report[{ "name": name, "role": role, "member": member, "member_type": member_type }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") member_type := str_array[0] re_match("(roles/owner|roles/editor|roles/viewer)", role) } bindings_networkuser_report[{ "name": name, "role": role, "member": member, "member_type": member_type }]{ a := assets[_] name := a.name b := a.iam_policy.bindings[_] role := b.role member := b.members[_] str_array := split(member, ":") member_type := str_array[0] re_match("(roles/compute.networkUser)", role) } audit_logs_report[{ "name": name, "type": a.asset_type, "service": config.service, "log_type":log_type }]{ asset_types := { "cloudresourcemanager.googleapis.com/Organization", "cloudresourcemanager.googleapis.com/Folder", "cloudresourcemanager.googleapis.com/Project", } a := assets[_] name := a.name a.asset_type = asset_types[_] configs := lib.get_default(a.iam_policy, "audit_configs", {}) config := configs[_] log_type_map := { 1: "ADMIN_READ", 2: "DATA_WRITE", 3: "DATA_READ" } log_type := log_type_map[config.audit_log_configs[_].log_type] }