# Criptografia da Base de Dados

## Pré-requisitos

O procedimento descrito neste manual depende dos seguintes requisitos:

* [Procedimento de instalação do Apache Ranger™](/ferramentas-auxiliares/apacheranger.md)
* [Procedimento de instalação do Luna Cloud HSM (Opcional)](/ferramentas-auxiliares/lunacloudhsm.md)

## Criar chave para criptografia

### 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`.

* Usuário: `keyadmin`
* Senha: `<senha definida no procedimento de instalação do Ranger Admin>`

{% hint style="info" %}
Neste exemplo, iremos usar o usuário `hadoop`
{% endhint %}

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:

```sh
hadoop key list
hadoop key list -metadata
```

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

### 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:

```sh
hadoop key list
hadoop key list -metadata
```

## 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.

```sh
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:

```sh
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:

```sh
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`.

```sh
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:

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

O retorno deve ser:

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

Fora da zona de criptografia:

```sh
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:

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

O retorno deve ser:

```properties
{
	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
}
```

## Procedimento de troca de chave

{% hint style="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.
{% endhint %}

### 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:

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

O retorno deve ser:

```json
[
	{
		"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.

### 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.

{% hint style="info" %}
Para verificar as informações de criptografia no arquivo, execute o seguinte comando:

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

O retorno deve ser:

```properties
{
	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
}
```

{% endhint %}

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

* Para listar as zonas de criptografia:

```sh
hdfs crypto -listZones
```

* Para reencriptar a zona desejada com a nova chave:

```sh
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:

```sh
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`:

```sh
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:

```properties
{
	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
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.griaule.com/configuracao-do-gbds/hbaseencrypt.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
