Compartilhar via


Use a Image Integrity para validar as imagens assinadas antes de implantá-las em seus clusters do AKS (Serviço de Kubernetes do Azure) (pré-visualização)

O AKS (Serviço de Kubernetes do Azure) e seu modelo de contêiner subjacente fornecem maior escalabilidade e capacidade de gerenciamento para aplicativos nativos de nuvem. Com o AKS, você pode iniciar aplicativos de software flexíveis de acordo com as necessidades de runtime do sistema. No entanto, essa flexibilidade pode introduzir novos desafios.

Nesses ambientes de aplicativo, o uso de imagens de contêiner assinadas ajuda a verificar se suas implantações foram criadas a partir de uma entidade confiável e se as imagens não foram adulteradas desde sua criação. Image Integrity é um serviço que permite adicionar um Azure Policy definição interna para verificar se apenas as imagens assinadas são implantadas em seus clusters do AKS.

Observação

Image Integrity é um recurso baseado em Ratify. Em um cluster do AKS, o nome do recurso e o nome da propriedade são ImageIntegrity, enquanto os nomes dos pods de Image Integrity contêm Ratify.

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As visualizações são fornecidas "como estão" e "conforme disponíveis" e estão excluídas dos acordos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Pré-requisitos

  • Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, é possível criar uma conta gratuita.

  • CLI do Azure ou Azure PowerShell.

  • Extensão da CLI aks-preview versão 0.5.96 ou posterior.

  • Verifique se o complemento Azure Policy para AKS está habilitado no cluster. Se você não tiver esse complemento instalado, consulte Instalar o complemento Azure Policy para AKS.

  • Um cluster do AKS habilitado com o Emissor OIDC. Para criar um cluster ou atualizar um cluster existente, consulte Configurar um cluster do AKS com o Emissor OIDC.

  • Os sinalizadores de recursos EnableImageIntegrityPreview e AKS-AzurePolicyExternalData registrados em sua assinatura do Azure. Registre os sinalizadores de recurso executando os seguintes comandos:

    1. Registre os sinalizadores de recurso EnableImageIntegrityPreview e AKS-AzurePolicyExternalData usando o comando az feature register.

      # Register the EnableImageIntegrityPreview feature flag
      az feature register --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview"
      
      # Register the AKS-AzurePolicyExternalData feature flag
      az feature register --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
      

      Pode demorar alguns minutos para o status exibir Registrado.

    2. Verifique o status do registro usando o comando az feature show.

      # Verify the EnableImageIntegrityPreview feature flag registration status
      az feature show --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview"
      
      # Verify the AKS-AzurePolicyExternalData feature flag registration status
      az feature show --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
      
    3. Quando o status aparecer como Registrado, atualize o registro do provedor de recursos Microsoft.ContainerService usando o comando az provider register.

      az provider register --namespace Microsoft.ContainerService
      

Considerações e limitações

  • Os clusters do AKS devem executar o Kubernetes versão 1.26 ou superior.
  • Você não deve usar esse recurso para registros de Registro de Contêiner do Azure de produção (ACR) ou cargas de trabalho.
  • A Image Integrity dá suporte a no máximo 200 assinaturas exclusivas simultaneamente em todo o cluster.
  • Notação é o único verificador com suporte.
  • A auditoria é o único efeito de política de verificação com suporte.

Como funciona o Image Integrity

Captura de tela mostrando a arquitetura básica de Image Integrity.

O Image Integrity usa Ratify, Azure Policy e Gatekeeper para validar imagens assinadas antes de implantá-las em seus clusters do AKS. Habilitar o Image Integrity no cluster implanta um pod Ratify. Esse pod Ratify executa as seguintes tarefas:

  1. Reconcilia certificados do Azure Key Vault de acordo com a configuração configurada por meio de CRDs Ratify.
  2. Acessa imagens armazenadas no ACR quando as solicitações de validação vêm de Azure Policy. Para habilitar essa experiência, Azure Policy estende o Gatekeeper, um webhook do controlador de admissão para OPA (Open Policy Agent).
  3. Determina se a imagem de destino é assinada com um certificado confiável e, portanto, considerada confiável.
  4. AzurePolicy e Gatekeeper consomem os resultados de validação como o estado de conformidade para decidir se deseja permitir a solicitação de implantação.

Habilitar o Image Cleaner em seu cluster do AKS

Observação

A verificação de assinatura de imagem é um cenário orientado à governança e aproveita Azure Policy para verificar assinaturas de imagem em clusters AKS em escala. É recomendável usar a iniciativa de Azure Policy interna do Image Integrity do AKS, que está disponível na biblioteca de definição interna do Azure Policy.

  • Crie uma atribuição de política com a iniciativa de política do AKS [Preview]: Use Image Integrity to ensure only trusted images are deployed usando o comando az policy assignment create.

    export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}"
    export LOCATION=$(az group show --name ${RESOURCE_GROUP} --query location -o tsv)
    
    az policy assignment create --name 'deploy-trustedimages' --policy-set-definition 'af28bf8b-c669-4dd3-9137-1e68fdc61bd6' --display-name 'Audit deployment with unsigned container images' --scope ${SCOPE} --mi-system-assigned --role Contributor --identity-scope ${SCOPE} --location ${LOCATION}
    

    O pod Ratify é implantado depois que você habilita o recurso.

Observação

A política implanta o recurso Image Integrity em seu cluster quando detecta qualquer operação de atualização no cluster. Se você quiser habilitar o recurso imediatamente, precisará criar uma correção de política usando o comando az policy remediation create.

assignment_id=$(az policy assignment show --name 'deploy-trustedimages' --scope ${SCOPE} --query id -o tsv)
az policy remediation create --policy-assignment "$assignment_id" --definition-reference-id deployAKSImageIntegrity --name remediation --resource-group ${RESOURCE_GROUP}

Definir as configurações de verificação

Para que o Image Integrity verifique corretamente a imagem assinada de destino, você precisa definir configurações de Ratify por meio de CRDs K8s usando kubectl.

Neste artigo, usamos um certificado de AC autoassinado da documentação oficial do Ratify para definir as configurações de verificação. Para obter mais exemplos, consulte CRDs do Ratify.

  1. Crie um arquivo VerifyConfig chamado verify-config.yaml e o copie no YAML a seguir:

    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: CertificateStore
    metadata:
      name: certstore-inline
    spec:
      provider: inline
      parameters:
        value: |
          -----BEGIN CERTIFICATE-----
          MIIDQzCCAiugAwIBAgIUDxHQ9JxxmnrLWTA5rAtIZCzY8mMwDQYJKoZIhvcNAQEL
          BQAwKTEPMA0GA1UECgwGUmF0aWZ5MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMB4X
          DTIzMDYyOTA1MjgzMloXDTMzMDYyNjA1MjgzMlowKTEPMA0GA1UECgwGUmF0aWZ5
          MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
          MIIBCgKCAQEAshmsL2VM9ojhgTVUUuEsZro9jfI27VKZJ4naWSHJihmOki7IoZS8
          3/3ATpkE1lGbduJ77M9UxQbEW1PnESB0bWtMQtjIbser3mFCn15yz4nBXiTIu/K4
          FYv6HVdc6/cds3jgfEFNw/8RVMBUGNUiSEWa1lV1zDM2v/8GekUr6SNvMyqtY8oo
          ItwxfUvlhgMNlLgd96mVnnPVLmPkCmXFN9iBMhSce6sn6P9oDIB+pr1ZpE4F5bwa
          gRBg2tWN3Tz9H/z2a51Xbn7hCT5OLBRlkorHJl2HKKRoXz1hBgR8xOL+zRySH9Qo
          3yx6WvluYDNfVbCREzKJf9fFiQeVe0EJOwIDAQABo2MwYTAdBgNVHQ4EFgQUKzci
          EKCDwPBn4I1YZ+sDdnxEir4wHwYDVR0jBBgwFoAUKzciEKCDwPBn4I1YZ+sDdnxE
          ir4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQEL
          BQADggEBAGh6duwc1MvV+PUYvIkDfgj158KtYX+bv4PmcV/aemQUoArqM1ECYFjt
          BlBVmTRJA0lijU5I0oZje80zW7P8M8pra0BM6x3cPnh/oZGrsuMizd4h5b5TnwuJ
          hRvKFFUVeHn9kORbyQwRQ5SpL8cRGyYp+T6ncEmo0jdIOM5dgfdhwHgb+i3TejcF
          90sUs65zovUjv1wa11SqOdu12cCj/MYp+H8j2lpaLL2t0cbFJlBY6DNJgxr5qync
          cz8gbXrZmNbzC7W5QK5J7fcx6tlffOpt5cm427f9NiK2tira50HU7gC3HJkbiSTp
          Xw10iXXMZzSbQ0/Hj2BF4B40WfAkgRg=
          -----END CERTIFICATE-----
    ---
    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: Store
    metadata:
      name: store-oras
    spec:
      name: oras
    # If you want to you use Workload Identity for Ratify to access Azure Container Registry,
    # uncomment the following lines, and fill the proper ClientID:
    # See more: https://ratify.dev/docs/reference/oras-auth-provider
    # parameters:
    #  authProvider:
    #    name: azureWorkloadIdentity
    #    clientID: XXX
    ---
    apiVersion: config.ratify.deislabs.io/v1beta1
    kind: Verifier
    metadata:
      name: verifier-notary-inline
    spec:
      name: notation
      artifactTypes: application/vnd.cncf.notary.signature
      parameters:
        verificationCertStores:  # certificates for validating signatures
          certs: # name of the trustStore
            - certstore-inline # name of the certificate store CRD to include in this trustStore
        trustPolicyDoc: # policy language that indicates which identities are trusted to produce artifacts
          version: "1.0"
          trustPolicies:
            - name: default
              registryScopes:
                - "*"
              signatureVerification:
                level: strict
              trustStores:
                - ca:certs
              trustedIdentities:
                - "*"
    
  2. Aplique o VerifyConfig ao seu cluster usando o comando kubectl apply.

    kubectl apply -f verify-config.yaml
    

Implantar imagens de exemplo no cluster do AKS

  • Implante uma imagem assinada usando o comando kubectl run demo.

    kubectl run demo-signed --image=ghcr.io/deislabs/ratify/notary-image:signed 
    

    A saída de exemplo a seguir mostra que o Image Integrity permite a implantação:

    ghcr.io/deislabs/ratify/notary-image:signed
    pod/demo-signed created
    

Se você quiser usar suas próprias imagens, consulte as diretrizes para assinatura de imagem.

Desabilitar o Image Integrity

  • Desabilitar o Image Integrity em seu cluster usando o comando az aks update com o sinalizador --disable-image-integrity.

    az aks update --resource-group myResourceGroup --name MyManagedCluster --disable-image-integrity
    

Remover a iniciativa de política

  • Remova a iniciativa de política usando o comando az policy assignment delete.

    az policy assignment delete --name 'deploy-trustedimages'
    

Próximas etapas

Neste artigo, você aprendeu a usar o Image Integrity para validar as imagens assinadas antes de implantá-las em seus clusters do AKS (Serviço de Kubernetes do Azure). Se você quiser saber como assinar seus próprios contêineres, consulte Compilar, assinar e verificar imagens de contêiner usando o Notary e o Azure Key Vault (pré-visualização).