reports/sample/network.rego (199 lines of code) (raw):

package reports.network import data.validator.gcp.lib as lib import data.assets as assets network_default_report[{ "name": name }] { a := assets[_] count({a.asset_type} & {"compute.googleapis.com/Network","google.compute.Network"}) == 1 a.resource.data.name == "default" name = a.name } firewall_egress_deny_rules_report[{ "name": f.name, "network": f.resource.data.network }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "EGRESS" denied := lib.get_default(f.resource.data, "denied", []) denied != [] } firewall_egress_deny_rules[{ "firewall": f }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "EGRESS" denied := lib.get_default(f.resource.data, "denied", []) denied != [] } firewall_ingress_allow_wide_rules_report[{ "name": f.name, "network": f.resource.data.network, }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "INGRESS" allowed := lib.get_default(f.resource.data, "allowed", []) allowed != [] f.resource.data.sourceRange[_] == "0.0.0.0/0" } firewall_ingress_deny_wide_rules_logging_report[{ "name": f.name, "network": f.resource.data.network, "log_enabled": log_enabled }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "INGRESS" denied := lib.get_default(f.resource.data, "denied", []) denied != [] f.resource.data.sourceRange[_] == "0.0.0.0/0" log_enabled = lib.bool_to_str(f.resource.data.logConfig.enable) } firewall_ingress_allow_ssh_rules_report[{ "name": f.name, "network": f.resource.data.network }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "INGRESS" allowed := lib.get_default(f.resource.data, "allowed", []) allowed != [] allowed_rule := allowed[_] allowed_rule.ipProtocol == "tcp" allowed_rule.port[_] == "22" } firewall_ingress_allow_rdp_rules_report[{ "name": f.name, "network": f.resource.data.network }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 f.resource.data.direction == "INGRESS" allowed := lib.get_default(f.resource.data, "allowed", []) allowed != [] allowed_rule := allowed[_] allowed_rule.ipProtocol == "tcp" allowed_rule.port[_] == "3389" } firewall_service_account_report[{ "name": f.name, "network": f.resource.data.network, "target_service_account": target_service_account }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 target_service_accounts:= lib.get_default(f.resource.data, "targetServiceAccount", []) target_service_accounts != [] target_service_account := target_service_accounts[_] } firewall_default_report[{ "name": name }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 name = f.name target_tag := lib.get_default(f.resource.data, "targetTag", []) target_tag == [] target_service_account:= lib.get_default(f.resource.data, "targetServiceAccount", []) target_service_account == [] n := assets[_] count({n.asset_type} & {"compute.googleapis.com/Network","google.compute.Network"}) == 1 n.resource.data.selfLink == f.resource.data.network n.resource.data.name == "default" } firewall_logging_report[{ "name": f.name, "log_enabled": log_enabled }] { f := assets[_] count({f.asset_type} & {"compute.googleapis.com/Firewall","google.compute.Firewall"}) == 1 log_enabled = lib.bool_to_str(f.resource.data.logConfig.enable) } vpc_host_projects_report[{ "project_id": project_id, "xpn_project_status": xpn_project_status, "network": network, "subnetwork": subnetwork }] { p := assets[_] count({p.asset_type} & {"compute.googleapis.com/Project","google.compute.Project"}) == 1 project_id := p.resource.data.name xpn_project_status := p.resource.data.xpnProjectStatus n := assets[_] count({n.asset_type} & {"compute.googleapis.com/Network","google.compute.Network"}) == 1 n.resource.parent == p.resource.parent network = n.name subnetwork := n.resource.data.subnetwork[_] } vpn_tunnels_report[{ "project_id": project_id, "xpn_project_status": xpn_project_status, "vpc_tunnel": tunnel }] { p := assets[_] count({p.asset_type} & {"compute.googleapis.com/Project","google.compute.Project"}) == 1 project_id := p.resource.data.name xpn_project_status := p.resource.data.xpnProjectStatus t := assets[_] count({t.asset_type} & {"compute.googleapis.com/VpnTunnel","google.compute.VpnTunnel"}) == 1 t.resource.parent == p.resource.parent tunnel = t.resource.data.name } public_vms_report[{ "project_id": project_id, "instance_name": instance_name, "external_ip": external_ip, "status": status }] { p := assets[_] count({p.asset_type} & {"compute.googleapis.com/Project","google.compute.Project"}) == 1 project_id := p.resource.data.name vm := assets[_] count({vm.asset_type} & {"compute.googleapis.com/Instance","google.compute.Instance"}) == 1 vm.resource.parent == p.resource.parent instance_name = vm.resource.data.name access_config := lib.get_default(vm.resource.data.networkInterface[_], "accessConfig", []) external_nat_type := lib.get_default(access_config[_], "type", "") external_nat_type == "ONE_TO_ONE_NAT" external_ip := lib.get_default(access_config[_], "externalIp", "") status := vm.resource.data.status } private_vms_report[{ "project_id": project_id, "instance_name": instance_name, "status": status }] { p := assets[_] count({p.asset_type} & {"compute.googleapis.com/Project","google.compute.Project"}) == 1 project_id := p.resource.data.name vm := assets[_] count({vm.asset_type} & {"compute.googleapis.com/Instance","google.compute.Instance"}) == 1 vm.resource.parent == p.resource.parent instance_name = vm.resource.data.name access_config := lib.get_default(vm.resource.data.networkInterface[_], "accessConfig", []) external_nat_type := lib.get_default(access_config[_], "type", "") external_nat_type != "ONE_TO_ONE_NAT" status := vm.resource.data.status } subnet_private_google_access_report[{ "subnetwork_name": subnetwork_name, "private_google_access": private_google_access_str }] { sn := assets[_] count({sn.asset_type} & {"compute.googleapis.com/Subnetwork","google.compute.Subnetwork"}) == 1 subnetwork_name = sn.name private_google_access_str := lib.bool_to_str(sn.resource.data.privateIpGoogleAccess) } subnet_flow_logs_report[{ "subnetwork_name": subnetwork_name, "enable_flow_logs": enable_flow_logs_str }] { sn := assets[_] count({sn.asset_type} & {"compute.googleapis.com/Subnetwork","google.compute.Subnetwork"}) == 1 subnetwork_name = sn.name enable_flow_logs := lib.get_default(sn.resource.data, "enableFlowLogs", false) enable_flow_logs_str := lib.bool_to_str(enable_flow_logs) }