共用方式為


加密部署資料

在雲端中執行 Azure 容器執行個體 (ACI) 資源時,ACI 服務會收集和持續保存與容器相關的資料。 ACI 會在將此資料持續保存於雲端時自動對其加密。 此加密可保護您的資料,以協助符合組織的安全性與合規性承諾。 ACI 也可讓您選擇使用您自己的金鑰來加密此資料,讓您更充分地控制與 ACI 部署相關的資料。

關於 ACI 資料加密

ACI 中的資料會使用 256 位元 AES 加密來加密和解密。 這已針對所有 ACI 部署予以啟用,而且您不需要修改部署或容器,即可利用此加密。 這包括下列項目的中繼資料:部署、環境變數、正傳入容器的金鑰,以及在停止容器後持續保存的記錄,讓您仍然可以看到。 加密不會影響您的容器群組效能,而且加密不需要額外成本。

您可以依賴 Microsoft 受控金鑰來加密您的容器資料,也可以使用您自己的金鑰來管理加密。 下表比較這些選項:

Microsoft 管理的金鑰 客戶管理的金鑰
加密/解密作業 Azure Azure
金鑰儲存體 Microsoft 金鑰存放區 Azure Key Vault
金鑰輪替責任 Microsoft 客戶
金鑰存取 僅限 Microsoft Microsoft、客戶

此文章會檢閱使用客戶自控金鑰將資料加密的兩個流程:

  • 使用儲存在標準 Azure Key Vault 中的客戶自控金鑰將資料加密
  • 使用儲存在已啟用信任的服務之受網路保護的 Azure Key Vault 中的客戶自控金鑰將資料加密。

使用儲存在標準 Azure Key Vault 中的客戶自控金鑰將資料加密

必要條件

為 ACI 建立服務主體

第一個步驟是確保您的 Azure 租用戶已獲指派服務主體,可將權限授與 Azure 容器執行個體服務。

重要

若要執行下列命令,並成功建立服務主體,請確認您有權在租用戶中建立服務主體。

下列 CLI 命令將會在您的 Azure 環境中設定 ACI SP:

az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9

執行此命令的輸出應該會顯示已設定 "displayName": "Azure Container Instance Service" 的服務主體。

如果您無法成功建立服務主體:

  • 確認您有權在租用戶中執行此作業
  • 確認您的租用戶中是否已有服務主體可部署至 ACI。 做法是執行 az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9,並改用該服務主體

建立金鑰保存庫資源

使用 Azure 入口網站Azure CLIAzure PowerShell 建立 Azure Key Vault。

針對金鑰保存庫的屬性,請使用下列指導方針:

  • 名稱:需要唯一名稱。
  • 訂閱:選擇訂閱。
  • 在 [資源群組] 下,選擇現有資源群組,或建立新的資源群組,並輸入資源群組名稱。
  • 在 [位置] 下拉式功能表中,選擇位置。
  • 您可以將其他選項保留為其預設值,或根據其他需求進行挑選。

重要

使用客戶自控金鑰來加密 ACI 部署範本時,建議在金鑰保存庫上設定下列兩個屬性:[虛刪除] 和 [不要清除]。 預設不會啟用這些屬性,但您可以使用 PowerShell 或 Azure CLI 在新的或現有金鑰保存庫上啟用。

產生新的金鑰

建立金鑰保存庫之後,請導覽至 Azure 入口網站中的資源。 在資源刀鋒視窗的左側導覽功能表上,按一下 [設定] 下的 [金鑰]。 在 [金鑰] 的檢視上,按一下 [產生/匯入] 以產生新的金鑰。 針對此金鑰使用任何唯一名稱,以及根據您需求的任何其他喜好設定。

Generate a new key

設定存取原則

建立新的存取原則,以允許 ACI 服務存取您的金鑰。

  • 產生金鑰之後,請回到金鑰保存庫資源刀鋒視窗,並按一下 [設定] 下的 [存取原則]
  • 在金鑰保存庫的 [存取原則] 頁面上,按一下 [新增存取原則]
  • 將 [金鑰權限] 設定為包括 [取得] 和 [將金鑰解除包裝]Set key permissions
  • 針對 [選取主體],選取 [Azure 容器執行個體服務]
  • 按一下底部的 [新增]

存取原則現在應該會顯示在金鑰保存庫的存取原則中。

New access policy

修改 JSON 部署範本

重要

使用客戶自控金鑰來加密部署資料可在目前推出的最新 API 版本 (2019-12-01) 中使用。請在您的部署範本中指定此 API 版本。 如果您對此有任何問題,則請連絡 Azure 支援。

設定金鑰保存庫金鑰和存取原則之後,請將下列屬性新增至您的 ACI 部署範本。 若要深入了解如何使用範本部署 ACI 資源,請參閱教學課程:使用 Resource Manager 範本部署多容器群組

  • resources 底下,將 apiVersion 設定為 2019-12-01
  • 在部署範本的容器群組屬性區段下,新增包含下列值的 encryptionProperties
    • vaultBaseUrl:您可以在入口網站中金鑰保存庫資源的概觀刀鋒視窗上找到金鑰保存庫的 DNS 名稱。
    • keyName:稍早所產生金鑰的名稱
    • keyVersion:金鑰的目前版本。 按一下金鑰本身 (在金鑰保存庫資源 [設定] 區段的 [金鑰] 下),即可找到此項目
  • 在容器群組屬性下,新增值為 Standardsku 屬性。 API 2019-12-01 版需要 sku 屬性。

下列範本程式碼片段顯示這些額外的屬性來加密部署資料:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

以下是完整範本,而此範本是從教學課程:使用 Resource Manager 範本來部署多容器群組中的範本進行調整。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "encryptionProperties": {
            "vaultBaseUrl": "https://example.vault.azure.net",
            "keyName": "acikey",
            "keyVersion": "xxxxxxxxxxxxxxxx"
        },
        "sku": "Standard",  
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
                "protocol": "tcp",
                "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

部署資源

如果您已在桌面上建立和編輯範本檔案,則可以將檔案拖曳至您的 Cloud Shell 目錄來上傳檔案。

使用 az group create 命令來建立資源群組。

az group create --name myResourceGroup --location eastus

使用 az deployment group create 命令來部署範本。

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

在幾秒內,您應該會從 Azure 收到首次回應。 部署完成後,ACI 服務所持續保存的所有相關資料都會使用您提供的金鑰進行加密。

使用已啟用信任的服務之受網路保護的 Azure Key Vault 中的客戶自控金鑰將資料加密

建立金鑰保存庫資源

使用 Azure 入口網站Azure CLIAzure PowerShell 建立 Azure Key Vault。 若要開始,請勿套用任何網路限制,讓我們可以將必要的金鑰新增至保存庫。 在後續步驟中,我們將新增網路限制並啟用信任的服務。

針對金鑰保存庫的屬性,請使用下列指導方針:

  • 名稱:需要唯一名稱。
  • 訂閱:選擇訂閱。
  • 在 [資源群組] 下,選擇現有資源群組,或建立新的資源群組,並輸入資源群組名稱。
  • 在 [位置] 下拉式功能表中,選擇位置。
  • 您可以將其他選項保留為其預設值,或根據其他需求進行挑選。

重要

使用客戶自控金鑰來加密 ACI 部署範本時,建議在金鑰保存庫上設定下列兩個屬性:[虛刪除] 和 [不要清除]。 預設不會啟用這些屬性,但您可以使用 PowerShell 或 Azure CLI 在新的或現有金鑰保存庫上啟用。

產生新的金鑰

建立金鑰保存庫之後,請導覽至 Azure 入口網站中的資源。 在資源刀鋒視窗的左側導覽功能表上,按一下 [設定] 下的 [金鑰]。 在 [金鑰] 的檢視上,按一下 [產生/匯入] 以產生新的金鑰。 針對此金鑰使用任何唯一名稱,以及根據您需求的任何其他喜好設定。 請務必擷取金鑰名稱和版本以進行後續步驟。

Screenshot of key creation settings, PNG.

為您的容器群組建立使用者指派的受控識別

使用 az identity create 命令,在您的訂用帳戶中建立身分識別。 您可以使用建立金鑰保存庫時所使用的相同資源群組,也可以使用不同的資源群組。

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

若要在接下來的步驟中使用身分識別,請使用 az identity show 命令,以將身分識別的服務主體識別碼和資源識別碼儲存在變數中。

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

設定存取原則

建立新的存取原則,以允許使用者指派的身分識別基於加密目的存取金鑰並加以解除包裝。

az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --key-permissions get unwrapKey

修改 Azure Key Vault 的網路權限

下列命令會為您的 Azure Key Vault 設定 Azure 防火牆,並允許 Azure 信任的服務 (例如 ACI 存取)。

az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --default-action Deny
az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --bypass AzureServices

修改 JSON 部署範本

重要

使用客戶自控金鑰將部署資料加密的功能,是在 2022-09-01 API 版本或更新版本中提供。 2022-09-01 API 版本只能透過 ARM 或 REST 使用。 如果您對此有任何問題,則請連絡 Azure 支援。 設定金鑰保存庫金鑰和存取原則之後,請將下列屬性新增至您的 ACI 部署範本。 若要深入了解如何使用範本部署 ACI 資源,請參閱教學課程:使用 Resource Manager 範本部署多容器群組

  • resources 底下,將 apiVersion 設定為 2022-09-01
  • 在部署範本的容器群組屬性區段下,新增包含下列值的 encryptionProperties
    • vaultBaseUrl:金鑰保存庫的 DNS 名稱。 這可在入口網站中金鑰保存庫資源的 [概觀] 刀鋒視窗上找到
    • keyName:稍早所產生金鑰的名稱
    • keyVersion:金鑰的目前版本。 按一下金鑰本身 (在金鑰保存庫資源 [設定] 區段的 [金鑰] 下),即可找到此項目
    • identity:這是稍早建立之受控識別執行個體的資源 URI
  • 在容器群組屬性下,新增值為 Standardsku 屬性。 API 2022-09-01 版需要 sku 屬性。
  • 在 [資源] 下,新增搭配 ACI 使用受控識別所需的 identity 物件,其中包含下列值:
    • type:所使用的身分識別類型 (可以是使用者指派或系統指派的)。 在此案例中,會設定為 "UserAssigned"
    • userAssignedIdentitiesencryptionProperties 物件中與上面所使用相同之使用者指派身分識別的 resourceURI。

下列範本程式碼片段顯示這些額外的屬性來加密部署資料:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "identity": {
         "type": "UserAssigned",
         "userAssignedIdentities": {
           "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
         }
        },
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx",
                "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

以下是完整範本,而此範本是從教學課程:使用 Resource Manager 範本來部署多容器群組中的範本進行調整。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2022-09-01",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
        }
      },
      "properties": {
        "encryptionProperties": {
          "vaultBaseUrl": "https://example.vault.azure.net",
          "keyName": "acikey",
          "keyVersion": "xxxxxxxxxxxxxxxx",
          "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
        },
        "sku": "Standard",
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
              "protocol": "tcp",
              "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

部署資源

如果您已在桌面上建立和編輯範本檔案,則可以將檔案拖曳至您的 Cloud Shell 目錄來上傳檔案。

使用 az group create 命令來建立資源群組。

az group create --name myResourceGroup --location eastus

使用 az deployment group create 命令來部署範本。

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

在幾秒內,您應該會從 Azure 收到首次回應。 部署完成後,ACI 服務所持續保存的所有相關資料都會使用您提供的金鑰進行加密。