在 Azure 容器实例中装载机密卷

可以使用机密卷向容器组中的容器提供敏感信息。 机密卷将机密存储在该卷内的文件中,然后容器组中的容器可以访问这些机密。 将机密存储在机密卷中,可以避免将敏感数据(例如,SSH 密钥或数据库凭据)添加到应用程序代码中。

  • 与机密一起部署到容器组中后,机密卷将为只读。
  • Tmpfs 是一种依托于 RAM 的文件系统,支持所有机密卷;其内容永远不会写入非易失性存储。

注意

机密卷目前仅限于 Linux 容器。 在设置环境变量中了解如何为 Linux 容器传递安全环境变量。

装载机密卷 - Azure CLI

若要使用 Azure CLI 部署包含一个或多个机密的容器,请在 az container create 命令中包含 --secrets--secrets-mount-path 参数。 此示例在 /mnt/secrets 处装载一个机密卷,该卷由两个包含机密“mysecret1”和“mysecret2”的文件组成:

az container create \
    --resource-group myResourceGroup \
    --name secret-volume-demo \
    --image mcr.microsoft.com/azuredocs/aci-helloworld \
    --secrets mysecret1="My first secret FOO" mysecret2="My second secret BAR" \
    --secrets-mount-path /mnt/secrets

以下 az container exec 输出演示在运行的容器中打开 shell,列出机密卷中的文件,然后显示其内容:

az container exec \
  --resource-group myResourceGroup \
  --name secret-volume-demo --exec-command "/bin/sh"
/usr/src/app # ls /mnt/secrets
mysecret1
mysecret2
/usr/src/app # cat /mnt/secrets/mysecret1
My first secret FOO
/usr/src/app # cat /mnt/secrets/mysecret2
My second secret BAR
/usr/src/app # exit
Bye.

装载机密卷 - YAML

还可以使用 Azure CLI 和 YAML 模板部署容器组。 在部署由多个容器组成的容器组时,通过 YAML 模板进行部署是首选方法。

使用 YAML 模板进行部署时,模板中的机密值必须已进行 Base64 编码。 但是,机密值会以明文形式显示在容器的文件中。

以下 YAML 模板定义了一个容器组,其中包含一个容器,该容器在 /mnt/secrets 处装载了一个机密卷。 机密卷有两个包含机密“mysecret1”和“mysecret2”的文件。

apiVersion: '2019-12-01'
location: chinaeast2
name: secret-volume-demo
properties:
  containers:
  - name: aci-tutorial-app
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-helloworld:latest
      ports: []
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /mnt/secrets
        name: secretvolume1
  osType: Linux
  restartPolicy: Always
  volumes:
  - name: secretvolume1
    secret:
      mysecret1: TXkgZmlyc3Qgc2VjcmV0IEZPTwo=
      mysecret2: TXkgc2Vjb25kIHNlY3JldCBCQVIK
tags: {}
type: Microsoft.ContainerInstance/containerGroups

若要使用 YAML 模板进行部署,请将前面的 YAML 保存到名为 deploy-aci.yaml 的文件中,然后使用 --file 参数执行 az container create 命令:

# Deploy with YAML template
az container create \
  --resource-group myResourceGroup \
  --file deploy-aci.yaml

装载机密卷 - 资源管理器

除了 CLI 和 YAML 部署外,还可以使用 Azure 资源管理器模板部署容器组。

首先,在模板的容器组 properties 节中填充 volumes 数组。 使用资源管理器模板进行部署时,模板中的机密值必须已进行 Base64 编码。 但是,机密值会以明文形式显示在容器的文件中。

接下来,针对容器组中希望装载机密卷的每个容器,在容器定义的 properties 节中填充 volumeMounts 数组。

以下资源管理器模板定义了一个容器组,其中包含一个容器,该容器在 /mnt/secrets 处装载了一个机密卷。 机密卷有两个机密:“mysecret1”和“mysecret2”。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "microsoft/aci-helloworld:latest"
  },
  "resources": [
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2021-03-01",
      "name": "secret-volume-demo",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "secretvolume1",
                  "mountPath": "/mnt/secrets"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ]
        },
        "volumes": [
          {
            "name": "secretvolume1",
            "secret": {
              "mysecret1": "TXkgZmlyc3Qgc2VjcmV0IEZPTwo=",
              "mysecret2": "TXkgc2Vjb25kIHNlY3JldCBCQVIK"
            }
          }
        ]
      }
    }
  ]
}

若要使用资源管理器模板进行部署,请将前面的 JSON 保存到名为 deploy-aci.json 的文件中,然后使用 --template-file 参数执行 az deployment group create 命令:

# Deploy with Resource Manager template
az deployment group create \
  --resource-group myResourceGroup \
  --template-file deploy-aci.json

后续步骤

了解如何在 Azure 容器实例中装载其他卷类型:

安全环境变量

向容器(包括 Windows 容器)提供敏感信息的另一种方法是通过使用安全环境变量