Create and Manage Encrypted Tablespaces

1. Documentación en Tahiti -> Masters Book List -> 2 Day + Security Guide -> 6 Securing Data

Documentación en Tahiti -> Masters Book List -> Advanced Security Administrator’s Guide -> 3 Securing Stored Data Using Transparent Data Encryption

2. La encriptación de un tablespace se realiza en base a una clave de encriptación que se guarda en el diccionario de datos (encription key), y dicha clave también se encripta en base a la clave de encriptación maestra (master encription key) que se guarda en un fichero del sistema operativo. Vamos a ver todo el proceso para poder crear un tablespace encriptado.

3. Este es el procedimiento general para crear un tablespace encriptado. Lo primero es crear el wallet (fichero) donde se aloja la clave de encriptación maestra.

# Creamos la ruta donde almaceramos el wallet
mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1/wallets

# Editamos el fichero sqlnet.ora
vi $ORACLE_HOME/network/admin/sqlnet.ora

# Añadimos las siguientes lineas al final del fichero
ENCRYPTION_WALLET_LOCATION=
 (SOURCE=
  (METHOD=file)
   (METHOD_DATA=
    (DIRECTORY=/u01/app/oracle/product/11.2.0/dbhome_1/wallets)))
-- La BD tiene que tener el parámetro COMPATIBLE >= 11.1
-- Validamos que cumplimos este requisito
SHOW PARAMETER COMPATIBLE

-- Creamos el Wallet
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "oracle_4U";

-- Reiniciamos la BD para poder abrir el WALLET
-- Siempre que reiniciemos la instancia, debemos abrir de nuevo el wallet
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "oracle_4U";
ALTER DATABASE OPEN;

-- Seleccionamos encriptación 3DES168
-- Podemos escoger entre los siguientes métodos de encriptación:
--   · AES192
--   · 3DES168
--   · AES128
--   · AES256
CREATE TABLESPACE TBSTEST01 DATAFILE '/u01/app/oracle/oradata/OCM/tbstest0101.dbf'
  SIZE 100M ENCRYPTION USING '3DES168' DEFAULT STORAGE(ENCRYPT);

-- Si no se especifica el tipo de encriptación, por defecto es AES128
CREATE TABLESPACE TBSTEST02 DATAFILE '/u01/app/oracle/oradata/OCM/tbstest0201.dbf'
  SIZE 100M ENCRYPTION DEFAULT STORAGE(ENCRYPT);

Podemos consultar varias vistas para realizar ciertas comprobaciones.

-- Consultamos el estado del WALLET
SELECT * FROM V$ENCRYPTION_WALLET;

-- Comprobar si un TABLESPACE está encriptado o no
SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES;

-- Consultamos la configuración de los tablespaces encriptados
SELECT * FROM V$ENCRYPTED_TABLESPACES;

-- Borramos los tablespaces que hemos creado
DROP TABLESPACE TBSTEST01 INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE TBSTEST02 INCLUDING CONTENTS AND DATAFILES;

-- Cerramos el WALLET
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "oracle_4U";

4. Un «problema» o inconveniente que hemos visto durante el ejercicio anterior es que cada vez que reiniciamos tenemos que abrir el WALLET de nuevo. Pero podemos crear un AUTO LOGIN WALLET para solucionarlo. Tenemos dos formas de hacerlo.

# El primer método es utilizar la utilizar "orakpi"
# Creamos el AUTO LOGIN WALLET asociado al wallet PKCS#12 que ya tenemos
orapki wallet create -wallet /u01/app/oracle/product/11.2.0/dbhome_1/wallets -auto_login -pwd oracle_4U

# También podemos obtener informacióm del certificado que hemos creado
orapki wallet display -wallet /u01/app/oracle/product/11.2.0/dbhome_1/wallets

# La segunda forma de configurar el AUTO LOGIN es con la utilidad gráfica "owm"
# El asistente "owm" nos permite además, configurar el WALLET y otras tareas
# Ejecutamos desde un terminal gráfico
owm

Click «Wallet» ->
-> Click «Open» ->
-> Directory = «/u01/app/oracle/product/11.2.0/dbhome_1/wallets» ->
-> Password = «oracle_4U» (si os falla la clave tenéis que revisar la conf. del teclado) ->
-> Click «Wallet» ->
-> Seleccionamos «Auto Login» ->
-> Click «Wallet» ->
-> Click «Save» ->
-> Cerramos la ventana

Si probamos a reiniciar la instancia, y comprobamos la vista V$ENCRYPTION_WALLET, debemos observar que el campo STATUS = OPEN.

5. Es importante comentar que cuando tenemos un RAC, todos los nodos deben acceder al WALLET. Por lo que tenemos dos vias para conseguir este propósito. Podemos tener una ubicación compartida entre todos los nodos, o podemos copiar el WALLET a la misma ubicación en cada nodo. A la hora de abrir el WALLET, sólo es necesario abrirlo en un nodo.