Files
attest-provider/validation/attest-constraint-template.yaml

50 lines
1.5 KiB
YAML
Raw Normal View History

2024-05-23 10:19:55 -05:00
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
2024-05-23 10:52:35 -05:00
name: k8sattestexternaldata
2024-05-23 10:19:55 -05:00
spec:
crd:
spec:
names:
2024-05-23 10:52:35 -05:00
kind: K8sAttestExternalData
2024-05-23 10:19:55 -05:00
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sexternaldata
external_data_response := response {
2024-05-23 10:19:55 -05:00
# build a list of keys containing images
images := [img | img = input.review.object.spec.containers[_].image]
# send external data request
response := external_data({"provider": "attest-provider-validate", "keys": images})
}
violation[{"msg": msg}] {
errs := response_with_error(external_data_response)
msg := sprintf("invalid response: %v", [errs])
}
violation[{"msg": msg}] {
response := external_data_response.responses[_]
# a response is a list: [key, result, error]
image := response[0]
result := response[1]
2024-05-23 10:19:55 -05:00
# here we could also check for no_policy if we wanted to fail closed if there is no policy for this image
result.outcome == "failure"
2024-05-23 10:19:55 -05:00
msg := sprintf("policy failure for image %v:\n%v", [image, yaml.marshal({"violations": result.violations})])
2024-05-23 10:19:55 -05:00
}
response_with_error(response) := errs {
2024-05-23 10:19:55 -05:00
count(response.errors) > 0
errs := response.errors
2024-05-23 10:19:55 -05:00
}
response_with_error(response) := errs {
2024-05-23 10:19:55 -05:00
count(response.system_error) > 0
errs := response.system_error
2024-05-23 10:19:55 -05:00
}