Utiliser l’intégrité des images pour valider les images signées avant de les déployer sur vos clusters Azure Kubernetes Service (AKS) (préversion)

Azure Kubernetes Service (AKS) et son modèle de conteneur sous-jacent offrent une scalabilité et une facilité de gestion accrues pour les applications natives cloud. Avec AKS, vous pouvez lancer des applications logicielles flexibles en fonction des besoins d’exécution de votre système. Toutefois, cette flexibilité peut présenter de nouveaux défis.

Dans ces environnements d’application, l’utilisation d’images conteneur signées permet de vérifier que vos déploiements sont générés à partir d’une entité approuvée et que les images n’ont pas été falsifiées depuis leur création. L’intégrité de l’image est un service qui vous permet d’ajouter une définition intégrée Azure Policy pour vérifier que seules les images signées sont déployées sur vos clusters AKS.

Remarque

L’intégrité de l’image est une fonctionnalité qui repose sur Ratify. Sur un cluster AKS, le nom de la fonctionnalité et le nom de propriété est ImageIntegrity alors que les noms des pods Image Cleaner pertinents contiennent Ratify.

Important

Les fonctionnalités d’évaluation AKS sont disponibles en libre-service et font l’objet d’un abonnement. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Les préversions AKS sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

Prérequis

  • Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, vous pouvez créer un compte gratuit.

  • Azure CLI ou Azure PowerShell.

  • La version d’extension CLI aks-preview 0.5.96 ou ultérieure.

  • Vérifiez que le module complémentaire Azure Policy pour AKS est activé sur votre cluster. Si vous n’avez pas installé ce module complémentaire, consultez Installer Azure Policy module complémentaire pour AKS.

  • Un cluster AKS activé avec l’émetteur OIDC. Pour créer un cluster ou mettre à jour un cluster existant, consultez Configurer un cluster AKS avec l’émetteur OIDC.

  • Indicateurs de fonctionnalité EnableImageIntegrityPreview et AKS-AzurePolicyExternalData inscrits sur votre abonnement Azure. Inscrivez les indicateurs de fonctionnalité à l’aide des commandes suivantes :

    1. Inscrivez l’indicateur de fonctionnalité EnableImageIntegrityPreview et AKS-AzurePolicyExternalData à l’aide de la commande 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"
      

      Quelques minutes peuvent être nécessaires avant que l’état affiche Registered (Inscrit).

    2. Vérifiez l’état de l’inscription en utilisant la commande 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. Quand l’état indique Registered (Inscrit), actualisez l’inscription du fournisseur de ressources Microsoft.ContainerService à l’aide de la commande az provider register :

      az provider register --namespace Microsoft.ContainerService
      

Observations et limitations

  • Vos clusters AKS doivent exécuter Kubernetes version 1.26 ou ultérieure.
  • Vous ne devez pas utiliser cette fonctionnalité pour les registres ou charges de travail de production Azure Container Registry (ACR).
  • L’intégrité de l’image prend en charge un maximum de 200 signatures uniques simultanément à l’échelle du cluster.
  • La notation est le seul vérificateur pris en charge.
  • L’audit est le seul effet de stratégie de vérification pris en charge.

Fonctionnement de l’intégrité de l’image

Screenshot showing the basic architecture for Image Integrity.

L’intégrité de l’image utilise Ratify, Azure Policy et Gatekeeper pour valider les images signées avant de les déployer sur vos clusters AKS. L’activation de l’intégrité de l’image sur votre cluster déploie un pod Ratify. La méthode Ratify effectue les tâches suivantes :

  1. Rapproche les certificats d’Azure Key Vault selon la configuration que vous avez configurée à l’aide des CRD Ratify.
  2. Accède aux images stockées dans ACR lorsque les demandes de validation proviennent de Azure Policy. Pour permettre cette expérience, Azure Policy étend Gatekeeper, un webhook de contrôleur d’admission pour Open Policy Agent (OPA).
  3. Détermine si l’image cible est signée avec un certificat approuvé et donc considérée comme fiable.
  4. AzurePolicy et Gatekeeper utilisent les résultats de validation comme état de conformité pour décider s’il faut autoriser la demande de déploiement.

Activer l’intégrité de l’image sur votre cluster AKS

Remarque

La vérification de la signature d’image est un scénario orienté gouvernance qui tire parti de Azure Policy pour vérifier les signatures d’image sur les clusters AKS à grande échelle. Nous vous recommandons d’utiliser l’initiative de Azure Policy intégrée à l’intégrité de l’image d’AKS, disponible dans la bibliothèque de définitions intégrée de Azure Policy.

  • Créez une affectation de stratégie avec l’initiative de stratégie AKS [Preview]: Use Image Integrity to ensure only trusted images are deployed à l’aide de la commande 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}
    

    Le pod Ratify se déploie après l’activation de la fonctionnalité.

Remarque

La stratégie déploie la fonctionnalité Intégrité de l’image sur votre cluster lorsqu’elle détecte une opération de mise à jour sur le cluster. Si vous souhaitez activer la fonctionnalité immédiatement, vous devez créer une correction de stratégie à l’aide de la commande 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}

Paramétrer des configurations de vérification

Pour que l’intégrité de l’image vérifie correctement l’image signée cible, vous devez configurer des configurations Ratify via des CRD K8s à l’aide de kubectl.

Dans cet article, nous utilisons un certificat d’autorité de certification auto-signé à partir de la documentation officielle ratification pour paramétrer des configurations de vérification. Pour plus d’exemples, consultez Ratifier les CRD.

  1. Créez un fichier VerifyConfig nommé verify-config.yaml, et copiez-y le code YAML suivant :

    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. Appliquez le VerifyConfig à votre cluster à l’aide de la commande kubectl apply.

    kubectl apply -f verify-config.yaml
    

Déployer des exemples d’images sur votre cluster AKS

  • Déployez une image signée à l’aide de la commande kubectl run demo.

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

    L’exemple de sortie suivant montre que l’intégrité de l’image autorise le déploiement :

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

Si vous souhaitez utiliser vos propres images, consultez les instructions relatives à la signature d’images.

Désactiver l’intégrité de l’image

  • Désactivez Image Cleaner sur votre cluster à l’aide de la commande az aks update avec le paramètre --disable-image-integrity.

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

Supprimer une initiative de stratégie

  • Supprimez l’initiative de stratégie à l’aide de la commande az policy assignment delete.

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

Étapes suivantes

Dans cet article, vous avez appris à utiliser l’intégrité des images pour valider des images signées avant de les déployer sur vos clusters Azure Kubernetes Service (AKS). Si vous souhaitez savoir comment signer vos propres conteneurs, consultez Générer, signer et vérifier des images conteneur à l’aide de Notary et d’Azure Key Vault (préversion).