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
Cuenta con ACK managed cluster o ACK dedicated cluster (Discontinued).
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"
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.
-
Create a custom policy con el siguiente contenido:
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" } -
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) |
|
|
|
|
ID de clave de KMS |
|
|
|
|
Nombre del testigo |
|
|
|
|
Imagen firmada |
|
— |
— |
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 con cualquier carácter excepto |
|
|
|
Coincide con letras, dígitos, guiones ( |
|
Agregar imágenes del sistema de ACK a la lista de permitidos
-
Cree
kritis-admission-allowlist-acs.yamlcon 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/*' -
Aplique la lista de permitidos.
kubectl apply -f kritis-admission-allowlist-acs.yamlSalida esperada:
admissionallowlist.kritis.grafeas.io/allow-acs-images created -
Compruebe la lista de permitidos:
kubectl get admissionallowlists.kritis.grafeas.ioSalida esperada:
NAME AGE allow-acs-images 2m22s