Поделиться через


Шифрование данных развертывания

При запуске ресурсов экземпляров контейнеров Azure (ACI) в облаке служба ACI собирает и сохраняет данные, связанные с контейнерами. ACI автоматически шифрует эти данные при сохранении в облаке. Такое шифрование защищает данные, помогая соблюдать корпоративные обязательства по обеспечению безопасности и нормативно-правовому соответствию. ACI также позволяет шифровать эти данные с помощью собственного ключа, обеспечивая больший контроль над данными, связанными с развертываниями ACI.

О шифровании данных ACI

Данные в ACI шифруются и расшифровываются с использованием 256-разрядного шифрования AES. Он включен для всех развертываний ACI, и вам не нужно изменять развертывание или контейнеры, чтобы воспользоваться преимуществами этого шифрования. Сюда входят метаданные о развертывании, переменные среды, ключи, передаваемые в контейнеры, и журналы, сохраненные после остановки контейнеров, чтобы их по-прежнему можно было просмотреть. Шифрование не влияет на производительность группы контейнеров, и для него не требуются дополнительные затраты.

Вы можете использовать ключи, управляемые Майкрософт, для шифрования данных контейнера, или управлять шифрованием с помощью собственных ключей. В следующей таблице сравниваются эти два варианта:

Ключи, управляемые Майкрософт Ключи, управляемые клиентом
Операции шифрования и расшифровки Azure Azure
Хранилище ключей Хранилище ключей Майкрософт Azure Key Vault
Ответственность за смену ключей Microsoft Customer
Доступ к ключам Только Майкрософт Майкрософт, клиент

В этой статье рассматриваются два потока шифрования данных с помощью ключа, управляемого клиентом:

  • Шифрование данных с помощью ключа, управляемого клиентом, хранящегося в стандартном Key Vault Azure
  • Шифрование данных с помощью ключа, управляемого клиентом, хранящегося в защищенной сети Key Vault Azure с включенными доверенными службами.

Шифрование данных с помощью ключа, управляемого клиентом, хранящегося в стандартном Key Vault Azure

Предварительные требования

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье Краткое руководство по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в разделе Запуск Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, приведены в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Создание субъекта-службы для ACI

Прежде всего необходимо обеспечить, чтобы клиенту Azure был назначен субъект-служба для предоставления разрешений службе "Экземпляры контейнеров Azure".

Важно!

Чтобы выполнить следующую команду и успешно создать субъект-службу, убедитесь, что у вас есть разрешения на создание субъектов-служб в клиенте.

Следующая команда CLI настраивает ACI SP в среде Azure:

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

В выходных данных выполнения этой команды должна отображаться субъект-служба, настроенная с использованием "displayName": "служба экземпляра контейнера Azure".

Если вы не можете успешно создать субъект-службу:

  • убедитесь, что у вас есть соответствующие разрешения в клиенте
  • проверьте, существует ли уже субъект-служба в вашем клиенте для развертывания в ACI. Для этого запустите az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 и используйте эту субъект-службу

Создание ресурса хранилища ключей

Создайте хранилище ключей Azure с помощью портала Azure, Azure CLI или Azure PowerShell.

Для свойств хранилища ключей используйте следующие рекомендации:

  • Name (Имя). Укажите уникальное имя.
  • Подписка: Выберите подписку.
  • Для группы ресурсов выберите существующую группу ресурсов или создайте новую и введите имя группы ресурсов.
  • Выберите расположение в раскрывающемся меню "Расположение".
  • Можно оставить другие параметры по умолчанию или выбрать их в зависимости от дополнительных требований.

Важно!

При использовании ключей, управляемых клиентом, для шифрования шаблона развертывания ACI рекомендуется установить следующие два свойства для хранилища ключей: "Обратимое удаление" и "Не очищать". Эти свойства по умолчанию отключены, но их можно включить с помощью PowerShell или Azure CLI в новом или имеющемся хранилище ключей.

Создание нового ключа

После создания хранилища ключей перейдите к ресурсу на портале Azure. В меню навигации слева в колонке ресурсов в разделе "Параметры" нажмите Ключи. В представлении "Ключи" нажмите кнопку "Создать или импортировать", чтобы создать новый ключ. Используйте любое уникальное имя для этого ключа и другие параметры в соответствии с вашими требованиями.

Создание нового ключа

Настройка политики доступа

Создайте новую политику доступа, чтобы предоставить службе ACI доступ к ключу.

  • После создания ключа вернитесь в колонку ресурсов хранилища ключей в разделе "Параметры" и нажмите Политики доступа.
  • На странице "Политики доступа" для хранилища ключей нажмите Добавить политику доступа.
  • Установите Разрешения ключей таким образом, чтобы в их число входили Получение и Распаковка ключаУстановка разрешений для ключа.
  • В разделе Выбор субъекта выберите Служба "Экземпляр контейнера Azure" .
  • В нижней части страницы нажмите Добавить

После этого политика доступа должна отобразиться в политиках доступа хранилища ключей.

Новая политика доступа

Изменение шаблона развертывания JSON

Важно!

Шифрование данных развертывания с помощью ключа, управляемого клиентом, доступно в последней версии API (2019-12-01), которая выходит в данный момент. Укажите версию API в шаблоне развертывания. Если у вас возникнут проблемы, обратитесь в службу поддержки Azure.

После настройки ключа и политики доступа к хранилищу ключей добавьте следующие свойства в шаблон развертывания ACI. Дополнительные сведения о развертывании ресурсов ACI с помощью шаблона см. в руководстве по развертыванию группы с несколькими контейнерами с использованием шаблона Resource Manager.

  • В разделе resources задайте для параметра apiVersion значение 2019-12-01.
  • В разделе свойств группы контейнеров шаблона развертывания добавьте элемент encryptionProperties со следующими значениями:
    • vaultBaseUrl: DNS-имя хранилища ключей, его можно найти в колонке обзора ресурса хранилища ключей на портале;
    • keyName: имя ключа, созданного ранее;
    • keyVersion: текущая версия ключа. Ее можно найти, нажав ключ ("Ключи" в разделе "Параметры" ресурса хранилища ключей).
  • В свойствах группы контейнеров добавьте свойство sku со значением Standard. Свойство sku является обязательным в API версии 2019-12-01.

В следующем фрагменте шаблона показаны эти дополнительные свойства для шифрования данных развертывания:

[...]
"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, будут зашифрованы с помощью предоставленного ключа.

Шифрование данных с помощью ключа, управляемого клиентом, в защищенном сетью Key Vault Azure с включенными доверенными службами

Создание ресурса хранилища ключей

Создайте хранилище ключей Azure с помощью портала Azure, Azure CLI или Azure PowerShell. Для начала не применяйте ограничения сети, чтобы мы могли добавить необходимые ключи в хранилище. На последующих шагах мы добавим ограничения сети и включим доверенные службы.

Для свойств хранилища ключей используйте следующие рекомендации:

  • Name (Имя). Укажите уникальное имя.
  • Подписка: Выберите подписку.
  • Для группы ресурсов выберите существующую группу ресурсов или создайте новую и введите имя группы ресурсов.
  • Выберите расположение в раскрывающемся меню "Расположение".
  • Можно оставить другие параметры по умолчанию или выбрать их в зависимости от дополнительных требований.

Важно!

При использовании ключей, управляемых клиентом, для шифрования шаблона развертывания ACI рекомендуется установить следующие два свойства для хранилища ключей: "Обратимое удаление" и "Не очищать". Эти свойства по умолчанию отключены, но их можно включить с помощью PowerShell или Azure CLI в новом или имеющемся хранилище ключей.

Создание нового ключа

После создания хранилища ключей перейдите к ресурсу на портале Azure. В меню навигации слева в колонке ресурсов в разделе "Параметры" нажмите Ключи. В представлении "Ключи" нажмите кнопку "Создать или импортировать", чтобы создать новый ключ. Используйте любое уникальное имя для этого ключа и другие параметры в соответствии с вашими требованиями. Обязательно запишите имя и версию ключа для последующих шагов.

Снимок экрана: параметры создания ключей в ФОРМАТЕ 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

Изменение сетевых разрешений Key Vault Azure

Следующие команды настраивают Брандмауэр 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

Важно!

Шифрование данных развертывания с помощью ключа, управляемого клиентом, доступно в API 2022-09-01 или более поздней версии. Версия API 2022-09-01 доступна только через ARM или REST. Если у вас возникнут проблемы, обратитесь в службу поддержки Azure. После настройки ключа и политики доступа к хранилищу ключей добавьте следующие свойства в шаблон развертывания ACI. Дополнительные сведения о развертывании ресурсов ACI с помощью шаблона см. в руководстве по развертыванию группы с несколькими контейнерами с использованием шаблона Resource Manager.

  • В разделе resources задайте для параметра apiVersion значение 2022-09-01.
  • В разделе свойств группы контейнеров шаблона развертывания добавьте элемент encryptionProperties со следующими значениями:
    • vaultBaseUrl: DNS-имя хранилища ключей. Это можно найти в колонке обзора ресурса хранилища ключей на портале.
    • keyName: имя ключа, созданного ранее;
    • keyVersion: текущая версия ключа. Ее можно найти, нажав ключ ("Ключи" в разделе "Параметры" ресурса хранилища ключей).
    • identity: это URI ресурса экземпляра управляемого удостоверения, созданного ранее.
  • В свойствах группы контейнеров добавьте свойство sku со значением Standard. Свойство sku является обязательным в API версии 2022-09-01.
  • В разделе resources добавьте объект , необходимый identity для использования управляемого удостоверения с ACI, который содержит следующие значения:
    • type: тип используемого удостоверения (назначаемого пользователем или системой). В этом случае будет задано значение UserAssigned.
    • userAssignedIdentities: ресурс URI того же назначаемого пользователем удостоверения, используемого выше в объекте encryptionProperties .

В следующем фрагменте шаблона показаны эти дополнительные свойства для шифрования данных развертывания:

[...]
"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, будут зашифрованы с помощью предоставленного ключа.