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"
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.
-
Crie uma política personalizada com o seguinte conteúdo:
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" } -
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) |
|
|
|
|
ID da chave KMS |
|
|
|
|
Nome do witness |
|
Configurar um witness e uma política de verificação de assinatura |
|
|
Imagem assinada |
|
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 a qualquer caractere, exceto |
|
|
|
Corresponde a letras, dígitos, hifens ( |
|
Adicionar imagens de sistema ACK à lista de permissões
-
Crie o arquivo
kritis-admission-allowlist-acs.yamlcom 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/*' -
Aplique a lista de permissões.
kubectl apply -f kritis-admission-allowlist-acs.yamlSaída esperada:
admissionallowlist.kritis.grafeas.io/allow-acs-images created -
Verifique a lista de permissões:
kubectl get admissionallowlists.kritis.grafeas.ioSaída esperada:
NAME AGE allow-acs-images 2m22s