Policy as Code with Kyverno
Natália Granato
Posted on July 19, 2024
O que é o Kyverno?
O Kyverno é uma ferramenta de política de código aberto para o Kubernetes. Ele fornece uma maneira de definir políticas de validação, mutação, geração de recursos Kubernetes, também realiza varreduras em segundo plano e varreduras de repositório de código-fonte. O Kyverno é implantado como um controlador de recursos Kubernetes e não requer um servidor de webhook de admissão.
Ele permite segurança, automação, conformidade e governança usando política como código. As políticas do Kyverno podem ser gerenciadas como recursos do Kubernetes e não requerem o aprendizado de uma nova linguagem. Kyverno é projetado para funcionar bem com ferramentas que você já usa, como kubectl, kustomize e Git.
Como funciona - uma demo
Vamos criar um cluster kind e instalar o Kyverno. Primeiro, crie um cluster kind:
kind create cluster --name kyverno
Em seguida, instale o Kyverno:
kubectl create -f https://github.com/kyverno/kyverno/releases/download/v1.11.1/install.yaml
Agora, vamos criar uma política de exemplo para o Kyverno. Crie um arquivo chamado disallow-latest-tag.yaml
com o seguinte conteúdo:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
annotations:
policies.kyverno.io/title: Disallow Latest Tag
policies.kyverno.io/category: Best Practices
policies.kyverno.io/minversion: 1.6.0
policies.kyverno.io/severity: medium
policies.kyverno.io/subject: Pod
policies.kyverno.io/description: >-
The ':latest' tag is mutable and can lead to unexpected errors if the
image changes. A best practice is to use an immutable tag that maps to
a specific version of an application Pod. This policy validates that the image
specifies a tag and that it is not called `latest`.
spec:
validationFailureAction: Enforce
background: true
rules:
- name: require-image-tag
match:
any:
- resources:
kinds:
- Pod
validate:
message: "An image tag is required."
pattern:
spec:
containers:
- image: "*:*"
- name: validate-image-tag
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Using a mutable image tag e.g. 'latest' is not allowed."
pattern:
spec:
containers:
- image: "!*:latest"
Agora, aplique a política ao cluster:
kubectl apply -f disallow-latest-tag.yaml
O retorno será:
clusterpolicy.kyverno.io/disallow-latest-tag created
A política disallow-latest-tag
possui a configuração validationFailureAction: Enforce
, o que significa que ela rejeitará qualquer recurso que viole a política.
Agora, vamos criar um arquivo chamado pod.yaml
com o seguinte conteúdo:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
Agora, aplique o arquivo ao cluster para validar se a política irá rejeitar a criação do pod com a tag de imagem latest
:
kubectl apply -f pod.yaml
O Kyverno deve rejeitar a criação do pod porque a política disallow-latest-tag
não permite o uso de tags latest
. Para verificar, execute o seguinte comando:
kubectl get pod
Você verá que o pod foi rejeitado. A saída será algo como:
Error from server: error when creating "pod.yml": admission webhook "validate.kyverno.svc-fail" denied the request:
resource Pod/default/nginx was blocked due to the following policies
disallow-latest-tag:
validate-image-tag: 'validation error: Using a mutable image tag e.g. ''latest''
is not allowed. rule validate-image-tag failed at path /spec/containers/0/image/'
O output acima mostra que o Kyverno rejeitou a criação do pod porque a política disallow-latest-tag
não permite o uso de tags latest
.
Isso mostra como o Kyverno pode ser usado para aplicar políticas de segurança e conformidade em um cluster Kubernetes.
Posted on July 19, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.