Aprenda a usar la integridad de imagen para validar imágenes firmadas antes de implementarlas en los clústeres de Azure Kubernetes Service (AKS) (versión preliminar)

Azure Kubernetes Service (AKS) y su modelo de contenedor subyacente proporcionan una mayor escalabilidad y capacidad de administración para las aplicaciones nativas en la nube. Con AKS, puede iniciar aplicaciones de software flexibles según las necesidades en tiempo de ejecución del sistema. Sin embargo, esta flexibilidad puede presentar nuevos desafíos.

En estos entornos de aplicación, el uso de imágenes de contenedor firmadas ayuda a comprobar que las implementaciones se compilen a partir de una entidad de confianza y que las imágenes no se hayan alterado desde su creación. La integridad de imágenes es un servicio que permite agregar una definición integrada de Azure Policy para comprobar que solo se implementan imágenes firmadas en los clústeres de AKS.

Nota:

La integridad de imágenes es una característica de Ratify. En un clúster de AKS, el nombre de la característica y el nombre de la propiedad es ImageIntegrity, mientras los nombres de los pod de integridad de imagen pertinentes contienen Ratify.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y la garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Requisitos previos

  • Suscripción a Azure. Si no tiene una suscripción a Azure, puede crear una cuenta gratuita.

  • La CLI de Azure o Azure PowerShell.

  • La versión de extensión CLI aks-preview 0.5.96 o posterior de la extensión.

  • Asegúrese de que el complemento Azure Policy para AKS está habilitado en el clúster. Si no tiene instalado este complemento, consulte Instalación de complemento Azure Policy para AKS.

  • Un clúster de AKS habilitado con el emisor de OIDC. Para crear un nuevo clúster o actualizar un clúster existente, consulte Configuración de un clúster de AKS con emisor de OIDC.

  • Las marcas de características EnableImageIntegrityPreview y AKS-AzurePolicyExternalData registradas en la suscripción de Azure. Registre las marcas de característica mediante los comandos siguientes:

    1. Registre las marcas de características EnableImageIntegrityPreview y AKS-AzurePolicyExternalData mediante el 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"
      

      El estado puede tardar unos minutos en mostrarse como Registrado.

    2. Comprobar el estado del registro mediante el 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. Cuando el estado se muestre como Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register.

      az provider register --namespace Microsoft.ContainerService
      

Consideraciones y limitaciones

  • Los clústeres de AKS deben ejecutar Kubernetes versión 1.26 o posterior.
  • No debe usar esta característica para registros o cargas de trabajo de Azure Container Registry de producción (ACR).
  • La integridad de imágenes admite un máximo de 200 firmas únicas simultáneamente en todo el clúster.
  • La notación es el único comprobador admitido.
  • La auditoría es el único efecto de directiva de comprobación admitido.

Funcionamiento de la integridad de imagen

Screenshot showing the basic architecture for Image Integrity.

La integridad de imagen usa Ratify, Azure Policy y Gatekeeper para validar imágenes firmadas antes de implementarlas en los clústeres de AKS. Al habilitar la integridad de imagen en el clúster, se implementa un pod Ratify. El pod Ratify realiza las siguientes tareas:

  1. Concilia los certificados de Azure Key Vault según la configuración creada a través de los CRD de Ratify.
  2. Obtiene acceso a las imágenes almacenadas en ACR cuando las solicitudes de validación proceden de Azure Policy. Para habilitar esta experiencia, Azure Policy extiende Gatekeeper, un webhook de controlador de admisión para Open Policy Agent (OPA).
  3. Determina si la imagen de destino está firmada con un certificado de confianza y, por tanto, se considera de confianza.
  4. AzurePolicy y Gatekeeper consumen los resultados de validación como estado de cumplimiento para decidir si se permite la solicitud de implementación.

Habilitación de Integridad de imagen en el clúster de AKS

Nota:

La comprobación de la firma de imagen es un escenario orientado a la gobernanza y aprovecha Azure Policy para comprobar las firmas de imagen en clústeres de AKS a escala. Se recomienda usar la iniciativa incorporada de integridad de imágenes de AKS Azure Policy, que está disponible en la biblioteca de definiciones integrada de Azure Policy.

  • Cree una asignación de directiva con la iniciativa de directiva [Preview]: Use Image Integrity to ensure only trusted images are deployed de AKS mediante el comando az policy assignment create.

    export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}"
    export LOCATION=$(az group show -n ${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}
    

    El pod Ratify se implementa después de habilitar la característica.

Nota:

La directiva implementa la característica Integridad de imagen en el clúster cuando detecta cualquier operación de actualización en el clúster. Si desea habilitar la característica inmediatamente, debe crear una corrección de directiva mediante el comando az policy remediation create.

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

Establecer las configuraciones de verificación

Para que la integridad de imagen compruebe correctamente la imagen firmada de destino, debe establecer las configuraciones Ratify a través de CRD de K8s mediante kubectl.

En este artículo, usamos un certificado de entidad de certificación autofirmado de la documentación oficial de Ratify para establecer las configuraciones de verificación. Para obtener más ejemplos, consulte CRD de Ratify.

  1. Cree un archivo VerifyConfig denominado verify-config.yaml y cópielo en el siguiente código YAML:

    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. Aplica VerifyConfig al clúster usando el comando kubectl apply.

    kubectl apply -f verify-config.yaml
    

Implementación de imágenes de ejemplo en el clúster de AKS

  • Implemente una imagen firmada con el comando kubectl run demo.

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

    En la salida de ejemplo siguiente se muestra que la integridad de imagen permite la implementación:

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

Si desea usar sus propias imágenes, consulte las instrucciones para la firma de imágenes.

Deshabilitar la integridad de imagen

  • Deshabilite la integridad de imagen en su clúster con el comando az aks update con la marca --disable-image-integrity.

    az aks update -g myResourceGroup -n MyManagedCluster --disable-image-integrity
    

Eliminar la iniciativa de directiva

  • Quite la iniciativa de directiva mediante el comando az policy assignment delete.

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

Pasos siguientes

En este artículo, ha aprendido a usar la integridad de imagen para validar imágenes firmadas antes de implementarlas en los clústeres de Azure Kubernetes Service (AKS). Si quiere aprender a firmar sus propios contenedores, consulte Compilación, firma y comprobación de imágenes de contenedor mediante Notary y Azure Key Vault (versión preliminar).