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

Por padrão, Microsoft Azure usa chaves geradas automaticamente para criptografar os discos do sistema operacional das VMs (máquinas virtuais) em um cluster Red Hat OpenShift no Azure. Para segurança extra, você pode criptografar os discos do sistema operacional usando chaves autogerenciadas ao implantar um cluster. Esse recurso oferece mais controle criptografando dados confidenciais com chaves gerenciadas pelo cliente.

Os clusters com chaves gerenciadas pelo cliente têm uma classe de armazenamento padrão habilitada com suas chaves. Portanto, essas chaves criptografam discos do sistema operacional e discos de dados. Azure Key Vault armazena as chaves gerenciadas pelo cliente. Para obter mais informações sobre como usar Key Vault para criar e manter chaves, consulte Azure Key Vault conceitos básicos.

Com a criptografia baseada em host, os dados armazenados no host da máquina virtual das VMs de nó do Red Hat OpenShift no Azure são criptografados em repouso. Esses dados fluem criptografados para Armazenamento do Azure. A criptografia baseada em host significa que os discos temporários são criptografados em repouso usando chaves gerenciadas pela plataforma.

O cache do SO e dos discos de dados é criptografado em repouso com chaves gerenciadas pela plataforma ou chaves gerenciadas pelo cliente. O tipo de chaves depende do tipo de criptografia definido nesses discos. Por padrão, quando você usa Red Hat OpenShift no Azure, os discos do sistema operacional e de dados são criptografados em repouso com chaves gerenciadas pela plataforma. Essa configuração padrão significa que os caches desses discos também são criptografados por padrão em repouso com chaves gerenciadas pela plataforma.

Você pode especificar suas próprias chaves gerenciadas seguindo as etapas de criptografia na próxima seção. As chaves especificadas nesta etapa também criptografam o cache desses discos.

Limitação

Os clientes devem manter o cofre de chaves e a criptografia de disco definidos em Azure. A falha na manutenção das chaves resulta em clusters Red Hat OpenShift no Azure quebrados. As VMs param de funcionar e, como resultado, todo o cluster Red Hat OpenShift no Azure para de funcionar.

A equipe de engenharia do Red Hat OpenShift no Azure não pode acessar as chaves. Portanto, eles não podem fazer backup, replicar ou recuperar as chaves.

Para obter detalhes sobre como usar conjuntos de criptografia de disco para gerenciar suas chaves de criptografia, consulte a criptografia do lado do servidor de Armazenamento em Disco do Azure.

Pré-requisitos

  • Verificar suas permissões. Você deve ter permissões para criar um cluster Red Hat OpenShift no Azure, um cofre de chaves e um conjunto de criptografia de disco.

  • Confirme se você tem a função Key Vault Crypto Officer. Essa função tem permissões 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 se você tem o EncryptionAtHost recurso habilitado em sua assinatura. 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
    

Criar uma instância de Key Vault

Você deve usar uma instância de Key Vault para armazenar suas chaves. Crie um novo cofre de chaves com proteção contra limpeza habilitada. Em seguida, crie uma nova chave no cofre de chaves para armazenar sua própria chave personalizada.

  1. Definir variáveis de 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

    Você deve habilitar a proteção contra exclusão. Consulte Configure seu Azure Key Vault.

    Opcional: como a proteção de limpeza está habilitada, você não pode reutilizar imediatamente o nome do cofre de chaves após a exclusão. Ao adicionar a especificação --retention-days <NUMBER_OF_DAYS>, você pode controlar por quanto tempo o cofre é mantido em um estado de "exclusão reversível". O padrão é 90 dias, mas defini-lo como um valor mais baixo (mínimo de 7 dias) significa que você pode 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 o ID do recurso do Key Vault e as variáveis de 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 criptografia de disco Azure como o ponto de referência para discos em clusters Red Hat OpenShift no Azure. Ele está conectado ao cofre de chaves que você criou na etapa anterior e extrai as chaves gerenciadas pelo cliente desse local.

  1. Crie o conjunto de criptografia de 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 a ID de recurso do conjunto de criptografia de disco e as variáveis de identidade:

    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 criptografia de disco para acessar o Key Vault

Você deseja que a identidade gerenciada do conjunto de criptografia de disco use a chave de criptografia. Atribua uma função interna que conceda as permissões de chave necessárias, como Key Vault Crypto Service Encryption User ou Key Vault Crypto User. Como alternativa, use uma função personalizada, desde que inclua as permissões necessárias (wrapkeye unwrapkeyget) para executar operações de chave exigidas pelos conjuntos de criptografia de disco.

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

Criar um cluster do Red Hat OpenShift no Azure

Ao criar um cluster, você pode habilitar chaves gerenciadas pelo cliente especificando o conjunto de criptografia de disco. Use o parâmetro --disk-encryption-set. Por exemplo, --disk-encryption-set $DES_ID.

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

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

Você pode habilitar chaves gerenciadas pelo cliente somente em clusters existentes para nós de trabalho, não para nós mestres. É possível obter essa configuração. Para obter mais informações, consulte a documentação do Red Hat, incluindo habilitar chaves de criptografia gerenciadas pelo cliente para um conjunto de computadores e modificar um conjunto de computadores de computação.

Para criar um cluster Red Hat OpenShift no Azure com identidades gerenciadas, antes de criar o cluster, você deve conceder a machine-api identidade e a disk-csi-driver identidade. Você também deve conceder à entidade de serviço primária do Red Hat OpenShift no Azure as permissões Microsoft.Compute/diskEncryptionSets/read para o conjunto de criptografia de disco.

Exemplos de atribuições de função para a identidade machine-api, a identidade disk-csi-driver e a entidade de serviço primária 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 Red Hat OpenShift no Azure, 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 em que as VMs, discos e outras infraestruturas do cluster estão localizadas:

    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 de criptografia de disco correto anexado:

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

O campo diskEncryptionSetId na saída deve apontar para o conjunto de criptografia de disco especificado durante a criação do cluster Red Hat OpenShift no Azure.

Adicionar suporte a HSM gerenciado (mHSM) para chaves gerenciadas pelo cliente e à aplicação da Azure Policy

Você também pode adicionar suporte de HSM gerenciado (mHSM) para chaves gerenciadas pelo cliente e exigir e negar determinados atributos de criptografia. Esse suporte requer alterações de API e Azure Policy.

Siga estas etapas para criar um cluster Red Hat OpenShift no Azure com mHSM e chaves gerenciadas pelo cliente:

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

  2. Exportar variáveis de ambiente da etapa anterior:

    export HSM_NAME=<hsm-name>
    export RESOURCE_GROUP=<resource-group>
    
  3. Habilite a proteção contra exclusão definitiva e o gerenciamento de chaves por meio 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. Conclua as etapas restantes para ativar o mHSM: Ative o HSM gerenciado.

  5. Conceda a si mesmo a Managed HSM Crypto User função para que você possa 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 gerenciada e conceda a ela a Managed HSM Crypto Service Encryption User função por meio do 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 criptografia de disco, levando em consideração:

    1. Definir o tipo de criptografia como Encryption at-rest with a customer-managed key.

    2. Use a identidade atribuída pelo usuário que você criou na etapa anterior.

    3. Conclua a atribuição de função antes de criar o conjunto de criptografia de disco.

  9. Exportar variáveis de ambiente da etapa 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 seu novo conjunto de criptografia 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 que o cluster estiver em funcionamento, confirme a criptografia:

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

    Para verificar a criptografia, procure EncryptionAtRestWithCustomerKey na coluna EncryptionType.