All Policies

Policy for PolicyExceptions

A PolicyException grants the applicable resource(s) or subject(s) the ability to bypass an existing Kyverno policy. Care should be taken to ensure that the allowed PolicyExceptions are scoped fine enough and according to your organization's operation. This is a Kyverno policy intended to provide guardrails for Kyverno PolicyExceptions and contains a number of rules which may help with these scoping best practices. These rules may be changed/removed depending on the exception practices to be implemented.

Policy Definition

/other/policy-for-exceptions/policy-for-exceptions.yaml

1apiVersion: kyverno.io/v2beta1 2kind: ClusterPolicy 3metadata: 4 name: policy-for-exceptions 5 annotations: 6 policies.kyverno.io/title: Policy for PolicyExceptions 7 policies.kyverno.io/category: Sample 8 policies.kyverno.io/minversion: 1.9.0 9 kyverno.io/kyverno-version: 1.9.0 10 kyverno.io/kubernetes-version: "1.24" 11 policies.kyverno.io/subject: PolicyException 12 policies.kyverno.io/description: >- 13 A PolicyException grants the applicable resource(s) or subject(s) the ability 14 to bypass an existing Kyverno policy. Care should be taken to ensure that 15 the allowed PolicyExceptions are scoped fine enough and according to your 16 organization's operation. This is a Kyverno policy intended to provide guardrails 17 for Kyverno PolicyExceptions and contains a number of rules which may help 18 with these scoping best practices. These rules may be changed/removed depending 19 on the exception practices to be implemented. 20spec: 21 validationFailureAction: Audit 22 background: false 23 rules: 24 - name: single-policy 25 match: 26 any: 27 - resources: 28 kinds: 29 - PolicyException 30 validate: 31 message: >- 32 An exception is only allowed for a single policy. 33 Please create a separate exception per policy. 34 deny: 35 conditions: 36 any: 37 - key: "{{request.object.spec.exceptions[] | length(@)}}" 38 operator: GreaterThan 39 value: 1 40 - name: require-match-name 41 match: 42 any: 43 - resources: 44 kinds: 45 - PolicyException 46 validate: 47 message: >- 48 An exception must explicitly specify a name for a resource match. 49 pattern: 50 spec: 51 match: 52 =(any): 53 - resources: 54 names: "?*" 55 =(all): 56 - resources: 57 names: "?*" 58 - name: require-subject 59 match: 60 any: 61 - resources: 62 kinds: 63 - PolicyException 64 validate: 65 message: >- 66 An exception must explicitly specify a subject which is expected to create the resource. 67 pattern: 68 spec: 69 match: 70 =(any): 71 - subjects: 72 - name: "?*" 73 =(all): 74 - subjects: 75 - name: "?*" 76 - name: no-cross-namespace-exceptions 77 match: 78 any: 79 - resources: 80 kinds: 81 - PolicyException 82 validate: 83 message: >- 84 An exception can only be created in the same Namespace as the resource being excluded. 85 deny: 86 conditions: 87 any: 88 - key: "{{ request.object.spec.match.[any, all][].resources[].namespaces[] || `[]`}}" 89 operator: AnyNotIn 90 value: "{{ request.namespace }}" 91 - name: namespaced-exceptions-only 92 match: 93 any: 94 - resources: 95 kinds: 96 - PolicyException 97 validate: 98 message: >- 99 An exception can only be created for a Namespaced resource, and a Namespace is required. 100 foreach: 101 - list: request.object.spec.match.[any, all][] 102 deny: 103 conditions: 104 any: 105 - key: "{{ element.resources.namespaces[] || `[]` | length(@) }}" 106 operator: Equals 107 value: 0 108 - name: policy-namespace-match-polex-namespace 109 match: 110 any: 111 - resources: 112 kinds: 113 - PolicyException 114 validate: 115 message: >- 116 An exception may not be provided for a Namespaced Policy in another Namespace. 117 foreach: 118 - list: request.object.spec.exceptions[] 119 preconditions: 120 any: 121 - key: "{{element.policyName}}" 122 operator: Equals 123 value: "*/*" 124 deny: 125 conditions: 126 any: 127 - key: "{{ element.policyName}}" 128 operator: NotEquals 129 value: "{{request.namespace}}/*"
...
yaml