Criptografar discos do sistema operacional com uma chave gerenciada pelo cliente no Red Hat OpenShift do Azure

Por defeito, o Microsoft Azure utiliza chaves geradas automaticamente para encriptar os discos do sistema operativo das máquinas virtuais (VMs) num cluster Azure Red Hat OpenShift. Para maior segurança, pode encriptar os discos do sistema operativo usando chaves autogeridas quando implementa um cluster. Esta funcionalidade dá-lhe mais controlo ao encriptar dados confidenciais com chaves geridas pelo cliente.

Clusters com chaves geridas pelo cliente têm uma classe de armazenamento padrão ativada com as suas chaves. Portanto, estas chaves encriptam tanto os discos do sistema operativo como os discos de dados. Azure Key Vault armazena as chaves geridas pelo cliente. Para mais informações sobre a utilização do Key Vault para criar e manter chaves, consulte conceitos básicos do Azure Key Vault.

Com a encriptação baseada no anfitrião, os dados armazenados no anfitrião das máquinas virtuais de nó do Azure Red Hat OpenShift são encriptados em repouso. Estes dados são transmitidos encriptados para o Armazenamento do Azure. A encriptação baseada em host significa que os discos temporários são encriptados em repouso através de chaves geridas pela plataforma.

A cache do sistema operativo e dos discos de dados é encriptada em repouso com chaves geridas pela plataforma ou chaves geridas pelo cliente. O tipo de chaves depende do tipo de encriptação que defines nesses discos. Por defeito, quando usa o Azure Red Hat OpenShift, o sistema operativo e os discos de dados são encriptados em repouso com chaves geridas pela plataforma. Esta configuração predefinida significa que as caches destes discos também ficam, por predefinição, encriptadas em repouso com chaves geridas pela plataforma.

Pode especificar as suas próprias chaves geridas seguindo os passos de encriptação na secção seguinte. As chaves que especifica neste passo também encriptam a cache destes discos.

Limitação

Os clientes devem manter o cofre de chaves e a encriptação do disco configurados no Azure. A falha em manter as chaves resulta em clusters Azure Red Hat OpenShift avariados. As VMs deixam de funcionar e, como resultado, todo o cluster Azure Red Hat OpenShift deixa de funcionar.

A equipa de engenharia do Azure Red Hat OpenShift não consegue aceder às chaves. Portanto, eles não podem fazer backup, replicar ou recuperar as chaves.

Para detalhes sobre a utilização de conjuntos de encriptação de disco para gerir as suas chaves de encriptação, veja Encriptação do lado do servidor do Armazenamento de Discos do Azure.

Pré-requisitos

  • Verifique suas permissões. Deve ter permissões para criar um cluster Azure Red Hat OpenShift, um cofre de chaves e um conjunto de encriptação de disco.

  • Confirma que tens o papel de Key Vault Crypto Officer. Esta função tem permissão para criar uma chave.

  • Se você tiver várias assinaturas do Azure, registre os provedores de recursos. Para obter detalhes de registro, consulte Registrar os provedores de recursos.

  • Confirme que tem a EncryptionAtHost funcionalidade ativada na sua subscrição. Você pode habilitá-lo executando:

    az feature register --namespace Microsoft.Compute --name EncryptionAtHost
    

    Você pode verificar o status atual do recurso executando:

    az feature show --namespace Microsoft.Compute --name EncryptionAtHost
    

Crie uma instância do Key Vault

Tens de usar uma instância do Key Vault para guardar as tuas chaves. Crie um novo cofre de chaves com proteção contra purgas ativada. Depois, cria uma nova chave dentro do cofre de chaves para guardar a tua própria chave personalizada.

  1. Definir variáveis do ambiente:

    export KEYVAULT_NAME=aro-enckv
    export KEYVAULT_KEY_NAME=aro-key
    export DISK_ENCRYPTION_SET_NAME=aro-des
    export LOCATION=<location-name>
    export RESOURCEGROUP=<resource-group-name>
    
  2. Crie um cofre de chaves:

    az keyvault create \
        --name $KEYVAULT_NAME \
        --resource-group $RESOURCEGROUP \
        --location $LOCATION \
        --enable-purge-protection true
    

    Observação

    Tens de ativar a proteção contra purgas. Consulte Configurar o seu Azure Key Vault.

    Opcional: Como a proteção contra purga está ativada, não pode reutilizar imediatamente o nome do cofre de chaves após a eliminação. Ao adicionar a --retention-days <NUMBER_OF_DAYS> especificação, podes controlar quanto tempo o cofre fica mantido num estado de "soft delete". O valor padrão é de 90 dias, mas definir um valor mais baixo (mínimo de 7 dias) significa que podes recuperar o nome mais rapidamente.

  3. Crie uma chave no cofre de chaves:

    az keyvault key create \
        --vault-name $KEYVAULT_NAME \
        --name $KEYVAULT_KEY_NAME \
        --protection software
    
  4. Defina as variáveis de ID do recurso do Key Vault e do URL da chave:

    KEYVAULT_ID=$(az keyvault show --name $KEYVAULT_NAME --query "[id]" -o tsv)
    
    KEYVAULT_KEY_URL=$(az keyvault key show --vault-name $KEYVAULT_NAME --name $KEYVAULT_KEY_NAME --query "[key.kid]" -o tsv)
    

Criar um conjunto de criptografia de disco

Use o conjunto de encriptação de disco Azure como ponto de referência para discos em clusters Azure Red Hat OpenShift. Está associado ao cofre de chaves que criou no passo anterior e obtém as chaves geridas pelo cliente a partir dessa localização.

  1. Crie o conjunto de encriptação do disco:

    az disk-encryption-set create \
        --name $DISK_ENCRYPTION_SET_NAME \
        --location $LOCATION \
        --resource-group $RESOURCEGROUP \
        --source-vault $KEYVAULT_ID \
        --key-url $KEYVAULT_KEY_URL
    
  2. Especifique o ID do recurso e as variáveis de identidade do conjunto de encriptação do disco:

    DES_ID=$(az disk-encryption-set show --name $DISK_ENCRYPTION_SET_NAME --resource-group $RESOURCEGROUP --query 'id' -o tsv)
    
    DES_IDENTITY=$(az disk-encryption-set show --name $DISK_ENCRYPTION_SET_NAME --resource-group $RESOURCEGROUP --query "[identity.principalId]" -o tsv)
    

Conceda permissões ao conjunto de encriptação de disco para aceder ao cofre de chaves

Queres que a identidade gerida da encriptação do disco seja definida para usar a chave de encriptação. Atribuir um papel incorporado que forneça as permissões de chave necessárias, como Key Vault Crypto Service Encryption User ou Key Vault Crypto User. Em alternativa, usar um papel personalizado, desde que inclua as permissões necessárias (wrapkey, unwrapkey, e get) para realizar operações de chave exigidas pelos conjuntos de encriptação de disco.

az role assignment create \
    --assignee $DES_IDENTITY \
    --role "Key Vault Crypto Service Encryption User" \
    --scope $KEYVAULT_ID

Criar um cluster do Azure Red Hat OpenShift

Quando cria um cluster, pode ativar chaves geridas pelo cliente especificando o conjunto de encriptação do disco. Use o --disk-encryption-set parâmetro. Por exemplo, --disk-encryption-set $DES_ID.

Para criar um cluster com um principal de serviço, siga as instruções em Criar um cluster Azure Red Hat OpenShift.

Aqui está um exemplo de criação de um cluster com o --disk-encryption-set parâmetro:

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master-subnet \
    --worker-subnet worker-subnet \
    --disk-encryption-set $DES_ID

Observação

Só pode ativar chaves geridas pelo cliente nos clusters existentes para os nós de trabalho, não para os nós mestres. É possível conseguir esta configuração. Para mais informações, consulte a documentação Red Hat, incluindo Ativar chaves de encriptação geridas pelo cliente para um conjunto de máquinas e Modificar um conjunto de máquinas de computação.

Para criar um cluster Azure Red Hat OpenShift com identidades geridas, antes de o criar, deve conceder a identidade machine-api e a identidade disk-csi-driver. Também deve conceder ao Azure Red Hat OpenShift permissões de principal Microsoft.Compute/diskEncryptionSets/read de serviço de primeira parte para o conjunto de encriptação de disco.

Exemplos de atribuições de papéis para a machine-api identidade, a disk-csi-driver identidade e o principal de serviço de primeira parte do ARO:

az role assignment create \
  --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name disk-csi-driver --query principalId -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID"

az role assignment create \
  --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID

az role assignment create \
  --assignee-object-id "$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID

Depois de criar o cluster do Azure Red Hat OpenShift, todas as VMs são criptografadas com as chaves de criptografia gerenciadas pelo cliente.

Para verificar se você configurou as chaves corretamente, execute os seguintes comandos:

  1. Obtenha o nome do grupo de recursos do cluster onde estão localizadas as VMs, discos e outras infraestruturas do cluster:

    CLUSTERRESOURCEGROUP=$(az aro show --resource-group $RESOURCEGROUP --name $CLUSTER --query 'clusterProfile.resourceGroupId' -o tsv | cut -d '/' -f 5)
    
  2. Verifique se os discos têm o conjunto correto de encriptação do disco acoplado:

    az disk list --resource-group $CLUSTERRESOURCEGROUP --query '[].encryption'
    

O campo diskEncryptionSetId na saída deve apontar para o conjunto de encriptação do disco que especificaste ao criar o cluster Azure Red Hat OpenShift.

Adicionar suporte managed HSM (mHSM) para chaves geridas pelo cliente e aplicação do Azure Policy

Também pode adicionar suporte a HSM gerido (mHSM) para chaves geridas pelo cliente, exigindo ou negando certos atributos de encriptação. Este suporte requer alterações na API e no Azure Policy.

Siga estes passos para criar um cluster Azure Red Hat OpenShift com mHSM e chaves geridas pelo cliente:

  1. Provisione e ative um HSM gerido usando o CLI do Azure.

  2. Exporte variáveis do ambiente do passo anterior:

    export HSM_NAME=<hsm-name>
    export RESOURCE_GROUP=<resource-group>
    
  3. Ative a proteção contra purgas e a gestão de chaves através do Azure Resource Manager:

    az keyvault update-hsm \
      --hsm-name $HSM_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-purge-protection true
    
    az keyvault setting update \
      --hsm-name $HSM_NAME \
      --name AllowKeyManagementOperationsThroughARM \
      --value true 
    
  4. Complete os passos restantes para ativar o mHSM: Ative o seu HSM gerido.

  5. Atribui a ti próprio a Managed HSM Crypto User função para poder criar chaves no mHSM.

    oid=$(az ad signed-in-user show --query id -o tsv)
    az keyvault role assignment create \        
      --hsm-name $HSM_NAME \ 
      --role "Managed HSM Crypto User" \ 
      --assignee $oid \ 
      --scope /keys 
    
  6. Crie uma chave mHSM.

  7. Crie uma identidade gerida e conceda-lhe o Managed HSM Crypto Service Encryption User papel sobre o mHSM.

    export UA_IDENTITY=<new-ua-identity>
    
    HSM_ID="https://${HSM_NAME}.managedhsm.azure.net"
    
    az identity create \
      --resource-group $RESOURCE_GROUP \
      --name $UA_IDENTITY
    
    IDENTITY_OBJECT_ID=$(az identity show \ 
      --resource-group $RESOURCE_GROUP \ 
      --name $UA_IDENTITY \ 
      --query principalId -o tsv) 
    
    az keyvault role assignment create \ 
      --id "$HSM_ID" \ 
      --role "Managed HSM Crypto Service Encryption User" \ 
      --assignee-object-id "$IDENTITY_OBJECT_ID" \ 
      --scope "/keys/byok-key"
    
  8. Crie um conjunto de encriptação de disco, tendo em conta:

    1. Defina o tipo de encriptação para Encryption at-rest with a customer-managed key.

    2. Utilize a identidade atribuída ao utilizador que criou no passo anterior.

    3. Complete a atribuição de funções antes de criar o conjunto de encriptação do disco.

  9. Exporte variáveis do ambiente do passo anterior:

    export LOCATION=<yourLocation>
    export CLUSTER=<yourNewClusterName> 
    export VIRTUAL_NETWORK=<yourVirtualNetwork>
    export KEYVAULT_NAME=<yourKeyvaultName>
    export KEYVAULT_KEY_NAME=byok-key 
    export DISK_ENCRYPTION_SET_NAME=<yourDiskEncryptionSetName>
    
  10. Crie um cluster com o seu novo conjunto de encriptação de disco:

    DES_ID=$(az disk-encryption-set show -n $DISK_ENCRYPTION_SET_NAME -g $RESOURCE_GROUP --query 'id' -o tsv) 
    
    az aro create --resource-group $RESOURCE_GROUP \ 
      --name $CLUSTER  \ 
      --vnet $VIRTUAL_NETWORK  \ 
      --master-subnet master-subnet \ 
      --worker-subnet worker-subnet \ 
      --disk-encryption-set $DES_ID 
    
  11. Depois de o cluster aparecer, confirme a encriptação:

    az disk list -g $VIRTUAL_NETWORK --query "[].{DiskName:name, VM:managedBy, EncryptionType:encryption.type, DiskEncryptionSet:encryption.diskEncryptionSetId}" -o table 
    

    Para verificar a encriptação, procure EncryptionAtRestWithCustomerKey por baixo da EncryptionType coluna.