Share via


在將已簽署映像部署到 Azure Kubernetes Service (AKS) 叢集之前,先使用映像完整性來驗證已簽署的映像 (預覽)

Azure Kubernetes Service (AKS) 及其基礎容器模型可為雲端原生應用程式提供更高的可擴縮性和管理性。 使用 AKS,您可以根據系統的執行階段需求來啟動彈性軟體應用程式。 不過,這種彈性可能會帶來新的挑戰。

在這些應用程式環境中,使用已簽署的容器映像有助於驗證您的部署是從信任的實體建置,而且映像自建立後尚未遭到竄改。 映像完整性是一項服務,可讓您新增 Azure 原則內建定義,以驗證只有已簽署的映像已部署到您的 AKS 叢集。

注意

影像完整性是基於 Ratify 的功能。 在 AKS 叢集上,功能名稱和屬性名稱是 ImageIntegrity,而相關的 Image Integrity Pod 名稱則包含 Ratify

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,您可以建立免費帳戶

  • Azure CLIAzure PowerShell

  • aks-preview CLI 延伸模組 0.5.96 版或更新版本。

  • 請確定叢集上已啟用 AKS 的 Azure 原則附加元件。 如果您沒有安裝此附加元件,請參閱安裝 AKS 的 Azure 原則附加元件

  • 已啟用 OIDC 簽發者的 AKS 叢集。 若要建立新的叢集或更新現有的叢集,請參閱使用 OIDC 簽發者設定 AKS 叢集

  • 在 Azure 訂用帳戶上註冊的 EnableImageIntegrityPreviewAKS-AzurePolicyExternalData 功能旗標。 使用下列命令註冊功能旗標:

    1. 使用 az feature register 命令註冊 EnableImageIntegrityPreviewAKS-AzurePolicyExternalData 功能旗標。

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

      狀態需要幾分鐘才會顯示「已註冊」

    2. 使用 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. 狀態顯示「已註冊」之後,請使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊。

      az provider register --namespace Microsoft.ContainerService
      

考量與限制

  • 您的 AKS 叢集必須執行 Kube 1.26 版或更新版本。
  • 您不應該將這項功能用於生產 Azure Container Registry (ACR) 登錄或工作負載。
  • 映像完整性最多可對於整個叢集同時支援 200 個唯一簽章。
  • 標記法是唯一支援的驗證器。
  • 稽核是唯一支援的驗證原則效果。

映像完整性的運作方式

Screenshot showing the basic architecture for Image Integrity.

映像完整性會使用 Ratify、Azure 原則和 Gatekeeper 來驗證已簽署的映像,再將映像部署至您的 AKS 叢集。 在您的叢集上啟用映像完整性會部署 Ratify Pod。 此 Ratify Pod 會執行下列工作:

  1. 根據您透過 Ratify CRD 設定的設定,協調來自 Azure Key Vault 的憑證。
  2. 驗證要求來自 Azure 原則時,存取儲存在 ACR 中的映像。 為了啟用此體驗,Azure 原則會擴充 Gatekeeper,這是開放原則代理程式 (OPA) 的許可控制器 Webhook。
  3. 判斷目標映像是否使用信任的憑證簽署,因此被視為信任的憑證。
  4. AzurePolicyGatekeeper 使用驗證結果做為合規性狀態,以決定是否允許部署要求。

在 AKS 叢集上啟用映像完整性

注意

映像簽章驗證是治理導向的案例,並利用 Azure 原則大規模驗證 AKS 叢集上的映像簽章。 我們建議使用 AKS 的映像完整性內建 Azure 原則方案,這可在 Azure 原則的內建定義程式庫中取得。

  • 使用 az policy assignment create 命令,藉由 AKS 原則方案 [Preview]: Use Image Integrity to ensure only trusted images are deployed 建立原則指派。

    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}
    

    Ratify Pod 會在您啟用這項功能之後部署。

注意

原則會在叢集上偵測到任何更新作業時,會在您的叢集上部署映像完整性功能。 如果您想要立即啟用這項功能,您必須使用 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}

設定驗證設定

若要讓映像完整性能夠正確驗證目標簽署映像,您必須 使用 kubectl 透過 K8 CRD 設定 Ratify

在本文中,我們會使用官方 Ratify 文件中的自我簽署 CA 憑證來設定驗證設定。 如需更多範例,請參閱 Ratify CRD

  1. 建立名為 verify-config.yamlVerifyConfig 檔案,並且在下列 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. 使用 kubectl apply 命令,將 VerifyConfig 套用至您的叢集。

    kubectl apply -f verify-config.yaml
    

將範例映像部署至 AKS 叢集

  • 使用 kubectl run demo 命令部署已簽署的映像。

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

    下列範例輸出顯示映像完整性允許部署:

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

如果您想要使用本身的映像,請參閱映像簽署的指導

停用映像完整性

  • 使用 az aks update 命令搭配 --disable-image-integrity 旗標停用叢集上的映像完整性。

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

移除原則方案

下一步

在本文中,您已了解如何在將已簽署映像部署到 Azure Kubernetes Service (AKS) 叢集之前,先使用映像完整性來驗證已簽署的映像。 如果您想要了解如何簽署本身的容器,請參閱使用 Notary 和 Azure Key Vault 建置、簽署和驗證容器映像(預覽)