Share via


Crittografare i dati della distribuzione

Quando si eseguono risorse Istanze di Azure Container (ACI) nel cloud, il servizio ACI raccoglie e rende persistenti 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 un maggiore controllo sui dati correlati alle distribuzioni ACI.

Informazioni sulla crittografia dei dati ACI

I dati in ACI vengono crittografati e decrittografati usando la crittografia AES a 256 bit. È abilitata per tutte le distribuzioni ACI e non è necessario modificare la distribuzione o i contenitori per sfruttare questa crittografia. Sono inclusi 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 comunque visualizzare. La crittografia non influisce sulle prestazioni del gruppo di contenitori e non è previsto alcun costo aggiuntivo per la crittografia.

È possibile usare chiavi gestite da Microsoft per la crittografia dei dati del contenitore oppure gestire la crittografia con le proprie chiavi. Nella tabella seguente vengono confrontate 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 Key Vault standard di Azure
  • Crittografare i dati con una chiave gestita dal cliente archiviata in un Key Vault di Azure protetto da rete con Servizi attendibili abilitati.

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

Prerequisiti

Creare un'entità servizio per ACI

Il primo passaggio consiste nel garantire che al tenant di Azure sia assegnata un'entità servizio 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 dell'interfaccia della riga di comando seguente configurerà 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 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:

  • Name: è necessario un nome univoco.
  • Sottoscrizione Scegliere una sottoscrizione.
  • 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 predefinite o scegliere in base ai requisiti aggiuntivi.

Importante

Quando si usano 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 usando 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 in portale di Azure. Nel menu di spostamento a sinistra del pannello delle risorse fare clic su Chiavi in Impostazioni. Nella visualizzazione "Chiavi" fare clic su "Genera/Importa" per generare una nuova chiave. Usa 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 al pannello della risorsa dell'insieme di credenziali delle chiavi, in Impostazioni fare clic su Criteri di accesso.
  • Nella pagina "Criteri di accesso" per l'insieme di credenziali delle chiavi fare clic su Aggiungi criteri di accesso.
  • Impostare le autorizzazioni per le chiavi per includere le autorizzazioni Get e Unwrap KeySet key
  • Per Seleziona entità selezionareServizio istanza di Azure Container
  • Fare clic su 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 distribuzione. Specificare questa versione dell'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 Esercitazione: Distribuire un gruppo multi-contenitore usando un modello di Resource Manager.

  • In resourcesimpostare su apiVersion2019-12-01.
  • Nella sezione delle proprietà del gruppo di contenitori del modello di distribuzione aggiungere un encryptionPropertiesoggetto , che contiene i valori seguenti:
    • vaultBaseUrl: il 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. A tale scopo, fare clic sulla chiave stessa (in "Chiavi" nella sezione Impostazioni della risorsa dell'insieme di credenziali delle chiavi)
  • Nelle proprietà del gruppo di contenitori aggiungere una sku proprietà con valore Standard. La sku proprietà è necessaria nella versione API 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 il file modello è stato creato e modificato sul desktop, è possibile caricarlo nella directory Cloud Shell trascinando il file nel 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 verranno crittografati con la chiave specificata.

Crittografare i dati con una chiave gestita dal cliente in una rete protetta da Azure Key Vault 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 aggiungeranno limitazioni di rete e si abilitano i servizi attendibili.

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

  • Name: è necessario un nome univoco.
  • Sottoscrizione Scegliere una sottoscrizione.
  • In Gruppo di risorse scegliere un gruppo di risorse esistente o crearne uno nuovo e immettere un nome del gruppo di risorse.
  • Scegliere un percorso nel menu a discesa Percorso.
  • È possibile lasciare le altre opzioni alle impostazioni predefinite o scegliere in base a requisiti aggiuntivi.

Importante

Quando si usano chiavi gestite dal cliente per crittografare un modello di distribuzione ACI, è consigliabile impostare le due proprietà seguenti nell'insieme di credenziali delle chiavi, Eliminazione temporanea e Eliminazione temporanea. Queste proprietà non sono abilitate per impostazione predefinita, ma possono essere abilitate usando 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 in portale di Azure. Nel menu di spostamento a sinistra del pannello delle risorse fare clic su Chiavi in Impostazioni. Nella vista per "Chiavi" fare clic su "Genera/Importa" per generare una nuova chiave. Usare qualsiasi nome univoco per questa chiave e qualsiasi altra preferenza in base ai requisiti. Assicurarsi di acquisire il nome della chiave e la versione 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 o usare 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 la registrazione 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 il Key Vault di Azure 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 api 2022-09-01 è disponibile solo tramite ARM o REST. Se si verificano problemi con questo problema, contattare il supporto tecnico di Azure. Dopo aver configurato la chiave dell'insieme di credenziali delle chiavi e i criteri di accesso, aggiungere le proprietà seguenti al modello di distribuzione ACI. Altre informazioni sulla distribuzione delle risorse ACI con un modello nell'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 encryptionPropertiesoggetto , che contiene i valori seguenti:
    • vaultBaseUrl: nome DNS dell'insieme di credenziali delle chiavi. Questa operazione è disponibile nel pannello 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 operazione può essere trovata facendo clic sulla chiave stessa (in "Chiavi" nella sezione Impostazioni della risorsa dell'insieme di credenziali delle chiavi)
    • identity: si tratta dell'URI della risorsa dell'istanza di Identità gestita creata in precedenza
  • Nelle proprietà del gruppo di contenitori aggiungere una sku proprietà con valore Standard. La proprietà è necessaria nell'API sku versione 2022-09-01.
  • In risorse aggiungere l'oggetto necessario per usare l'identità identity gestita con ACI, che contiene i valori seguenti:
    • type: tipo dell'identità utilizzata (assegnata dall'utente o assegnata dal sistema). Questo caso verrà impostato su "UserAssigned"
    • userAssignedIdentities: l'URI della risorsa della stessa identità assegnata dall'utente utilizzata sopra 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 di modello sul desktop, è possibile caricarlo nella directory Cloud Shell trascinando il file in esso.

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 verranno crittografati con la chiave specificata.