|
Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official. |
|
Esta é uma documentação não divulgada para Admission Controller 1.34-dev. |
Capacidades do host do Sigstore
Como exemplo de outro uso das capacidades do host no cel-policy do kubewarden, vamos criar uma política que verifica todas as imagens de contêiner em um Pod, verificando suas assinaturas sem chave do Sigstore.
Exemplo: Política de verificação do Sigstore
Esta política verificará todas as imagens de contêiner no Pod do Sigstore e confirmará se as imagens estão assinadas e são confiáveis.
Neste caso, iremos verificar uma assinatura sem chave do Sigstore realizada no GitHub Actions. Esse tipo de assinatura sem chave está vinculado ao emissor OIDC do GitHub ao criar os certificados criptográficos, então só precisaremos saber a organização do GitHub sob a qual a imagem do contêiner está publicada. Você pode ler mais sobre as capacidades do host para o Sigstore aqui.
Para alcançar isso no CEL, usamos as bibliotecas de extensão CEL do SUSE Security Admission Controller para capacidades do host na política, particularmente a função githubAction.
Como sempre, podemos começar com kwctl:
$ kwctl scaffold manifest -t ClusterAdmissionPolicy \
registry://ghcr.io/kubewarden/policies/cel-policy:v1.0.0`
O que então podemos editar para ser relevante para nossa política de verificação de contêiner:
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: "cel-sigstore-keyless-verification"
spec:
module: ghcr.io/kubewarden/policies/cel-policy:v1.0.0
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: default
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
operations: ["CREATE", "UPDATE"]
Agora, vamos para a parte do CEL. Iremos obter uma lista de imagens de contêiner no objeto Pod atual e, em seguida, verificar se elas estão verificadas por uma assinatura que corresponda à nossa organização escolhida (neste caso, github.com/opencontainers):
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: "cel-sigstore-keyless-verification"
spec:
module: ghcr.io/kubewarden/policies/cel-policy:v1.0.0
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: default
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
operations: ["CREATE", "UPDATE"]
settings:
variables:
- name: containerImages
expression: |
object.spec.containers.map(c, c.image)
- name: containerImagesNotVerified
expression: |
variables.containerImages.filter(image, !kw.sigstore.image(image).githubAction("opencontainers").verify().isTrusted())
validations:
- expression: |
size(variables.containerImagesNotVerified) == 0
messageExpression: "'These container images are not signed by the kubewarden GitHub organization: ' + variables.containerImagesNotVerified.join(', ')"
Mas espere, não devemos esquecer que InitContainers também podem fazer parte dos Pods. Então vamos adicionar outra variável e validação:
As usual with CEL, we can add several validations under
settings.validations, and they are evaluated in parallel, joined with an AND
operation, which is short-circuited.
We can now deploy the policy, and try to deploy a Pod with unsigned images:
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: golanci-lint-example
spec:
containers:
- name: nginx
image: ghcr.io/opencontainers/golangci-lint:v1.52.1
ports:
- containerPort: 80
EOF
Error from server: error when creating "STDIN":
admission webhook "clusterwide-cel-sigstore-keyless-verification.kubewarden.admission" denied the request:
failed to verify image: Callback evaluation failure: no signatures found for image: ghcr.io/opencontainers/golangci-lint:v1.52.1