Share via


使用機密容器和預設原則部署 AKS 叢集

在本文中,您會使用 Azure CLI 部署 Azure Kubernetes Service (AKS) 叢集,並使用預設安全性原則設定機密容器 (預覽)。 接著,您會將應用程式部署為機密容器。 若要深入了解,請參閱 AKS 機密容器概觀

一般而言,開始使用 AKS 機密容器牽涉到下列步驟。

  • 使用 Azure CLI 部署或升級 AKS 叢集
  • 將註釋新增至您的 Pod YAML 資訊清單,將 Pod 標示為以機密容器的形式執行
  • 將安全性原則新增至您的 Pod YAML 資訊清單
  • 啟用安全性原則的強制執行
  • 在機密運算中部署您的應用程式

必要條件

  • Azure CLI 2.44.1 版或更新版本。 執行 az --version 以尋找版本,然後執行 az upgrade 以升級版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

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

  • confcom 機密容器 Azure CLI 延伸模組 0.3.3 或更新版本。 需要confcom ,才能產生 安全策略

  • 在 Azure 訂用帳戶中註冊 Preview 功能。

  • AKS 支援 1.25.0 版和更新版本的機密容器 (預覽)。

  • 工作負載身分識別和同盟身分識別認證。 工作負載身分識別認證允許 Kube 應用程式使用以註解式服務帳戶為基礎的 Microsoft Entra ID,藉以安全地存取 Azure 資源。 如果您不熟悉 Microsoft Entra 工作負載識別碼,請參閱 Microsoft Entra 工作負載識別碼概觀,並檢閱工作負載身分識別如何與 AKS 搭配運作

  • 您用來建立叢集的身分識別擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項

  • 若要管理 Kubernetes 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 Azure Cloud Shell 隨附於 kubectl。 您可以使用 az aks install-cli 命令將其安裝於本地。

  • AKS 上的機密容器提供側車開放原始碼容器,用於證明和安全金鑰版本。 側車會與金鑰管理服務 (KMS) 整合,例如 Azure Key Vault,以便在驗證完成後將金鑰發行至容器群組。 部署 Azure Key Vault 受控 HSM (硬體安全性模組)是選用的,但建議支援容器層級完整性和證明。 請參閱佈建並啟用受控 HSM 以部署受控 HSM。

安裝 aks-preview Azure CLI 延伸模組

重要

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

若要安裝 aks-preview 延伸模組,請執行下列命令:

az extension add --name aks-preview

執行下列命令,以更新為發行的最新版延伸模組:

az extension update --name aks-preview

安裝 confcom Azure CLI 延伸模組

若要安裝 confcom 延伸模組,請執行下列命令:

az extension add --name confcom

執行下列命令,以更新為發行的最新版延伸模組:

az extension update --name confcom

註冊 KataCcIsolationPreview 功能旗標

使用 az feature register 命令以註冊 KataCcIsolationPreview 功能旗標,如下列範例所示:

az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

狀態需要幾分鐘的時間才會顯示「已註冊」。 使用 az feature show 命令以驗證註冊狀態:

az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

當狀態顯示為 [已註冊] 時,請使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊:

az provider register --namespace "Microsoft.ContainerService"

部署新叢集

  1. 使用 az aks create 命令建立 AKS 叢集,並指定下列參數:

    • --os-skuAzureLinux. 在此預覽版本中,只有 Azure Linux os-sku 支援這項功能。
    • --node-vm-size:屬於第 2 代 VM 且支援巢狀虛擬化的任何 Azure VM 大小。 例如,Standard_DC8as_cc_v5 VM。
    • --enable-workload-identity:啟用建立 Microsoft Entra 工作負載識別碼,以便 Pod 能夠使用 Kube 身分識別。
    • --enable-oidc-issuer:啟用 OpenID Connect (OIDC) 簽發者。 因此 Microsoft Entra ID 或其他雲端提供者身分識別和存取管理平台能夠探索 API 伺服器的公開簽署金鑰。

    下列範例會更新名為 myAKSCluster 的叢集,並在 myResourceGroup 中建立單一系統節點集區:

    az aks create --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <1.25.0 and above> --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
    

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。 上一個步驟中建立的叢集有單一節點集區。 在下一個步驟中,我們會將第二個節點集區新增至叢集。

  2. 叢集準備就緒時,請使用 az aks get-credentials 命令取得叢集認證。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. 使用 az aks nodepool add 命令,將使用者節點集區新增至 myAKSCluster,其中具有 myResourceGroupnodepool2 中的兩個節點。 指定下列參數:

    • --workload-runtime:指定 KataCcIsolation 在節點集區上啟用機密容器功能。 使用此參數時,其他這些參數應滿足下列需求。 否則,命令會失敗,並回報對應參數的問題。
    • --os-skuAzureLinux. 在此預覽版本中,只有 Azure Linux os-sku 支援這項功能。
    • --node-vm-size:屬於第 2 代 VM 且支援巢狀虛擬化的任何 Azure VM 大小。 例如,Standard_DC8as_cc_v5 VM。
    az aks nodepool add --resource-group myResourceGroup --name nodepool2 --cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

部署至現有的叢集

若要將這項功能與現有的 AKS 叢集搭配使用,必須符合下列需求:

使用下列命令來建立節點集區來裝載機密容器 (預覽)。

  1. 使用 az aks nodepool add 命令,將節點集區新增至 AKS 叢集。 指定下列參數:

    • --resource-group:輸入現有資源群組的名稱,以建立 AKS 叢集。
    • --cluster-name:AKS 叢集的唯一名稱,例如 myAKSCluster
    • --name:輸入叢集節點集區的唯一名稱,例如 nodepool2
    • --workload-runtime:指定 KataCcIsolation 在節點集區上啟用該功能。 除了 --workload-runtime 參數之外,其他這些參數應滿足下列需求。 否則,命令會失敗,並回報對應參數的問題。
    • --os-skuAzureLinux. 在此預覽版本中,只有 Azure Linux os-sku 支援這項功能。
    • --node-vm-size:屬於第 2 代 VM 且支援巢狀虛擬化的任何 Azure VM 大小。 例如,Standard_DC8as_cc_v5 VM。

    下列範例會將使用者節點集區新增至 myAKSCluster,其中兩個節點位於 myResourceGroup 中的 nodepool2

    az aks nodepool add --resource-group myResourceGroup --name nodepool2 –-cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

  2. 執行 az aks update 命令,以便在叢集上啟用機密容器 (預覽)。

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

  3. 叢集準備就緒時,請使用 az aks get-credentials 命令取得叢集認證。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

設定容器

設定 Azure Key Vault 和祕密的存取權,並將應用程式部署為機密容器之前,您需要完成工作負載身分識別的設定。

若要設定工作負載身分識別,請執行部署和設定工作負載身分識別一文中所述的下列步驟:

  • 擷取 OIDC 簽發者 URL
  • 建立受控識別
  • 建立 Kubernetes 服務帳戶
  • 建立同盟身分識別認證

重要

您必須從部署和設定工作負載身分識別一文中的匯出環境變數一節設定環境變數,以繼續完成本教學課程。 務必將變數 SERVICE_ACCOUNT_NAMESPACE 設定為 kafka,並在設定工作負載識別之前執行命令 kubectl create namespace kafka

使用 kata-cc 和證明容器部署信任的應用程式

下列步驟會使用 Azure 受控硬體安全性模組 (mHSM) 所管理的加密金鑰,為 Kafka 訊息設定端對端加密。 只有在 Kafka 取用者在機密容器內執行,並將 Azure 證明祕密佈建容器插入 Pod 時,才會釋放金鑰。

這個設定是以下列四個元件為基礎:

  • Kafka 叢集:在叢集上的 Kafka 命名空間中部署的簡單 Kafka 叢集。
  • Kafka 產生者:以 Vanilla Kube Pod 身分執行的 Kafka 產生者,會使用金鑰將加密的使用者設定訊息傳送至 Kafka 主題。
  • Kafka 取用者:使用 kata-cc 執行階段執行的 Kafka 取用者 Pod,配備安全金鑰發行容器,以擷取私密金鑰來解密 Kafka 訊息,並將訊息轉譯至 Web UI。

針對此預覽版本,我們建議用於測試和評估,以建立或使用現有的 Azure Key Vault 進階層資源,藉此支援將金鑰儲存在硬體安全性模組 (HSM) 中。 不建議使用生產金鑰保存庫。 如果您沒有 Azure Key Vault,請參閱使用 Azure CLI 建立金鑰保存庫

  1. 授與您稍早建立的受控識別,以及您的帳戶對金鑰保存庫的存取權。 將兩個身分識別金鑰保存庫密碼編譯人員金鑰保存庫密碼編譯使用者指派給 Azure RBAC 角色。

    注意

    • 受控識別是您指派給 USER_ASSIGNED_IDENTITY_NAME 變數的值。

    • 若要新增角色指派,您必須擁有 Microsoft.Authorization/roleAssignments/writeMicrosoft.Authorization/roleAssignments/delete 權限,例如金鑰保存庫資料存取管理員使用者存取管理員擁有者

    • 您必須使用金鑰保存庫 Premium SKU 支援受 HSM 保護的金鑰。

    執行下列命令來設定範圍:

    AKV_SCOPE=$(az keyvault show --name <AZURE_AKV_RESOURCE_NAME> --query id --output tsv)
    

    執行下列命令以指派金鑰保存庫密碼編譯人員角色。

    az role assignment create --role "Key Vault Crypto Officer" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    

    執行下列命令以指派金鑰保存庫密碼編譯使用者角色。

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. 執行下列命令,在 kafka 命名空間中安裝 Kafka 叢集:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. 執行下列命令以套用 kafka 叢集 CR 檔案。

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. 使用 GitHub 工作負載的 bash 指令碼準備 RSA 加密/解密金鑰。 將檔案儲存為 setup-key.sh

  5. 執行下列命令,以證明 URI 的 FQDN 設定 MAA_ENDPOINT 環境變數。

    export MAA_ENDPOINT="$(az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-)"
    

    檢查證明 URI 的 FQDN 格式是否正確 (MAA_ENDPOINT 不應包含前置詞「https://」):

    echo $MAA_ENDPOINT
    

    注意

    若要設定 Microsoft Azure 證明,請參閱快速入門:使用 Azure CLI 設定 Azure 證明

  6. 複製下列 YAML 資訊清單,並儲存為 consumer.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: kafka-golang-consumer
      namespace: kafka
      labels:
        azure.workload.identity/use: "true"
        app.kubernetes.io/name: kafka-golang-consumer
    spec:
      serviceAccountName: workload-identity-sa
      runtimeClassName: kata-cc-isolation
      containers:
        - image: "mcr.microsoft.com/aci/skr:2.7"
          imagePullPolicy: Always
          name: skr
          env:
            - name: SkrSideCarArgs
              value: ewogICAgImNlcnRjYWNoZSI6IHsKCQkiZW5kcG9pbnRfdHlwZSI6ICJMb2NhbFRISU0iLAoJCSJlbmRwb2ludCI6ICIxNjkuMjU0LjE2OS4yNTQvbWV0YWRhdGEvVEhJTS9hbWQvY2VydGlmaWNhdGlvbiIKCX0gIAp9
          command:
            - /bin/skr
          volumeMounts:
            - mountPath: /opt/confidential-containers/share/kata-containers/reference-info-base64
              name: endor-loc
        - image: "mcr.microsoft.com/acc/samples/kafka/consumer:1.0"
          imagePullPolicy: Always
          name: kafka-golang-consumer
          env:
            - name: SkrClientKID
              value: kafka-encryption-demo
            - name: SkrClientMAAEndpoint
              value: sharedeus2.eus2.test.attest.azure.net
            - name: SkrClientAKVEndpoint
              value: "myKeyVault.vault.azure.net"
            - name: TOPIC
              value: kafka-demo-topic
          command:
            - /consume
          ports:
            - containerPort: 3333
              name: kafka-consumer
          resources:
            limits:
              memory: 1Gi
              cpu: 200m
      volumes:
        - name: endor-loc
          hostPath:
            path: /opt/confidential-containers/share/kata-containers/reference-info-base64
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: consumer
      namespace: kafka
    spec:
      type: LoadBalancer
      selector:
        app.kubernetes.io/name: kafka-golang-consumer
      ports:
        - protocol: TCP
          port: 80
          targetPort: kafka-consumer
    

    注意

    更新 Pod 環境變數 SkrClientAKVEndpoint 的值,以符合 Azure Key Vault 的 URL,但不包括通訊協定值 https://。 目前的值預留位置值為 myKeyVault.vault.azure.net。 使用 MAA_ENDPOINT 的值更新 Pod 環境變數 SkrClientMAAEndpoint 的值。 您可以執行 echo $MAA_ENDPOINT 命令或 az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9- 命令 尋找 MAA_ENDPOINT 的值。

  7. 執行下列命令,為 Kafka 取用者 YAML 資訊清單產生安全性原則,並取得在 WORKLOAD_MEASUREMENT 變數中儲存的安全性原則雜湊:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. 若要產生 RSA 非對稱金鑰組(公開和私鑰),請使用下列命令執行 setup-key.sh 腳本。 <Azure Key Vault URL> 值應為 <your-unique-keyvault-name>.vault.azure.net

    export MANAGED_IDENTITY=${USER_ASSIGNED_CLIENT_ID}
    bash setup-key.sh "kafka-encryption-demo" <Azure Key Vault URL>
    

    注意

    • bash 指令碼 setup-key.sh 需要 envionment 變數 MANAGED_IDENTITY

    • 執行 bash 指令碼之後,金鑰會儲存為 kafka-encryption-demo-pub.pem

    重要

    如果您收到錯誤 ForbiddenByRbac,您可能需要等候最多 24 小時,因為受控識別的後端服務會針對每個資源 URI 維護最多 24 小時的快取。 另請參閱:疑難排解 Azure RBAC

  9. 若要驗證金鑰已成功上傳至金鑰保存庫,請執行下列命令:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. 複製下列 YAML 資訊清單,並儲存為 producer.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: kafka-producer
      namespace: kafka
    spec:
      containers:
        - image: "mcr.microsoft.com/acc/samples/kafka/producer:1.0"
          name: kafka-producer
          command:
            - /produce
          env:
            - name: TOPIC
              value: kafka-demo-topic
            - name: MSG
              value: "Azure Confidential Computing"
            - name: PUBKEY
              value: |-
                -----BEGIN PUBLIC KEY-----
                MIIBojAN***AE=
                -----END PUBLIC KEY-----
          resources:
            limits:
              memory: 1Gi
              cpu: 200m
    

    注意

    使用上一個步驟中建立的 kafka-encryption-demo-pub.pem 之中內容,更新開頭為 -----BEGIN PUBLIC KEY----- 和結尾為 -----END PUBLIC KEY----- 的值。

  11. 使用您稍早儲存的檔案來部署 consumerproducer YAML 資訊清單。

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. 使用下列命令取得 Web 服務的 IP 位址:

    kubectl get svc consumer -n kafka
    
  13. 將取用者服務的外部 IP 位址複製並貼到瀏覽器中,並觀察解密的訊息。

    下列範例與此命令的輸出類似:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. 您也應該藉由移除 skr containerkata-cc runtime class 規格,嘗試以一般 Kube Pod 的形式執行取用者。由於您不是使用 kata-cc 執行階段類別執行取用者,因此不再需要原則。

  15. 移除整個原則,並在重新部署工作負載之後,於瀏覽器中再次觀察訊息。 訊息會顯示為 base64 編碼的加密文字,因為無法擷取私密金鑰。 無法擷取金鑰,因為取用者已不再在機密環境中執行,而且 skr container 遺失,因此無法解密訊息。

清理

您完成評估這項功能時,若要避免 Azure 費用,請清除不必要的資源。 如果您已在評估或測試中部署新的叢集,您可以使用 az aks delete 命令來刪除叢集。

az aks delete --resource-group myResourceGroup --name myAKSCluster

如果您在現有的叢集上啟用機密容器 (預覽),您可以使用 kubectl delete pod 命令來移除 Pod。

kubectl delete pod pod-name

下一步

  • 深入了解具有 AKS 叢集之節點的 Azure 專用主機,以使用硬體隔離和控制 Azure 平台維護事件。