在將已簽署映像部署到 Azure Kubernetes Service (AKS) 叢集之前,先使用映像完整性來驗證已簽署的映像 (預覽)
Azure Kubernetes Service (AKS) 及其基礎容器模型可為雲端原生應用程式提供更高的可擴縮性和管理性。 使用 AKS,您可以根據系統的執行階段需求來啟動彈性軟體應用程式。 不過,這種彈性可能會帶來新的挑戰。
在這些應用程式環境中,使用已簽署的容器映像有助於驗證您的部署是從信任的實體建置,而且映像自建立後尚未遭到竄改。 映像完整性是一項服務,可讓您新增 Azure 原則內建定義,以驗證只有已簽署的映像已部署到您的 AKS 叢集。
注意
影像完整性是基於 Ratify 的功能。 在 AKS 叢集上,功能名稱和屬性名稱是 ImageIntegrity
,而相關的 Image Integrity Pod 名稱則包含 Ratify
。
重要
AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
必要條件
Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,您可以建立免費帳戶。
aks-preview
CLI 延伸模組 0.5.96 版或更新版本。請確定叢集上已啟用 AKS 的 Azure 原則附加元件。 如果您沒有安裝此附加元件,請參閱安裝 AKS 的 Azure 原則附加元件。
已啟用 OIDC 簽發者的 AKS 叢集。 若要建立新的叢集或更新現有的叢集,請參閱使用 OIDC 簽發者設定 AKS 叢集。
在 Azure 訂用帳戶上註冊的
EnableImageIntegrityPreview
和AKS-AzurePolicyExternalData
功能旗標。 使用下列命令註冊功能旗標:使用
az feature register
命令註冊EnableImageIntegrityPreview
和AKS-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"
狀態需要幾分鐘才會顯示「已註冊」。
使用
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"
狀態顯示「已註冊」之後,請使用
az provider register
命令重新整理Microsoft.ContainerService
資源提供者的註冊。az provider register --namespace Microsoft.ContainerService
考量與限制
- 您的 AKS 叢集必須執行 Kube 1.26 版或更新版本。
- 您不應該將這項功能用於生產 Azure Container Registry (ACR) 登錄或工作負載。
- 映像完整性最多可對於整個叢集同時支援 200 個唯一簽章。
- 標記法是唯一支援的驗證器。
- 稽核是唯一支援的驗證原則效果。
映像完整性的運作方式
映像完整性會使用 Ratify、Azure 原則和 Gatekeeper 來驗證已簽署的映像,再將映像部署至您的 AKS 叢集。 在您的叢集上啟用映像完整性會部署 Ratify
Pod。 此 Ratify
Pod 會執行下列工作:
- 根據您透過
Ratify
CRD 設定的設定,協調來自 Azure Key Vault 的憑證。 - 驗證要求來自 Azure 原則時,存取儲存在 ACR 中的映像。 為了啟用此體驗,Azure 原則會擴充 Gatekeeper,這是開放原則代理程式 (OPA) 的許可控制器 Webhook。
- 判斷目標映像是否使用信任的憑證簽署,因此被視為信任的憑證。
AzurePolicy
和Gatekeeper
使用驗證結果做為合規性狀態,以決定是否允許部署要求。
在 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。
建立名為
verify-config.yaml
的VerifyConfig
檔案,並且在下列 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: - "*"
使用
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
移除原則方案
使用
az policy assignment delete
命令移除原則方案。az policy assignment delete --name 'deploy-trustedimages'
下一步
在本文中,您已了解如何在將已簽署映像部署到 Azure Kubernetes Service (AKS) 叢集之前,先使用映像完整性來驗證已簽署的映像。 如果您想要了解如何簽署本身的容器,請參閱使用 Notary 和 Azure Key Vault 建置、簽署和驗證容器映像(預覽)。