Szyfrowanie danych wdrożenia

Podczas uruchamiania zasobów Azure Container Instances (ACI) w chmurze usługa ACI zbiera i utrwala dane związane z kontenerami. Usługa ACI automatycznie szyfruje te dane, gdy są utrwalane w chmurze. To szyfrowanie chroni dane, aby ułatwić spełnienie zobowiązań organizacji w zakresie zabezpieczeń i zgodności. Usługa ACI zapewnia również możliwość szyfrowania tych danych przy użyciu własnego klucza, co zapewnia większą kontrolę nad danymi związanymi z wdrożeniami usługi ACI.

Informacje o szyfrowaniu danych ACI

Dane w usłudze ACI są szyfrowane i odszyfrowywane przy użyciu 256-bitowego szyfrowania AES. Jest ona włączona dla wszystkich wdrożeń usługi ACI i nie trzeba modyfikować wdrożenia ani kontenerów, aby korzystać z tego szyfrowania. Obejmuje to metadane dotyczące wdrożenia, zmiennych środowiskowych, kluczy przekazywanych do kontenerów i dzienników utrwalone po zatrzymaniu kontenerów, aby nadal je zobaczyć. Szyfrowanie nie wpływa na wydajność grupy kontenerów i nie wiąże się z dodatkowymi kosztami szyfrowania.

Możesz polegać na kluczach zarządzanych przez firmę Microsoft na potrzeby szyfrowania danych kontenera lub zarządzać szyfrowaniem przy użyciu własnych kluczy. Poniższa tabela porównuje następujące opcje:

Klucze zarządzane przez firmę Microsoft Klucze zarządzane przez klienta
Operacje szyfrowania/odszyfrowywania Azure Azure
Magazyn kluczy Magazyn kluczy firmy Microsoft Azure Key Vault
Odpowiedzialność za rotację kluczy Microsoft Klient
Dostęp do klucza Tylko firma Microsoft Microsoft, Klient

W tym artykule opisano dwa przepływy szyfrowania danych przy użyciu klucza zarządzanego przez klienta:

  • Szyfrowanie danych przy użyciu klucza zarządzanego przez klienta przechowywanego w standardowej usłudze Azure Key Vault
  • Szyfrowanie danych przy użyciu klucza zarządzanego przez klienta przechowywanego w chronionej sieci usłudze Azure Key Vault z włączonymi usługami zaufanymi.

Szyfrowanie danych przy użyciu klucza zarządzanego przez klienta przechowywanego w standardowej usłudze Azure Key Vault

Wymagania wstępne

Tworzenie jednostki usługi dla usługi ACI

Pierwszym krokiem jest upewnienie się, że dzierżawa platformy Azure ma przypisaną jednostkę usługi do udzielania uprawnień do usługi Azure Container Instances.

Ważne

Aby uruchomić następujące polecenie i pomyślnie utworzyć jednostkę usługi, upewnij się, że masz uprawnienia do tworzenia jednostek usługi w dzierżawie.

Następujące polecenie interfejsu wiersza polecenia skonfiguruje usługę ACI SP w środowisku platformy Azure:

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

Dane wyjściowe z uruchomienia tego polecenia powinny zawierać jednostkę usługi, która została skonfigurowana za pomocą polecenia "displayName": "Azure Container Instance Service".

Jeśli nie możesz pomyślnie utworzyć jednostki usługi:

  • Upewnij się, że masz uprawnienia do tego w dzierżawie
  • sprawdź, czy jednostka usługi już istnieje w dzierżawie na potrzeby wdrażania w usłudze ACI. Możesz to zrobić, uruchamiając az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 i używając tej jednostki usługi zamiast tego

Tworzenie zasobu Key Vault

Utwórz Key Vault platformy Azure przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.

W przypadku właściwości magazynu kluczy użyj następujących wskazówek:

  • Nazwa: wymagana jest unikatowa nazwa.
  • Subskrypcja: wybierz subskrypcję.
  • W obszarze Grupa zasobów wybierz istniejącą grupę zasobów lub utwórz nową i wprowadź nazwę grupy zasobów.
  • W menu rozwijanym Lokalizacja wybierz lokalizację.
  • Możesz pozostawić inne opcje do domyślnych lub wybrać na podstawie dodatkowych wymagań.

Ważne

W przypadku szyfrowania szablonu wdrożenia usługi ACI za pomocą kluczy zarządzanych przez klienta zaleca się ustawienie dwóch następujących dwóch właściwości w magazynie kluczy, usuwanie nietrwałe i nie przeczyszczanie. Te właściwości nie są domyślnie włączone, ale można je włączyć przy użyciu programu PowerShell lub interfejsu wiersza polecenia platformy Azure w nowym lub istniejącym magazynie kluczy.

Generowanie nowego klucza

Po utworzeniu magazynu kluczy przejdź do zasobu w Azure Portal. W menu nawigacji po lewej stronie bloku zasobu w obszarze Ustawienia kliknij pozycję Klucze. W widoku "Klucze" kliknij pozycję "Generuj/Importuj", aby wygenerować nowy klucz. Użyj dowolnej unikatowej nazwy dla tego klucza i wszelkich innych preferencji na podstawie Twoich wymagań.

Generowanie nowego klucza

Ustawianie zasad dostępu

Utwórz nowe zasady dostępu umożliwiające usłudze ACI dostęp do klucza.

  • Po wygenerowaniu klucza w bloku zasobu magazynu kluczy w obszarze Ustawienia kliknij pozycję Zasady dostępu.
  • Na stronie "Zasady dostępu" magazynu kluczy kliknij pozycję Dodaj zasady dostępu.
  • Ustaw uprawnienia klucza, aby uwzględnić uprawnienia Do pobierania i odpakowywania zestawu kluczy
  • W obszarze Wybierz jednostkę wybierz pozycję Azure Container Instance Service
  • Kliknij pozycję Dodaj u dołu

Zasady dostępu powinny być teraz wyświetlane w zasadach dostępu magazynu kluczy.

Nowe zasady dostępu

Modyfikowanie szablonu wdrożenia JSON

Ważne

Szyfrowanie danych wdrożenia przy użyciu klucza zarządzanego przez klienta jest dostępne w najnowszej wersji interfejsu API (2019-12-01), która jest obecnie wdrażana. Określ tę wersję interfejsu API w szablonie wdrożenia. Jeśli masz jakiekolwiek problemy z tym, skontaktuj się z pomocą techniczną platformy Azure.

Po skonfigurowaniu klucza magazynu kluczy i zasad dostępu dodaj następujące właściwości do szablonu wdrożenia usługi ACI. Dowiedz się więcej o wdrażaniu zasobów usługi ACI za pomocą szablonu w samouczku: wdrażanie grupy z wieloma kontenerami przy użyciu szablonu Resource Manager.

  • W obszarze resourcesustaw wartość 2019-12-01apiVersion .
  • W sekcji właściwości grupy kontenerów szablonu wdrożenia dodaj element encryptionProperties, który zawiera następujące wartości:
    • vaultBaseUrl: nazwa DNS magazynu kluczy można znaleźć w bloku przeglądu zasobu magazynu kluczy w portalu
    • keyName: nazwa wygenerowanego wcześniej klucza
    • keyVersion: bieżąca wersja klucza. Można to znaleźć, klikając sam klucz (w obszarze "Klucze" w sekcji Ustawienia zasobu magazynu kluczy)
  • W obszarze właściwości grupy kontenerów sku dodaj właściwość z wartością Standard. Właściwość jest wymagana sku w interfejsie API w wersji 2019-12-01.

Poniższy fragment kodu szablonu przedstawia te dodatkowe właściwości służące do szyfrowania danych wdrożenia:

[...]
"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": {
                [...]
            }
        }
    }
]

Poniżej znajduje się kompletny szablon dostosowany z szablonu w artykule Samouczek: wdrażanie grupy z wieloma kontenerami przy użyciu szablonu 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]"
    }
  }
}

Wdrażanie zasobów

Jeśli plik szablonu został utworzony i edytowany na pulpicie, możesz przekazać go do katalogu Cloud Shell, przeciągając go do niego.

Utwórz grupę zasobów za pomocą polecenia az group create.

az group create --name myResourceGroup --location eastus

Wdróż szablon za pomocą polecenia az deployment group create .

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

W ciągu kilku sekund powinna pojawić się początkowa odpowiedź z platformy Azure. Po zakończeniu wdrażania wszystkie dane związane z nim utrwalone przez usługę ACI zostaną zaszyfrowane przy użyciu podanego klucza.

Szyfrowanie danych przy użyciu klucza zarządzanego przez klienta w chronionej przez sieć usłudze Azure Key Vault z włączonymi usługami zaufanymi

Tworzenie zasobu Key Vault

Utwórz Key Vault platformy Azure przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell. Aby rozpocząć, nie należy stosować żadnych ograniczeń sieciowych, aby można było dodać niezbędne klucze do magazynu. W kolejnych krokach dodamy ograniczenia sieciowe i włączymy zaufane usługi.

W przypadku właściwości magazynu kluczy należy użyć następujących wskazówek:

  • Nazwa: wymagana jest unikatowa nazwa.
  • Subskrypcja: wybierz subskrypcję.
  • W obszarze Grupa zasobów wybierz istniejącą grupę zasobów lub utwórz nową i wprowadź nazwę grupy zasobów.
  • W menu rozwijanym Lokalizacja wybierz lokalizację.
  • Możesz pozostawić inne opcje do wartości domyślnych lub wybrać na podstawie dodatkowych wymagań.

Ważne

W przypadku używania kluczy zarządzanych przez klienta do szyfrowania szablonu wdrożenia usługi ACI zaleca się ustawienie następujących dwóch właściwości w magazynie kluczy, usuwanie nietrwałe i nie przeczyszczanie. Te właściwości nie są domyślnie włączone, ale można je włączyć przy użyciu programu PowerShell lub interfejsu wiersza polecenia platformy Azure w nowym lub istniejącym magazynie kluczy.

Generowanie nowego klucza

Po utworzeniu magazynu kluczy przejdź do zasobu w Azure Portal. W menu nawigacji po lewej stronie bloku zasobu w obszarze Ustawienia kliknij pozycję Klucze. W widoku "Klucze" kliknij pozycję "Generuj/importuj", aby wygenerować nowy klucz. Użyj dowolnej unikatowej nazwy dla tego klucza i wszelkich innych preferencji na podstawie Twoich wymagań. Pamiętaj, aby przechwycić nazwę i wersję klucza w kolejnych krokach.

Zrzut ekranu przedstawiający ustawienia tworzenia kluczy PNG.

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika dla grupy kontenerów

Utwórz tożsamość w subskrypcji przy użyciu polecenia az identity create . Możesz użyć tej samej grupy zasobów użytej do utworzenia magazynu kluczy lub użyć innej.

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

Aby użyć tożsamości w poniższych krokach, użyj polecenia az identity show , aby zapisać identyfikator jednostki usługi tożsamości i identyfikator zasobu w zmiennych.

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

Ustawianie zasad dostępu

Utwórz nowe zasady dostępu umożliwiające tożsamości przypisanej przez użytkownika dostęp do klucza i odpakowywanie go do celów szyfrowania.

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

Modyfikowanie uprawnień sieciowych usługi Azure Key Vault

Następujące polecenia konfigurują Azure Firewall dla usługi Azure Key Vault i zezwalają na dostęp do zaufanych usług platformy Azure, takich jak dostęp do usługi ACI.

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

Modyfikowanie szablonu wdrożenia JSON

Ważne

Szyfrowanie danych wdrożenia przy użyciu klucza zarządzanego przez klienta jest dostępne w wersji interfejsu API 2022-09-01 lub nowszej. Wersja interfejsu API 2022-09-01 jest dostępna tylko za pośrednictwem usługi ARM lub REST. Jeśli masz problemy z tym, skontaktuj się z pomocą techniczną platformy Azure. Po skonfigurowaniu zasad dostępu i klucza magazynu kluczy dodaj następujące właściwości do szablonu wdrożenia usługi ACI. Dowiedz się więcej o wdrażaniu zasobów usługi ACI za pomocą szablonu w artykule Samouczek: wdrażanie grupy z wieloma kontenerami przy użyciu szablonu Resource Manager.

  • W obszarze resourcesustaw wartość 2022-09-01apiVersion .
  • W sekcji właściwości grupy kontenerów szablonu wdrożenia dodaj element encryptionProperties, który zawiera następujące wartości:
    • vaultBaseUrl: nazwa DNS magazynu kluczy. Można to znaleźć w bloku przeglądu zasobu magazynu kluczy w portalu
    • keyName: nazwa wygenerowanego wcześniej klucza
    • keyVersion: bieżąca wersja klucza. Można to znaleźć, klikając sam klucz (w obszarze "Klucze" w sekcji Ustawienia zasobu magazynu kluczy)
    • identity: jest to identyfikator URI zasobu utworzonego wcześniej wystąpienia tożsamości zarządzanej
  • W obszarze właściwości grupy kontenerów dodaj sku właściwość z wartością Standard. Właściwość jest wymagana sku w interfejsie API w wersji 2022-09-01.
  • W obszarze zasobów dodaj identity obiekt wymagany do używania tożsamości zarządzanej z usługą ACI, która zawiera następujące wartości:
    • type: typ używanej tożsamości (przypisanej przez użytkownika lub przypisanej przez system). W tym przypadku zostanie ustawiona wartość "UserAssigned"
    • userAssignedIdentities: identyfikator resourceURI tej samej tożsamości przypisanej przez użytkownika użytej encryptionProperties powyżej w obiekcie .

Poniższy fragment kodu szablonu przedstawia te dodatkowe właściwości do szyfrowania danych wdrożenia:

[...]
"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": {
                [...]
            }
        }
    }
]

Poniżej znajduje się kompletny szablon dostosowany z szablonu w artykule Samouczek: wdrażanie grupy z wieloma kontenerami przy użyciu szablonu 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]"
    }
  }
}

Wdrażanie zasobów

Jeśli plik szablonu został utworzony i edytowany na pulpicie, możesz przekazać go do katalogu Cloud Shell, przeciągając do niego plik.

Utwórz grupę zasobów za pomocą polecenia az group create.

az group create --name myResourceGroup --location eastus

Wdróż szablon za pomocą polecenia az deployment group create .

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

W ciągu kilku sekund powinna pojawić się początkowa odpowiedź z platformy Azure. Po zakończeniu wdrażania wszystkie dane związane z nim utrwalone przez usługę ACI zostaną zaszyfrowane przy użyciu podanego klucza.