Todos los productos
Search
Centro de documentos

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

Última actualización: Sep 04, 2026

Configure y pruebe kritis-validation-hook en un clúster de Container Service for Kubernetes (ACK) para bloquear imágenes de contenedor sin firmar durante la admisión. Esto permite únicamente imágenes firmadas por una autoridad de confianza y reduce el riesgo de código inesperado o malicioso.

Requisitos previos

Contexto

kritis-validation-hook se basa en el software de código abierto kritis, cuenta con una integración profunda con Container Registry (ACR) y admite la verificación de imágenes de contenedor firmadas con Key Management Service (KMS). Mediante la colaboración con Security Center, KMS y ACR, automatiza por completo la firma y verificación de imágenes para lograr un entorno de ejecución del clúster más seguro.

Consulte Verify container image signatures with kritis-validation-hook.

Configurar permisos de acceso a recursos

Asegúrese de que el rol de RAM utilizado por el clúster tenga los siguientes permisos:

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

Para clústeres administrados de ACK, otorgue estos permisos al rol de RAM Worker. Para clústeres dedicados de ACK, otórguelos tanto al rol de RAM Master como al rol de RAM Worker.

Agregue los permisos faltantes de la siguiente manera.

  1. Create a custom policy con el siguiente contenido:

    {
        "Statement": [
            {
                "Action": [
                    "cr:ListInstance",
                    "cr:ListMetadataOccurrences"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
  2. Grant the policy to the cluster Worker RAM role.

    Para clústeres dedicados de ACK, otorgue también la directiva al rol de RAM Master.

Habilitar la verificación de firmas de imágenes

Este ejemplo configura la verificación de firmas de imágenes para el namespace default. La firma de imágenes queda fuera del alcance de kritis-validation-hook; este ejemplo asume que las imágenes ya están firmadas. Consulte Use container image signing para conocer los pasos de firma.

El ejemplo utiliza esta información de firma. Reemplace los valores de muestra con los valores reales.

Signing information

Example value

How to get

YAML field

Clave pública de KMS (Base64)

LS0tLS1CRUdJTiBQ***

Create an asymmetric key

spec.publicKeyData

ID de clave de KMS

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

Create a key

spec.publicKeyId

Nombre del testigo

demo-aa

Configure a witness and a signature verification policy

spec.noteReference — hace referencia al testigo demo-aa mediante namespaces/demo-aa

Imagen firmada

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

—

—

Declarar la autoridad de confianza

Cree AttestationAuthority.yaml con el siguiente contenido:

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

Aplique el recurso.

kubectl apply -f AttestationAuthority.yaml

Crear una directiva de verificación de firmas

Cree GenericAttestationPolicy.yaml con el siguiente contenido. La directiva hace referencia a AttestationAuthority del paso anterior.

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

Aplique el recurso.

kubectl apply -f GenericAttestationPolicy.yaml

Probar con una imagen sin firmar

Despliegue una imagen sin firmar.

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

Salida 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:****

El webhook de admisión rechaza el despliegue porque la imagen carece de una atestación válida de demo-aa.

Probar con una imagen firmada

Despliegue una imagen firmada. Reemplace la dirección de la imagen con la dirección real de la imagen firmada.

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

Salida esperada:

deployment.apps/test-allow created

El despliegue se realiza correctamente porque la imagen está atestada por la autoridad de confianza demo-aa.

Configurar una lista de permitidos para la verificación de firmas de imágenes

De forma predeterminada, kritis-validation-hook verifica cada imagen de contenedor dentro de su ámbito de aplicación. En entornos de middleware o service mesh, los sidecars inyectados por complementos de terceros pueden no estar firmados, lo que provoca errores en la creación de pods. Configure una lista de permitidos para omitir la verificación de firmas en imágenes específicas.

Defina un recurso admissionallowlists.kritis.grafeas.io para especificar las imágenes que omiten la verificación.

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.

Reglas de coincidencia de namePattern

Cada valor de namePattern coincide con la referencia completa de la imagen, incluido el host del registro, la ruta del repositorio y la etiqueta o digest. Se aplican las siguientes reglas de coincidencia:

Rule

Description

Example

Coincidencia exacta

Un valor sin * coincide únicamente con esa cadena exacta.

nginx:v0.1.0 coincide solo con nginx:v0.1.0

* al final

Coincide con cualquier carácter excepto /.

a.com/nginx* coincide con a.com/nginx:v0.1.0 pero no con a.com/nginx/test:v0.1.0

* en medio de la cadena

Coincide con letras, dígitos, guiones (-) y guiones bajos (_).

registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2 coincide tanto con registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2 como con registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2

Agregar imágenes del sistema de ACK a la lista de permitidos

  1. Cree kritis-admission-allowlist-acs.yaml con el siguiente contenido:

    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/*'

    Patrones comunes de lista de permitidos:

    # 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 la lista de permitidos.

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

    Salida esperada:

    admissionallowlist.kritis.grafeas.io/allow-acs-images created
  3. Compruebe la lista de permitidos:

    kubectl get admissionallowlists.kritis.grafeas.io

    Salida esperada:

    NAME               AGE
    allow-acs-images   2m22s

Documentos relacionados