# Cifrado de la Base de Datos

## Prerrequisitos

El procedimiento descrito en este manual depende de los siguientes requisitos:

* [Procedimiento de instalación de Apache Ranger™](https://docs.griaule.com/gbs/es/herramientas-auxiliares/apacheranger)
* [Procedimiento de instalación de Luna Cloud HSM (Opcional)](https://docs.griaule.com/gbs/es/herramientas-auxiliares/lunacloudhsm)

## Crear clave para cifrado

### Permiso de usuario

Para cifrar HBase, es necesario agregar permisos para el usuario que administra el HDFS.

En el navegador, acceda a Ranger en `http://<host>:6080`.

* Usuario: `keyadmin`
* Contraseña: `<contraseña definida en el procedimiento de instalación de Ranger Admin>`

{% hint style="info" %}
En este ejemplo, usaremos el usuario `hadoop`
{% endhint %}

Al acceder al Panel de Ranger KMS, haga clic en el repositorio `kmsdev` del KMS, que redirigirá a la página de *policies* de *kmsdev*.

Haga clic para editar la `police 1`. Al ser redirigido, haga clic en el ícono + dentro de Allow Conditions y complete de la siguiente forma:

* Select Role: *Sin cambios*
* Select Group: *Sin cambios*
* Select User: `hadoop`
* Permissions: `Decrypt EEK`, `Generate EEK`, `Get`, `Get Keys`, `Get Metadata`
* Delegate Admin: *Checked*

Para probar el acceso al servidor, ejecute los siguientes comandos para listar las claves y los metadatos de la clave, en caso de que exista una:

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

El objetivo de la prueba es garantizar que el acceso no será denegado, haya clave o no.

### Crear clave

Aún en el panel de Ranger KMS, haga clic en Encryption y, luego, en Key Manager.

En Select Service, seleccione el repositorio `kmsdev`.

Para crear una clave, haga clic en Add New Key y complete de la siguiente forma:

* Key Name: `hbase`
* Cipher: *No realizar cambios*
* Length: `256`
* Description: campo opcional
* Attributes: *No realizar cambios*

Al hacer clic en save, la clave será creada y podrá ser accesada por el servidor para encriptación. Para verificar, conéctese al servidor con el usuario que tiene permiso de `get key` y ejecute los siguientes comandos:

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

## Crear zona de cifrado

Para cifrar la base de datos de Hadoop, es necesario crear una zona de cifrado. De esta forma, todos los datos insertados en esta zona serán redirigidos por el HDFS al KMS para cifrado o descifrado, dependiendo de la petición enviada y de los permisos del usuario en el KMS.

Para crear una zona de cifrado, es necesario que la ruta esté vacía. Por lo tanto, es necesario renombrar la carpeta `data` de HBase y crear una carpeta con el mismo nombre.

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

Entonces ejecute el siguiente comando para definir la ruta `/apps/hbase/data` como una zona de cifrado:

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

La respuesta debe ser:

```
Added encryption zone /apps/hbase/data
```

Para verificar, ejecute el comando para listar las zonas:

```sh
hdfs crypto -listZones
```

Este comando debe devolver el siguiente mensaje:

```
/apps/hbase/data  hbase
```

Siendo `/apps/hbase/data` la zona de cifrado y `hbase` la clave.

Después de definir la zona de cifrado, copie todo el contenido de la carpeta `/apps/hbase/data-bkp` dentro de la zona de cifrado `/apps/hbase/data`.

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

Para verificar el funcionamiento del cifrado, inicie HBase y conéctese al HBase Shell, entonces ejecute los siguientes comandos de lectura de archivo:

Dentro de la zona de cifrado:

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

La respuesta debe ser:

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

Fuera de la zona de cifrado:

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

La respuesta debe ser:

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

Para obtener información sobre el cifrado del archivo, ejecute el siguiente comando:

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

La respuesta debe 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
}
```

## Procedimiento de cambio de clave

{% hint style="warning" %}
No es necesario detener los servicios para el cambio de clave y re-cifrado. Lea el procedimiento completo a continuación para más información.
{% endhint %}

### Procedimiento de Rollover de la clave

Para crear una clave, haga clic en Add New Key y complete de la siguiente forma:

Para cambiar la clave de cifrado, acceda al panel de Ranger KMS y haga clic en Encryption y, luego, en Key Manager.

En Select Service, seleccione el repositorio `kmsdev`.

En la clave utilizada para la zona de cifrado, en el lado derecho de la pantalla en Action, haga clic en el ícono descrito como Rollover.

Al hacer clic en Rollover, será necesario confirmar la operación en un pop-up.

Después de confirmar el *Rollover*, Hadoop continuará usando la clave anterior, pero la clave nueva también estará disponible en Ranger KMS. Por este motivo no es necesaria la detención de los servicios para este procedimiento.

Para verificar la disponibilidad de las claves y sus respectivas versiones, ejecute el siguiente comando:

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

La respuesta debe ser:

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

En esta respuesta, se observa que Hadoop está usando la clave `hbase@0`, sin embargo ya está disponible la clave `hbase@1` en el KMS.

### Procedimiento de re-cifrado

El procedimiento de re-cifrado puede realizarse durante el funcionamiento pleno del sistema por dos puntos:

#### El tipo de cifrado

Hadoop utiliza cifrado del tipo TDE (*transparent data encryption*). Este tipo de cifrado actúa en la base de datos solo a nivel de archivo, permitiendo que los datos estén disponibles para las aplicaciones sin la necesidad de cifrar o descifrar en cada operación.

#### Información de cifrado en el archivo

Cada archivo cifrado posee un encabezado o paquete con la información del cifrado, incluyendo la versión de la clave utilizada. Esta información se consulta directamente en cualquier procedimiento de cifrado.

{% hint style="info" %}
Para verificar la información de cifrado en el archivo, ejecute el siguiente comando:

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

La respuesta debe 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 re-cifrar la zona de cifrado después del *Rollover* de la clave, ejecute los siguientes comandos:

* Para listar las zonas de cifrado:

```sh
hdfs crypto -listZones
```

* Para re-cifrar la zona deseada con la nueva clave:

```sh
hdfs crypto -reencryptZone -start -path /apps/hbase/data/
```

La respuesta debe ser un mensaje confirmando la solicitud de re-cifrado:

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

Después de la solicitud, Hadoop iniciará el re-cifrado de los datos con la clave actualizada proporcionada por Ranger KMS.

Para comprobar el estado del re-cifrado, ejecute el siguiente comando:

```sh
hdfs crypto -listReencryptionStatus
```

La respuesta debe ser un informe con el estado de la operación:

```
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 si la información de cifrado fue actualizada en los archivos, ejecute nuevamente el comando `-getFileEncryptionInfo`:

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

Si el cambio de las claves se realizó con éxito, el campo `ezKeyVersionName` reflejará el nombre de la nueva versión:

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