Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Configure kritis-validation-hook to verify container image signatures

Última atualização: Jun 27, 2026

Configure e teste o kritis-validation-hook em um cluster ACK para bloquear imagens de contêiner não assinadas durante a admissão. Esse processo permite apenas imagens assinadas por uma autoridade confiável e reduz o risco de código inesperado ou malicioso.

Pré-requisitos

Você precisa de:

Contexto

O kritis-validation-hook baseia-se no software de código aberto kritisContainer Registry (ACR)Key Management Service (KMS)Security Center. Ele se integra ao Alibaba Cloud Container Registry (ACR) e verifica imagens assinadas com o Key Management Service (KMS). Em conjunto com o Security Center, o KMS e o ACR, automatiza a assinatura e a verificação de imagens para garantir um ambiente de execução de cluster mais seguro.

Consulte Usar o componente kritis-validation-hook para verificar automaticamente as assinaturas de imagens de contêiner para obter informações sobre a verificação de ponta a ponta.

Configurar permissões de acesso a recursos

A função RAM do cluster requer as seguintes permissões:

"cr:ListInstance",
"cr:ListMetadataOccurrences"
Importante

Para clusters gerenciados ACK, conceda essas permissões à função RAM Worker. Para clusters dedicados ACK, conceda-as tanto à função RAM Master quanto à função RAM Worker.

Adicione as permissões ausentes conforme descrito abaixo.

  1. Crie uma política personalizada com o seguinte conteúdo:

    {
        "Statement": [
            {
                "Action": [
                    "cr:ListInstance",
                    "cr:ListMetadataOccurrences"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
  2. Conceda a política à função RAM Worker do cluster.

    Para clusters dedicados ACK, conceda a política também à função RAM Master.

Ativar a verificação de assinatura de imagem

Este exemplo configura a verificação de assinatura de imagem para o namespace default. A assinatura de imagens está fora do escopo do kritis-validation-hook; portanto, este exemplo pressupõe que as imagens já estejam assinadas. Consulte Usar assinatura de imagem de contêiner para obter as etapas de assinatura.

O exemplo utiliza as informações de assinatura listadas abaixo. Substitua os valores de amostra pelos seus próprios dados.

Informação de assinatura

Valor de exemplo

Como obter

Campo YAML

Chave pública KMS (Base64)

LS0tLS1CRUdJTiBQ***

Criar uma chave assimétrica

spec.publicKeyData

ID da chave KMS

key-4a2ef103-5aa3-4220-****

Criar uma chave

spec.publicKeyId

Nome do witness

demo-aa

Configurar um witness e uma política de verificação de assinatura

spec.noteReference — referencia o witness demo-aa via namespaces/demo-aa

Imagem assinada

kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

N/D

N/D

Declarar a autoridade confiável

Crie o arquivo AttestationAuthority.yaml com o seguinte conteúdo:

apiVersion: kritis.grafeas.io/v1beta1
kind: AttestationAuthority
metadata:
  name: demo-aa
spec:
  noteReference: namespaces/demo-aa
  publicKeyData: LS0tLS1CRUdJTiBQ***
  publicKeyId: key-4a2ef103-5aa3-4220-****

Aplique o recurso.

kubectl apply -f AttestationAuthority.yaml

Criar uma política de verificação de assinatura

Crie o arquivo GenericAttestationPolicy.yaml com o conteúdo a seguir. A política faz referência ao AttestationAuthority criado na etapa anterior.

apiVersion: kritis.grafeas.io/v1beta1
kind: GenericAttestationPolicy
metadata:
  name: demo-gap
spec:
  attestationAuthorityNames:
  - demo-aa

Aplique o recurso.

kubectl apply -f GenericAttestationPolicy.yaml

Testar com uma imagem não assinada

Implante uma imagem não assinada.

kubectl create deployment test-denied --image=anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

Saída esperada:

error: failed to create deployment: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: "ACROpenAPIError detail: <image anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 is not attested because of get resource url for anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6: ListInstance failed, instanceName: "anolis", regionId: "cn-zhangjiakou", requstURL:error:****

O webhook de admissão nega a implantação porque a imagem não possui um atestado válido de demo-aa.

Testar com uma imagem assinada

Implante uma imagem assinada. Substitua o endereço da imagem pelo seu próprio.

kubectl create deployment test-allow --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

Saída esperada:

deployment.apps/test-allow created

A implantação é bem-sucedida porque a imagem foi atestada pela autoridade confiável em demo-aa.

Configurar uma lista de permissões para verificação de assinatura de imagem

Por padrão, o kritis-validation-hook verifica todas as imagens de contêiner dentro de seu escopo de aplicação. Em ambientes de middleware ou service mesh, sidecars injetados por componentes de terceiros podem não estar assinados, o que causa falha na criação do pod. Configure uma lista de permissões para ignorar a verificação de assinatura em imagens específicas.

Defina um recurso admissionallowlists.kritis.grafeas.io para especificar as imagens que devem ignorar a verificação.

apiVersion: kritis.grafeas.io/v1beta1   # Default value. Do not modify.
kind: AdmissionAllowlist                # Default value. Do not modify.
metadata:
  name: kritis-allowlist                # Must be unique within the cluster.
spec:
  patterns:                             # Define one or more allowlist entries.
  - namePattern: 'registry*.*.aliyuncs.com/acs/*'
  - namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
    namespace: 'default'    # Optional. If omitted, the entry applies to all namespaces.

Regras de correspondência de namePattern

Cada valor de namePattern corresponde à referência completa da imagem, incluindo host do registro, caminho do repositório e tag ou digest. As seguintes regras de correspondência se aplicam:

Regra

Descrição

Exemplo

Correspondência exata

Um valor sem * corresponde apenas à string exata.

nginx:v0.1.0 corresponde apenas a nginx:v0.1.0

* no final

Corresponde a qualquer caractere, exceto /.

a.com/nginx* corresponde a a.com/nginx:v0.1.0, mas não a a.com/nginx/test:v0.1.0

* no meio da string

Corresponde a letras, dígitos, hifens (-) e sublinhados (_).

registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2 corresponde tanto a registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2 quanto a registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2

Adicionar imagens de sistema ACK à lista de permissões

  1. Crie o arquivo kritis-admission-allowlist-acs.yaml com o seguinte conteúdo:

    apiVersion: kritis.grafeas.io/v1beta1
    kind: AdmissionAllowlist
    metadata:
      name: allow-acs-images
    spec:
      patterns:
      - namePattern: 'registry*.*.aliyuncs.com/acs/*'
      - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'

    Padrões comuns de lista de permissões que você pode adicionar:

    # Images used by ACK
    - namePattern: 'registry*.*.aliyuncs.com/acs/*'
    - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'
    
    # Images used by ACK (China regions only)
    - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*'
    - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*'
    
    # Images used by ARMS
    - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*'
    
    # Images used by ARMS (China regions only)
    - namePattern: 'registry*.cn-*.aliyuncs.com/arms-docker-repo/*'
  2. Aplique a lista de permissões.

    kubectl apply -f kritis-admission-allowlist-acs.yaml

    Saída esperada:

    admissionallowlist.kritis.grafeas.io/allow-acs-images created
  3. Verifique a lista de permissões:

    kubectl get admissionallowlists.kritis.grafeas.io

    Saída esperada:

    NAME               AGE
    allow-acs-images   2m22s

Próximas etapas