Użyj integralności obrazu, aby zweryfikować podpisane obrazy przed wdrożeniem ich w klastrach Azure Kubernetes Service (AKS) (wersja zapoznawcza)

Azure Kubernetes Service (AKS) i jego bazowy model kontenera zapewniają zwiększoną skalowalność i możliwości zarządzania dla aplikacji natywnych dla chmury. Usługa AKS umożliwia uruchamianie elastycznych aplikacji oprogramowania zgodnie z potrzebami środowiska uruchomieniowego systemu. Jednak ta elastyczność może wprowadzać nowe wyzwania.

W tych środowiskach aplikacji użycie podpisanych obrazów kontenerów pomaga sprawdzić, czy wdrożenia są tworzone na podstawie zaufanej jednostki i że obrazy nie zostały naruszone od czasu ich utworzenia. Integralność obrazu to usługa, która umożliwia dodanie wbudowanej definicji Azure Policy w celu sprawdzenia, czy tylko podpisane obrazy są wdrażane w klastrach usługi AKS.

Uwaga

Integralność obrazu jest funkcją opartą na Ratify. W klastrze usługi AKS nazwa funkcji i nazwa właściwości to ImageIntegrity, a odpowiednie nazwy zasobników integralności obrazu zawierają Ratify.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne w oparciu o samoobsługę. Wersje zapoznawcze są udostępniane "jak jest" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną klienta w oparciu o najlepsze rozwiązania. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Wymagania wstępne

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, możesz utworzyć bezpłatne konto.

  • Interfejs wiersza polecenia platformy Azure lub Azure PowerShell.

  • aks-preview Rozszerzenie interfejsu wiersza polecenia w wersji 0.5.96 lub nowszej.

  • Upewnij się, że dodatek Azure Policy dla usługi AKS jest włączony w klastrze. Jeśli nie masz zainstalowanego dodatku, zobacz Instalowanie dodatku Azure Policy dla usługi AKS.

  • Klaster usługi AKS włączony za pomocą wystawcy OIDC. Aby utworzyć nowy klaster lub zaktualizować istniejący klaster, zobacz Konfigurowanie klastra usługi AKS za pomocą wystawcy OIDC.

  • EnableImageIntegrityPreview Flagi funkcji i AKS-AzurePolicyExternalData zarejestrowane w ramach subskrypcji platformy Azure. Zarejestruj flagi funkcji przy użyciu następujących poleceń:

    1. Zarejestruj flagi EnableImageIntegrityPreview funkcji i AKS-AzurePolicyExternalData przy użyciu az feature register polecenia .

      # 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"
      

      Wyświetlenie stanu jako Zarejestrowane może potrwać kilka minut.

    2. Sprawdź stan rejestracji przy użyciu az feature show polecenia .

      # 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. Po wybraniu stanu Zarejestrowane odśwież rejestrację Microsoft.ContainerService dostawcy zasobów przy użyciu az provider register polecenia .

      az provider register --namespace Microsoft.ContainerService
      

Istotne zagadnienia i ograniczenia

  • Klastry usługi AKS muszą uruchamiać platformę Kubernetes w wersji 1.26 lub nowszej.
  • Nie należy używać tej funkcji w rejestrach lub obciążeniach Azure Container Registry produkcyjnych (ACR).
  • Integralność obrazu obsługuje maksymalnie 200 unikatowych podpisów w całym klastrze.
  • Notacja jest jedynym obsługiwanym weryfikatorem.
  • Inspekcja jest jedynym obsługiwanym efektem zasad weryfikacji.

Jak działa integralność obrazu

Zrzut ekranu przedstawiający podstawową architekturę integralności obrazu.

Integralność obrazu używa rozwiązania Ratify, Azure Policy i gatekeeper do weryfikowania podpisanych obrazów przed wdrożeniem ich w klastrach usługi AKS. Włączenie integralności obrazu w klastrze wdraża Ratify zasobnik. Ten Ratify zasobnik wykonuje następujące zadania:

  1. Uzgadnia certyfikaty z usługi Azure Key Vault zgodnie z konfiguracją skonfigurowaną za pomocą Ratify identyfikatorów CRD.
  2. Uzyskuje dostęp do obrazów przechowywanych w usłudze ACR, gdy żądania weryfikacji pochodzą z Azure Policy. Aby umożliwić to środowisko, Azure Policy rozszerza strażnika, element webhook kontrolera dostępu dla agenta OPA (Open Policy Agent).
  3. Określa, czy obraz docelowy jest podpisany przy użyciu zaufanego certyfikatu, a zatem uznawany za zaufany.
  4. AzurePolicy i Gatekeeper używają wyników weryfikacji jako stanu zgodności, aby zdecydować, czy zezwolić na żądanie wdrożenia.

Włączanie integralności obrazów w klastrze usługi AKS

Uwaga

Weryfikacja podpisu obrazu to scenariusz zorientowany na ład i wykorzystuje Azure Policy do weryfikowania podpisów obrazów w klastrach usługi AKS na dużą skalę. Zalecamy użycie wbudowanej inicjatywy Azure Policy integralności obrazów usługi AKS, która jest dostępna w wbudowanej bibliotece definicji Azure Policy.

  • Utwórz przypisanie zasad za pomocą inicjatywy [Preview]: Use Image Integrity to ensure only trusted images are deployed zasad usługi AKS przy użyciu az policy assignment create polecenia .

    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}
    

    Zasobnik Ratify jest wdrażany po włączeniu tej funkcji.

Uwaga

Zasady wdraża funkcję Integralność obrazu w klastrze, gdy wykrywają wszelkie operacje aktualizacji w klastrze. Jeśli chcesz natychmiast włączyć tę funkcję, musisz utworzyć korygowanie zasad przy użyciu az policy remediation create polecenia .

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}

Konfigurowanie konfiguracji weryfikacji

Aby integralność obrazu prawidłowo zweryfikowała podpisany obraz docelowy, należy skonfigurować Ratify konfiguracje za pomocą identyfikatorów CRD K8s przy użyciu polecenia kubectl.

W tym artykule używamy certyfikatu urzędu certyfikacji z podpisem własnym z oficjalnej dokumentacji usługi Ratify w celu skonfigurowania konfiguracji weryfikacji. Aby uzyskać więcej przykładów, zobacz Ratify CRDs.

  1. VerifyConfig Utwórz plik o nazwie verify-config.yaml i skopiuj go w następującym języku 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. Zastosuj element VerifyConfig do klastra kubectl apply przy użyciu polecenia .

    kubectl apply -f verify-config.yaml
    

Wdrażanie przykładowych obrazów w klastrze usługi AKS

  • Wdróż podpisany obraz przy użyciu kubectl run demo polecenia .

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

    Następujące przykładowe dane wyjściowe pokazują, że integralność obrazu umożliwia wdrożenie:

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

Jeśli chcesz użyć własnych obrazów, zapoznaj się ze wskazówkami dotyczącymi podpisywania obrazów.

Wyłączanie integralności obrazu

  • Wyłącz integralność obrazu w klastrze przy użyciu az aks update polecenia z flagą --disable-image-integrity .

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

Usuwanie inicjatywy zasad

  • Usuń inicjatywę zasad przy użyciu az policy assignment delete polecenia .

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

Następne kroki

W tym artykule przedstawiono sposób używania integralności obrazu do weryfikowania podpisanych obrazów przed wdrożeniem ich w klastrach Azure Kubernetes Service (AKS). Jeśli chcesz dowiedzieć się, jak podpisać własne kontenery, zobacz Kompilowanie, podpisywanie i weryfikowanie obrazów kontenerów przy użyciu notary i azure Key Vault (wersja zapoznawcza).