|
| 1 | +apiVersion: kyverno.io/v1 |
| 2 | +kind: ClusterPolicy |
| 3 | +metadata: |
| 4 | + name: restrict-image-registries |
| 5 | + annotations: |
| 6 | + policies.kyverno.io/title: Restrict Image Registries |
| 7 | + policies.kyverno.io/category: Security |
| 8 | + policies.kyverno.io/description: >- |
| 9 | + Only allow container images from approved registries to ensure |
| 10 | + supply chain security and prevent pulling from untrusted sources. |
| 11 | +spec: |
| 12 | + validationFailureAction: Enforce |
| 13 | + background: true |
| 14 | + rules: |
| 15 | + - name: validate-registries |
| 16 | + match: |
| 17 | + any: |
| 18 | + - resources: |
| 19 | + kinds: |
| 20 | + - Pod |
| 21 | + validate: |
| 22 | + message: >- |
| 23 | + Image '{{ request.object.spec.containers[].image }}' is not from an approved registry. |
| 24 | + Allowed registries: osuakatsuki/*, registry.k8s.io/*, docker.io/flannel/*, |
| 25 | + docker.io/grafana/*, ghcr.io/grafana/*, quay.io/prometheus/*, |
| 26 | + myoung34/github-runner*, phpmyadmin/phpmyadmin* |
| 27 | + foreach: |
| 28 | + - list: "request.object.spec.containers" |
| 29 | + deny: |
| 30 | + conditions: |
| 31 | + all: |
| 32 | + - key: "{{ element.image }}" |
| 33 | + operator: NotEquals |
| 34 | + value: "" |
| 35 | + - key: "{{ element.image }}" |
| 36 | + operator: AnyNotIn |
| 37 | + value: |
| 38 | + - "osuakatsuki/*" |
| 39 | + - "docker.io/osuakatsuki/*" |
| 40 | + - "registry.k8s.io/*" |
| 41 | + - "docker.io/flannel/*" |
| 42 | + - "flannel/*" |
| 43 | + - "docker.io/grafana/*" |
| 44 | + - "grafana/*" |
| 45 | + - "ghcr.io/grafana/*" |
| 46 | + - "quay.io/prometheus/*" |
| 47 | + - "myoung34/github-runner*" |
| 48 | + - "docker.io/myoung34/github-runner*" |
| 49 | + - "phpmyadmin/phpmyadmin*" |
| 50 | + - "docker.io/phpmyadmin/phpmyadmin*" |
| 51 | + - name: validate-init-container-registries |
| 52 | + match: |
| 53 | + any: |
| 54 | + - resources: |
| 55 | + kinds: |
| 56 | + - Pod |
| 57 | + preconditions: |
| 58 | + all: |
| 59 | + - key: "{{ request.object.spec.initContainers || `[]` | length(@) }}" |
| 60 | + operator: GreaterThan |
| 61 | + value: 0 |
| 62 | + validate: |
| 63 | + message: >- |
| 64 | + Init container image is not from an approved registry. |
| 65 | + foreach: |
| 66 | + - list: "request.object.spec.initContainers" |
| 67 | + deny: |
| 68 | + conditions: |
| 69 | + all: |
| 70 | + - key: "{{ element.image }}" |
| 71 | + operator: NotEquals |
| 72 | + value: "" |
| 73 | + - key: "{{ element.image }}" |
| 74 | + operator: AnyNotIn |
| 75 | + value: |
| 76 | + - "osuakatsuki/*" |
| 77 | + - "docker.io/osuakatsuki/*" |
| 78 | + - "registry.k8s.io/*" |
| 79 | + - "docker.io/flannel/*" |
| 80 | + - "flannel/*" |
| 81 | + - "docker.io/grafana/*" |
| 82 | + - "grafana/*" |
| 83 | + - "ghcr.io/grafana/*" |
| 84 | + - "quay.io/prometheus/*" |
| 85 | + - "myoung34/github-runner*" |
| 86 | + - "docker.io/myoung34/github-runner*" |
| 87 | + - "phpmyadmin/phpmyadmin*" |
| 88 | + - "docker.io/phpmyadmin/phpmyadmin*" |
0 commit comments