Pregunta 7 | Open Policy Agent
Usar contexto: kubectl config use-context infra-prod
El Open Policy Agent y Gatekeeper han sido instalados para, entre otras cosas, aplicar listas negras de ciertos registries de imágenes. Modifica el constraint y/o template existente para también incluir en la lista negra las imágenes de very-bad-registry.com.
Pruébalo creando un solo Pod usando la imagen very-bad-registry.com/image en el Namespace default, no debería funcionar.
También puedes verificar tus cambios mirando el Deployment existente untrusted en el Namespace default, usa una imagen de la nueva fuente no confiable. El constraint OPA debería arrojar mensajes de violación para este.
Miramos los constraints OPA existentes, estos están implementados usando CRDs por Gatekeeper:
➜ k get crd
NAME CREATED AT
blacklistimages.constraints.gatekeeper.sh 2020-09-14T19:29:31Z
configs.config.gatekeeper.sh 2020-09-14T19:29:04Z
constraintpodstatuses.status.gatekeeper.sh 2020-09-14T19:29:05Z
constrainttemplatepodstatuses.status.gatekeeper.sh 2020-09-14T19:29:05Z
constrainttemplates.templates.gatekeeper.sh 2020-09-14T19:29:05Z
requiredlabels.constraints.gatekeeper.sh 2020-09-14T19:29:31Z
# Así que podemos hacer:
➜ k get constraint
NAME AGE
blacklistimages.constraints.gatekeeper.sh/pod-trusted-images 10m
NAME AGE
requiredlabels.constraints.gatekeeper.sh/namespace-mandatory-labels 10m
# y luego mirar el que probablemente trata sobre listas negras de imágenes:
k edit blacklistimages pod-trusted-images
# kubectl edit blacklistimages pod-trusted-images
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: BlacklistImages
metadata:
...
spec:
match:
kinds:
- apiGroups:
- ""
kinds:
- Pod
Parece que este constraint simplemente aplica la plantilla a todos los Pods, sin argumentos pasados. Así que editamos la plantilla:
k edit constrainttemplates blacklistimages
# kubectl edit constrainttemplates blacklistimages
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
...
spec:
crd:
spec:
names:
kind: BlacklistImages
targets:
- rego: |
package k8strustedimages
images {
image := input.review.object.spec.containers[_].image
not startswith(image, "docker-fake.io/")
not startswith(image, "google-gcr-fake.com/")
not startswith(image, "very-bad-registry.com/") # AGREGAR ESTA LÍNEA
}
violation[{"msg": msg}] {
not images
msg := "not trusted image!"
}
target: admission.k8s.gatekeeper.sh
Simplemente tenemos que agregar otra línea. Después de editar intentamos crear un Pod de la imagen mala:
➜ k run opa-test --image=very-bad-registry.com/image
Error from server ([denied by pod-trusted-images] not trusted image!): admission webhook "validation.gatekeeper.sh" denied the request: [denied by pod-trusted-images] not trusted image!
¡Genial! Después de un tiempo también podemos ver que los Pods del Deployment existente "untrusted" se listarán como violadores:
➜ k describe blacklistimages pod-trusted-images
...
Total Violations: 2
Violations:
Enforcement Action: deny
Kind: Namespace
Message: you must provide labels: {"security-level"}
Name: sidecar-injector
Enforcement Action: deny
Kind: Pod
Message: not trusted image!
Name: untrusted-68c4944d48-tfsnb
Namespace: default
Events: <none>
¡Genial, OPA lucha contra los registries maliciosos!