1. Pré-requisitos

O procedimento descrito neste manual depende dos seguintes requisitos:

2. Criar chave para criptografia

2.1. Permissão de usuário

Para criptografar o HBase, é necessário adicionar permissões para o usuário que administra o HDFS.

No navegador, acesse o Ranger em http://<host>:6080.

Note

Neste exemplo, iremos usar o usuário hadoop

Ao acessar o Painel do Ranger KMS, clique no repositório kmsdev do KMS, que irá redirecionar para a página de policies do kmsdev.

Clique para editar a police 1. Ao ser redirecionado, clique no ícone + dentro de Allow Conditions e preencha da seguinte forma:

  • Select Role: Sem alteração
  • Select Group: Sem alteração
  • Select User: hadoop
  • Permissions: Decrypt EEK, Generate EEK, Get, Get Keys, Get Metadata
  • Delegate Admin: Checked

Para testar acesso ao servidor, execute os seguintes comandos para listar as chaves e os metadados da chave, caso exista uma:

hadoop key list
hadoop key list -metadata

O objetivo do teste é garantir que o acesso não será negado, havendo chave ou não.

2.2. Criar chave

Ainda no painel do Ranger KMS, clique em Encryption e, então, em Key Manager.

Em Select Service, selecione o repositório kmsdev.

Para criar uma chave, clique em Add New Key e preencha da seguinte forma:

  • Key Name: hbase
  • Cipher: Não fazer alteração
  • Length: 256
  • Description: campo opcional
  • Attributes: Não fazer alteração

Ao clicar em save, a chave será criada e poderá ser acessada pelo servidor para encriptação. Para verificar, conecte no servidor com o usuário que tem permissão de get key e execute os comandos a seguir:

hadoop key list
hadoop key list -metadata

3. Criar zona de criptografia

Para encriptar a base de dados do Hadoop, é necessário criar uma zona de criptografia. Dessa forma, todos dados inseridos nesta zona serão redirecionados pelo HDFS para o KMS para encriptação ou decriptação, a depender da requisição enviada e das permissões do usuário no KMS.

Para criar uma zona de criptografia, é necessário que o caminho esteja vazio. Sendo assim, é necessário renomear a pasta data do HBase e criar a uma pasta com o mesmo nome.

hdfs dfs -mv /apps/hbase/data /apps/hbase/data-bkp
hdfs dfs -mkdir /apps/hbase/data /apps/hbase/data
hdfs dfs -ls /apps/hbase/

# Found 2 items
# drwxr-xr-x   - hadoop hadoop         0 2023-02-17 14:02 /apps/hbase/data
# drwxr-xr-x   - hadoop hadoop          0 2023-02-15 11:58 /apps/hbase/data-bkp

Então execute o seguinte comando para definir o caminho /apps/hbase/data como uma zona de criptografia:

hdfs crypto -createZone -keyName hbase -path /apps/hbase/data

O retorno deve ser:

Added encryption zone /apps/hbase/data

Para verificar, execute o comando para listar as zonas:

hdfs crypto -listZones

Este comando deve retornar a seguinte mensagem:

/apps/hbase/data  hbase

Sendo /apps/hbase/data a zona de criptografia e hbase a chave.

Após definir a zona de criptografia, copie todo o conteúdo da pasta /apps/hbase/data-bkp para dentro da zona de criptografia /apps/hbase/data.

hdfs dfs -cp /apps/hbase/data-bkp/* /apps/hbase/data/

Para verificar o funcionamento da encriptação, inicie o HBase e conecte-se ao HBase Shell, então execute os seguintes comandos de leitura de arquivo:

Dentro da zona de criptografia:

hdfs dfs -cat /apps/hbase/data/hbase.id

O retorno deve ser:

PBUF
$24b1ef30-14b6-46d0-b46b-f49c9c109cb1

Fora da zona de criptografia:

hdfs dfs -cat /.reserved/raw/apps/hbase/data/hbase.id

O retorno deve ser:

▒w▒▒▒▒▒,U▒▒▒k▒y▒,*▒*|▒~▒/U▒U▒▒▒|#

Para obter informações sobre a criptografia do arquivo, execute o seguinte comando:

hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id

O retorno deve ser:

{
   cipherSuite: {
      name: AES/CTR/NoPadding,
      algorithmBlockSize: 16
   },
   cryptoProtocolVersion: CryptoProtocolVersion{
      description='Encryption zones', version=2, unknownValue=null
   },
   edek: 0b79b49c77335747824d78e97e5e0bf2a54f428ddc81faf6dc220c4ecea7c7de,
   iv: ee35b713df8994046758372cee3eeea0,
   keyName: hbase,
   ezKeyVersionName: hbase@0
}

4. Procedimento de troca de chave

Warning

Não é necessário interromper os serviços para a troca de chave e reencriptação. Leia o procedimento completo a seguir para mais informações.

4.1. Procedimento de Rollover da chave

Para criar uma chave, clique em Add New Key e preencha da seguinte forma:

Para trocar a chave de encriptação, acesse o painel do Ranger KMS e clique em Encryption e, então, em Key Manager.

Em Select Service, selecione o repositório kmsdev.

Na chave utilizada para a zona de criptografia, no lado direito da tela em Action, clique no ícone descrito como Rollover.

Ao clicar em Rollover, será necessário confirmar a operação em um pop-up.

Após confirmar o Rollover, o Hadoop continuará utilizando a chave anterior, mas a chave nova também estará disponível no Ranger KMS. Por esse motivo não é necessário a interrupção dos serviços para este procedimento.

Para verificar a disponibilidade das chaves e suas respectivas versões, execute o seguinte comando:

curl http://localhost:9292/kms/v1/key/hbase/_versions?user.name=hadoop

O retorno deve ser:

[ {
  "material" : "NIoXKS9lHMIPBUhIARV3V5TCzTj12IHEOjVwD00R8NM",
  "name" : "hbase",
  "versionName" : "hbase@0"
}, {
  "material" : "RjAvLWzEu7BuRvPpXs7K2Q8EqRTa_gJsDm-NF8D_HSc",
  "name" : "hbase",
  "versionName" : "hbase@1"
}
...

Neste retorno, nota-se que o Hadoop está utilizando a chave hbase@0, porém já está disponível a chave hbase@1 no KMS.

4.2. Procedimento de reencriptação

O procedimento de encriptação pode ser feito durante o funcionamento pleno do sistema por dois pontos:

  • O tipo da criptografia:

    O Hadoop utiliza criptografia do tipo TDE (transparent data encryption). Este tipo de criptografia atua no banco de dados apenas em nível de arquivo, permitindo que os dados estejam disponíveis para as aplicações sem a necessidade de encriptação ou decriptação a cada operação.


  • Informações de criptografia no arquivo:

    Cada arquivo encriptado possui um cabeçalho ou pacote com as informações da criptografia, incluindo a versão da chave utilizada. Estas informações são consultadas diretamente em qualquer procedimento de criptografia.

    Note

    Para verificar as informações de criptografia no arquivo, execute o seguinte comando:

    hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id
    

    O retorno deve ser:

    {
       cipherSuite: {
          name: AES/CTR/NoPadding,
          algorithmBlockSize: 16
       },
       cryptoProtocolVersion: CryptoProtocolVersion{
          description='Encryption zones', version=2, unknownValue=null
       },
       edek: 0b79b49c77335747824d78e97e5e0bf2a54f428ddc81faf6dc220c4ecea7c7de,
       iv: ee35b713df8994046758372cee3eeea0,
       keyName: hbase,
       ezKeyVersionName: hbase@0
    }
    

Para reencriptar a zona de criptografia após o Rollover da chave, execute os seguintes comandos:

  • Para listar as zonas de criptografia:
hdfs crypto -listZones
  • Para reencriptar a zona desejada com a nova chave:
hdfs crypto -reencryptZone -start -path /apps/hbase/data/

O retorno deve ser uma mensagem confirmando a solicitação de reencriptação:

re-encrypt command successfully submitted for zone: /apps/hbase/data/ action: START

Após a solicitação, o Hadoop irá iniciar a reencriptação dos dados com a chave atualizada fornecida pelo Ranger KMS.

Para checar o status da reencriptação, execute o seguinte comando:

hdfs crypto -listReencryptionStatus

O retorno deve ser um relatório com o status da operação:

Zone Name         Status     EZKey Version Name  Submission Time               Is Canceled?     Completion Time               Number of files re-encrypted  Number of failures  Last File Checkpointed
/apps/hbase/data  Completed  hbase@1             2023-02-17 15:43:15,429-0300  false            2023-02-17 15:43:15,623-0300  28                            0

Para verificar se as informações de criptografia foram atualizadas nos arquivos, execute novamente o comando -getFileEncryptionInfo:

hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id

Caso a troca das chaves tenha sido realizada com sucesso, o campo ezKeyVersionName irá refletir o nome da nova versão:

{
   cipherSuite: {
      name: AES/CTR/NoPadding,
      algorithmBlockSize: 16
   },
   cryptoProtocolVersion: CryptoProtocolVersionc{
      description='Encryption zones', version=2, unknownValue=null
   },
   edek: 995afbc575fa88ff0ef72a908e0caa8397c18b2df852cb86e35fcc4577ed257b,
   iv: ee35b713df8994046758372cee3eeea0,
   keyName: hbase,
   ezKeyVersionName: hbase@1
}