Verwenden Sie die Imageintegrität zum Überprüfen signierter Images vor der Bereitstellung in Ihren Azure Kubernetes Service-Clustern (AKS) (Vorschau)

Azure Kubernetes Service (AKS) und das zugrunde liegende Containermodell bieten eine höhere Skalierbarkeit und Verwaltbarkeit für cloudnative Anwendungen. Mit AKS können Sie flexible Softwareanwendungen entsprechend den Laufzeitanforderungen Ihres Systems starten. Diese Flexibilität kann jedoch neue Herausforderungen mit sich bringen.

In diesen Anwendungsumgebungen können Sie mit signierten Container-Images sicherstellen, dass Ihre Bereitstellungen von einer vertrauenswürdigen Instanz erstellt wurden und dass die Images seit ihrer Erstellung nicht manipuliert wurden. Image Integrity ist ein Dienst, mit dem Sie eine in Azure Policy integrierte Definition hinzufügen können, um zu überprüfen, dass nur signierte Images in Ihren AKS-Clustern bereitgestellt werden.

Hinweis

Image Integrity ist eine Funktion, die auf Ratify basiert. In einem AKS-Cluster lauten Featurename und Eigenschaftenname ImageIntegrity, während die relevanten Namen von Image Integrity-Pods Ratify enthalten.

Wichtig

AKS-Previewfunktionen stehen gemäß dem Self-Service- und Aktivierungsprinzip zur Verfügung. Vorschauversionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von den Vereinbarungen zum Service Level und der eingeschränkten Garantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

Voraussetzungen

  • Ein Azure-Abonnement. Falls Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen.

  • Azure CLI oder Azure PowerShell

  • aks-previewDie CLI-Erweiterung Version 0.5.96 oder höher.

  • Stellen Sie sicher, dass das Azure Policy Add-On für AKS in Ihrem Cluster aktiviert ist. Wenn Sie dieses Add-On nicht installiert haben, finden Sie weitere Informationen unter Installieren des Azure Policy Add-Ons für AKS.

  • Ein AKS-Cluster, der mit dem OIDC-Aussteller aktiviert ist. Um einen neuen Cluster zu erstellen oder einen bestehenden Cluster zu aktualisieren, siehe Konfigurieren eines AKS-Clusters mit OIDC-Aussteller.

  • Die EnableImageIntegrityPreview und AKS-AzurePolicyExternalData registrierten Featureflags in Ihrem Azure-Abonnement. Registrieren Sie die Featureflags, indem Sie den folgenden Befehl ausführen:

    1. Registrieren Sie die EnableImageIntegrityPreview und AKS-AzurePolicyExternalData Featureflags mit dem Befehl 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"
      

      Es dauert einige Minuten, bis der Status Registriert angezeigt wird.

    2. Überprüfen Sie den Registrierungsstatus mithilfe des Befehls 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. Sobald im Status Registriert angezeigt wird, aktualisieren Sie die Registrierung des Microsoft.ContainerService Ressourcenanbieters mithilfe des Befehls az provider register.

      az provider register --namespace Microsoft.ContainerService
      

Überlegungen und Einschränkungen

  • Ihre AKS-Cluster müssen Kubernetes Version 1.26 oder höher ausführen.
  • Sie sollten dieses Feature nicht für ACR-Registrierungen (Production Azure Container Registry) oder Workloads verwenden.
  • Die Imageintegrität unterstützt maximal 200 eindeutige Signaturen gleichzeitig clusterweit.
  • Notation ist der einzige unterstützte Verifizierer.
  • Die Überwachung ist die einzige unterstützte Auswirkung auf die Überprüfungsrichtlinie.

Funktionsweise der Imageintegrität

Screenshot showing the basic architecture for Image Integrity.

Die Imageintegrität verwendet Ratify, Azure Policy und Gatekeeper, um signierte Images zu überprüfen, bevor sie in Ihren AKS-Clustern bereitgestellt werden. Wenn Sie die Imageintegrität in Ihrem Cluster aktivieren, wird ein Ratify Pod bereitgestellt. Dieser Pod Ratify führt die folgenden Aufgaben aus:

  1. Stimmt Zertifikate aus Azure Key Vault gemäß der Konfiguration ab, die Sie über Ratify CRDs eingerichtet haben.
  2. Greift auf in ACR gespeicherte Bilder zu, wenn Validierungsanforderungen von Azure Policy stammen. Um diese Erfahrung zu ermöglichen, erweitert Azure Policy Gatekeeper, einen Zugangscontroller-Webhook für Open Policy Agent (OPA).
  3. Bestimmt, ob das Zielimage mit einem vertrauenswürdigen Zertifikat signiert und daher als vertrauenswürdig betrachtet wird.
  4. AzurePolicy und Gatekeeper verwenden die Validierungsergebnisse als Konformitätszustand, um zu entscheiden, ob die Bereitstellungsanforderung zugelassen werden soll.

Aktivieren von Imageintegrität für Ihren AKS-Cluster

Hinweis

Die Überprüfung von Bildsignaturen ist ein governanceorientiertes Szenario und nutzt Azure Policy, um Bildsignaturen in AKS-Clustern im großen Stil zu überprüfen. Es wird empfohlen, die integrierte AKS-Imageintegrität Azure Policy-Initiative zu verwenden, die in Azure Policy integrierten Definitionsbibliothek verfügbar ist.

  • Erstellen Sie mit dem Befehl az policy assignment create eine Richtlinienzuweisung [Preview]: Use Image Integrity to ensure only trusted images are deployed mit der Richtlinieninitiative AKS.

    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}
    

    Der Ratify Pod wird bereitgestellt, nachdem Sie das Feature aktiviert haben.

Hinweis

Die Richtlinie stellt das Feature Imageintegrität in Ihrem Cluster bereit, wenn ein Updatevorgang im Cluster erkannt wird. Wenn Sie das Feature sofort aktivieren möchten, müssen Sie mithilfe des Befehls az policy remediation create eine Richtlinienkorrektur erstellen.

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}

Einrichten von Überprüfungskonfigurationen

Damit die Imageintegrität das signierte Zielimage ordnungsgemäß überprüfen kann, müssen Sie Ratify Konfigurationen über K8s-CRDs mit kubectl einrichten.

In diesem Artikel verwenden wir ein selbstsigniertes Zertifizierungsstellenzertifikat aus der offiziellen Ratify-Dokumentation, um Überprüfungskonfigurationen einzurichten. Weitere Beispiele finden Sie unter Ratify CRDs.

  1. Erstellen Sie eine VerifyConfig Datei namens verify-config.yaml, und fügen Sie den folgenden YAML-Code ein:

    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. Wenden Sie die VerifyConfig mithilfe des Befehls kubectl apply auf Ihren Cluster an.

    kubectl apply -f verify-config.yaml
    

Bereitstellen von Beispielimages in Ihrem AKS-Cluster

  • Stellen Sie ein signiertes Image mithilfe des Befehls kubectl run demo bereit.

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

    Die folgende Beispielausgabe zeigt, dass die Imageintegrität die Bereitstellung zulässt:

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

Wenn Sie Ihre eigenen Images verwenden möchten, lesen Sie die Anleitung für die Bildsignierung.

Deaktivieren der Imageintegrität

  • Dektivieren Sie Imageintegrität in Ihrem Cluster mithilfe des Befehls az aks update mit dem Parameter --disable-image-integrity.

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

Benutzerdefinierte Richtlinieninitiative entfernen

  • Entfernen Sie die Richtlinieninitiative mithilfe des az policy assignment delete Befehls.

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

Nächste Schritte

In diesem Artikel haben Sie erfahren, wie Sie die Imageintegrität verwenden, um signierte Images zu überprüfen, bevor Sie sie in Ihren AKS-Clustern (Azure Kubernetes Service) bereitstellen. Wenn Sie erfahren möchten, wie Sie Ihre eigenen Container signieren, lesen Sie Erstellen, Signieren und Überprüfen von Containerimages mithilfe von Notar und Azure Key Vault (Vorschau).