policy-library/policies/templates/gcp_lb_forwarding_rules.yaml (102 lines of code) (raw):

# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # apiVersion: templates.gatekeeper.sh/v1alpha1 kind: ConstraintTemplate metadata: name: gcp-lb-allowed-forwarding-rules-v2 annotations: description: "Constraint to restrict forwarding rules based on a allowlist" spec: crd: spec: names: kind: GCPLBAllowedForwardingRulesConstraintV2 validation: openAPIV3Schema: properties: allowlist: type: array items: type: object properties: target: type: string ip_address: type: string ip_protocol: type: string port_range: type: string load_balancing_scheme: type: string required: - target targets: validation.gcp.forsetisecurity.org: rego: | # # Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package templates.gcp.GCPLBAllowedForwardingRulesConstraintV2 import data.validator.gcp.lib as lib ########################### # Find allowlist Violations ########################### deny[{ "msg": message, "details": metadata, }] { constraint := input.constraint lib.get_constraint_params(constraint, params) asset := input.asset is_forwarding_rule(asset.asset_type) instance := asset.resource.data rule := get_allowlist_entry(params.allowlist, instance.target) rule invalid_forwarding_rule(rule, instance) message := sprintf("%v is not allowed, violates allowlist policy.", [asset.name]) metadata := {"resource": asset.name} } ########################### # Rule Utilities ########################### is_forwarding_rule(asset_type) { asset_type == "compute.googleapis.com/ForwardingRule" } is_forwarding_rule(asset_type) { asset_type == "compute.googleapis.com/GlobalForwardingRule" } get_allowlist_entry(allowlist, target) = output { rule := allowlist[_] rule.target == target output = rule } check_scheme(rule, resource) { rule.load_balancing_scheme rule.load_balancing_scheme == resource.loadBalancingScheme } check_scheme(rule, resource) { not rule.load_balancing_scheme } check_ip_protocol(rule, resource) { rule.ip_protocol rule.ip_protocol == resource.IPProtocol } check_ip_protocol(rule, resource) { not rule.ip_protocol } check_ip_address(rule, resource) { rule.ip_address rule.ip_address == resource.IPAddress } check_ip_address(rule, resource) { not rule.ip_address } check_port_range(rule, resource) { rule.port_range rule.port_range == resource.portRange } check_port_range(rule, resource) { not rule.port_range } invalid_forwarding_rule(rule, resource) { not check_scheme(rule, resource) } invalid_forwarding_rule(rule, resource) { not check_ip_address(rule, resource) } invalid_forwarding_rule(rule, resource) { not check_ip_protocol(rule, resource) } invalid_forwarding_rule(rule, resource) { not check_port_range(rule, resource) } #ENDINLINE