Condividi tramite


Crittografare i dati della distribuzione

Quando si eseguono risorse di Istanze di Azure Container nel cloud, il servizio ACI raccoglie e salva in modo permanente i dati correlati ai contenitori. ACI crittografa automaticamente questi dati quando vengono salvati in modo permanente nel cloud. Questa crittografia protegge i dati per soddisfare gli impegni di sicurezza e conformità dell'organizzazione. ACI offre anche la possibilità di crittografare questi dati con la propria chiave, offrendo maggiore controllo sui dati correlati alle distribuzioni ACI.

Crittografia dei dati ACI

I dati in ACI vengono crittografati e decrittografati usando la crittografia AES a 256 bit. È abilitato per tutte le distribuzioni ACI e non è necessario modificare la distribuzione o i contenitori per sfruttare questa crittografia. Questa copertura include i metadati relativi alla distribuzione, alle variabili di ambiente, alle chiavi passate nei contenitori e ai log salvati in modo permanente dopo l'arresto dei contenitori, in modo da poterli visualizzare. La crittografia non influisce sulle prestazioni del gruppo di contenitori e non è previsto alcun costo aggiuntivo per la crittografia.

È possibile fare affidamento su chiavi gestite da Microsoft per la crittografia dei propri dati del contenitore, oppure è possibile gestire la crittografia con le proprie chiavi. Nella tabella seguente vengono messe a confronto queste opzioni:

Chiavi gestite da Microsoft Chiavi gestite dal cliente
Operazioni di crittografia/decrittografia Azure Azure
Archiviazione chiavi Archivio chiavi Microsoft Insieme di credenziali chiave di Azure
Responsabilità della rotazione delle chiavi Microsoft Customer
Accesso alle chiavi Solo Microsoft Microsoft, cliente

Questo articolo esamina due flussi per crittografare i dati con una chiave gestita dal cliente:

  • Crittografare i dati con una chiave gestita dal cliente archiviata in un Azure Key Vault standard
  • Crittografare i dati con una chiave gestita dal cliente e archiviata in un Azure Key Vault protetto da una rete con Servizi attendibili abilitati.

Crittografare i dati con una chiave gestita dal cliente archiviata in un Azure Key Vault standard

Prerequisiti

Creare un'entità servizio per ACI

Il primo passaggio consiste nell’assicurarsi che il tenant di Azure abbia un'entità servizio assegnata per concedere le autorizzazioni al servizio Istanze di Azure Container.

Importante

Per eseguire il comando seguente e creare correttamente un'entità servizio, verificare di disporre delle autorizzazioni per creare entità servizio nel tenant.

Il comando seguente dell'interfaccia della riga di comando configura ACI SP nell'ambiente Azure:

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

L'output dell'esecuzione di questo comando dovrebbe mostrare un'entità servizio configurata con "displayName": "Servizio istanza di Azure Container".

Se non è possibile creare correttamente l'entità servizio:

  • verificare di disporre delle autorizzazioni necessarie per eseguire questa operazione nel tenant
  • verificare se nel tenant esiste già un'entità servizio per la distribuzione in ACI. A tale scopo, eseguire az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 e usare l'entità servizio

Creare una risorsa Key Vault

Creare un'istanza di Azure Key Vault con il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell.

Per le proprietà dell'insieme di credenziali delle chiavi, usare le linee guida seguenti:

  • Nome: è necessario un nome univoco.
  • Abbonamento: Scegliere un abbonamento.
  • In Gruppo di risorse scegliere un gruppo di risorse esistente oppure crearne uno nuovo e immettere un nome per il gruppo di risorse.
  • Scegliere un percorso nel menu a discesa Percorso.
  • È possibile lasciare le altre opzioni sulle impostazioni predefinite o scegliere in base a requisiti aggiuntivi.

Importante

Quando vengono usate chiavi gestite dal cliente per crittografare un modello di distribuzione ACI, è consigliabile impostare le due proprietà seguenti nell'insieme di credenziali delle chiavi, l'eliminazione temporanea e l'eliminazione non definitiva. Queste proprietà non sono abilitate per impostazione predefinita, ma possono essere abilitate tramite PowerShell o l'interfaccia della riga di comando di Azure in un insieme di credenziali delle chiavi nuovo o esistente.

Generare una nuova chiave

Dopo aver creato l'insieme di credenziali delle chiavi, passare alla risorsa nel portale di Azure. Nel menu di spostamento a sinistra del pannello della risorsa, in Impostazioni selezionare Chiavi. Nella visualizzazione "Chiavi" selezionare "Genera/Importa" per generare una nuova chiave. Usare qualsiasi nome univoco per questa chiave e qualsiasi altra preferenza in base alle tue esigenze.

Generare una nuova chiave

Impostare i criteri di accesso

Creare un nuovo criterio di accesso per consentire al servizio ACI di accedere alla chiave.

  • Dopo aver generato la chiave, tornare nel pannello della risorsa dell'insieme di credenziali delle chiavi in Impostazioni e selezionare Criteri di accesso.
  • Nella pagina "Criteri di accesso" per l'insieme di credenziali delle chiavi scegliere Aggiungi criteri di accesso.
  • Impostare leAutorizzazioni chiave per includere Ottenere e Annullare il wrapping della chiaveImpostare le autorizzazioni delle chiavi
  • Per Selezionare principale, selezionare Servizio istanza di Azure Container
  • Selezionare Aggiungi nella parte inferiore

I criteri di accesso dovrebbero ora essere visualizzati nei criteri di accesso dell'insieme di credenziali delle chiavi.

Nuovo criterio di accesso

Modificare il modello di distribuzione JSON

Importante

La crittografia dei dati di distribuzione con una chiave gestita dal cliente è disponibile nella versione più recente dell'API (2019-12-01) attualmente in fase di implementazione. Specificare questa versione API nel modello di distribuzione. In caso di problemi, contattare il supporto tecnico di Azure.

Dopo aver configurato la chiave e i criteri di accesso dell'insieme di credenziali delle chiavi, aggiungere le proprietà seguenti al modello di distribuzione ACI. Per altre informazioni sulla distribuzione di risorse ACI con un modello, vedere l’Esercitazione: distribuire un gruppo multi-contenitore usando un modello di Resource Manager.

  • In resourcesimpostare apiVersion su 2019-12-01.
  • Nella sezione proprietà del gruppo di contenitori del modello di distribuzione aggiungere un encryptionProperties, che contiene i seguenti valori:
    • vaultBaseUrl: nome DNS dell'insieme di credenziali delle chiavi, disponibile nel pannello di panoramica della risorsa dell'insieme di credenziali delle chiavi nel portale
    • keyName: nome della chiave generata in precedenza
    • keyVersion: la versione corrente della chiave. Questo campo è reperibile passando alla chiave stessa (in "Chiavi" nella sezione Impostazioni della risorsa dell'insieme di credenziali delle chiavi)
  • Nelle proprietà del gruppo di contenitori aggiungere una proprietà sku con valore Standard. La proprietà sku è necessaria nell'API versione 2019-12-01.

Il frammento di modello seguente mostra queste proprietà aggiuntive per crittografare i dati di distribuzione:

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

Di seguito è riportato un modello completo, adattato dal modello in Esercitazione: distribuire un gruppo multi-contenitore usando un modello di 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]"
    }
  }
}

Distribuire le risorse

Se è stato creato e modificato il file del modello sul desktop, è possibile caricarlo nella directory di Cloud Shell trascinandovi il file.

Creare un gruppo di risorse con il comando az group create.

az group create --name myResourceGroup --location eastus

Distribuire il modello con il comando az deployment group create.

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

Entro pochi secondi si dovrebbe ricevere una risposta iniziale da Azure. Al termine della distribuzione, tutti i dati correlati al servizio ACI vengono crittografati con la chiave specificata.

Crittografare i dati con una chiave gestita dal cliente in un Azure Key Vault protetto da una rete con Servizi attendibili abilitati

Creare una risorsa Key Vault

Creare un'istanza di Azure Key Vault con il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell. Per iniziare, non applicare limitazioni di rete in modo da poter aggiungere chiavi necessarie all'insieme di credenziali. Nei passaggi successivi si aggiungono limitazioni di rete e si abilitano i servizi attendibili.

Per le proprietà dell'insieme di credenziali delle chiavi, usare le linee guida seguenti:

  • Nome: è necessario un nome univoco.
  • Abbonamento: Scegliere un abbonamento.
  • In Gruppo di risorse scegliere un gruppo di risorse esistente oppure crearne uno nuovo e immettere un nome per il gruppo di risorse.
  • Scegliere un percorso nel menu a discesa Percorso.
  • È possibile lasciare le altre opzioni sulle impostazioni predefinite o scegliere in base a requisiti aggiuntivi.

Importante

Quando vengono usate chiavi gestite dal cliente per crittografare un modello di distribuzione ACI, è consigliabile impostare le due proprietà seguenti nell'insieme di credenziali delle chiavi, l'eliminazione temporanea e l'eliminazione non definitiva. Queste proprietà non sono abilitate per impostazione predefinita, ma possono essere abilitate tramite PowerShell o l'interfaccia della riga di comando di Azure in un insieme di credenziali delle chiavi nuovo o esistente.

Generare una nuova chiave

Dopo aver creato l'insieme di credenziali delle chiavi, passare alla risorsa nel portale di Azure. Nel menu di spostamento a sinistra del pannello della risorsa, in Impostazioni selezionare Chiavi. Nella visualizzazione "Chiavi" scegliere "Genera/Importa" per generare una nuova chiave. Usare qualsiasi nome univoco per questa chiave e qualsiasi altra preferenza in base alle tue esigenze. Assicurarsi di acquisire il nome e la versione della chiave per i passaggi successivi.

Screenshot delle impostazioni di creazione delle chiavi, PNG.

Creare un'identità gestita assegnata dall'utente per il gruppo di contenitori

Creare un'identità nella sottoscrizione usando il comando az identity create. È possibile usare lo stesso gruppo di risorse usato per creare l'insieme di credenziali delle chiavi oppure usarne uno diverso.

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

Per usare l'identità nei passaggi seguenti, usare il comando az identity show per archiviare l'ID dell'entità servizio e l'ID risorsa dell'identità nelle variabili.

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

Impostare i criteri di accesso

Creare un nuovo criterio di accesso per consentire all'identità assegnata dall'utente di accedere e annullare il wrapping della chiave a scopo di crittografia.

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

Modificare le autorizzazioni di rete di Azure Key Vault

I comandi seguenti configurano un Firewall di Azure per Azure Key Vault e consentono servizi attendibili di Azure, ad esempio l'accesso ACI.

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

Modificare il modello di distribuzione JSON

Importante

La crittografia dei dati di distribuzione con una chiave gestita dal cliente è disponibile nella versione dell'API 2022-09-01 o successiva. La versione dell'API 2022-09-01 è disponibile solo tramite ARM o REST. In caso di problemi, contattare il supporto tecnico di Azure. Dopo aver configurato la chiave e i criteri di accesso dell'insieme di credenziali delle chiavi, aggiungere le proprietà seguenti al modello di distribuzione ACI. Per altre informazioni sulla distribuzione di risorse ACI con un modello, vedere l’Esercitazione: distribuire un gruppo multi-contenitore usando un modello di Resource Manager.

  • In resourcesimpostare apiVersion su 2022-09-01.
  • Nella sezione proprietà del gruppo di contenitori del modello di distribuzione aggiungere un encryptionProperties, che contiene i seguenti valori:
    • vaultBaseUrl: nome DNS dell'insieme di credenziali delle chiavi. Questa proprietà è disponibile nel pannello di panoramica della risorsa dell'insieme di credenziali delle chiavi nel portale
    • keyName: nome della chiave generata in precedenza
    • keyVersion: la versione corrente della chiave. Questa proprietà è disponibile facendo clic sulla chiave stessa (in "Chiavi" nella sezione Impostazioni della risorsa dell'insieme di credenziali delle chiavi)
    • identity: questa proprietà è l'URI della risorsa dell'istanza di Identità gestita creata in precedenza
  • Nelle proprietà del gruppo di contenitori aggiungere una proprietà sku con valore Standard. La proprietà sku è necessaria nell'API versione 2022-09-01.
  • In Risorse aggiungere l'oggetto identity necessario per usare l'identità gestita con ACI, che contiene i valori seguenti:
    • type: tipo dell'identità usata (assegnata dall'utente o assegnata dal sistema). Questo caso è impostato su "UserAssigned"
    • userAssignedIdentities: l'URI della risorsa della stessa identità assegnata dall'utente usata nell'oggetto encryptionProperties.

Il frammento di modello seguente mostra queste proprietà aggiuntive per crittografare i dati di distribuzione:

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

Di seguito è riportato un modello completo, adattato dal modello in Esercitazione: distribuire un gruppo multi-contenitore usando un modello di 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]"
    }
  }
}

Distribuire le risorse

Se è stato creato e modificato il file del modello sul desktop, è possibile caricarlo nella directory di Cloud Shell trascinandovi il file.

Creare un gruppo di risorse con il comando az group create.

az group create --name myResourceGroup --location eastus

Distribuire il modello con il comando az deployment group create.

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

Entro pochi secondi si dovrebbe ricevere una risposta iniziale da Azure. Al termine della distribuzione, tutti i dati correlati al servizio ACI vengono crittografati con la chiave specificata.