31 julio 2017

Oracle Database 12c R1: TDE en Pluggable Databases (PDBs)

La base de datos Oracle 12c introdujo una nueva forma de administrar almacenes de claves claves cifradas y datos a securizar mediante el comando:
  • ADMINISTER KEY MANAGEMENT. 

Esto reemplaza los comandos:
  • ALTER SYSTEM SET ENCRYPTION KEY
  • ALTER SYSTEM SET ENCRYPTION WALLET 

para la administración de claves y wallets de versione anteriores La terminología de la documentación mezcla libremente los términos wallet y keystore, pero la intención parece ser pasar al término keystore, de acuerdo con la terminología de Java.

La arquitectura de múltiples terminales complica un poco la gestión de claves, ya que el contenedor raíz necesita un almacén de claves abierto con una clave de cifrado principal activa. El almacén de claves CDBs se utiliza para almacenar claves de cifrado para todos los PDB asociados, pero cada uno necesita su propia clave de cifrado principal. La clave de cifrado maestro para el PDB se debe exportar antes de una operación de desenchufado, por lo que se puede importar después de una operación de complemento posterior.

Aquí vamos a describir las operaciones de administración de claves básicas que se relacionan con Transparent Data Encryption (TDE). Algunas de las funcionalidades del keystore que vamos a ver en el presente artículo son:
  • Localización del Almacén de claves
  • Como crear un Almacén de claves
  • Usar el Keystore para  implementar la opción TDE
  • Usar PDBs Con la opción TDE
  • Auto-Login en Almacenes de claves
Localización del Almacén de claves
Se debe crear un almacén de claves para mantener la clave de cifrado. El orden de búsqueda para encontrar el almacén de claves es el siguiente.
  • Si está presente, la ubicación especificada por el parámetro ENCRYPTION_WALLET_LOCATION en el archivo "sqlnet.ora".
  • Si está presente, la ubicación especificada por el parámetro WALLET_LOCATION en el archivo "sqlnet.ora".
  • La ubicación predeterminada para el almacén de claves. Si se establece $ ORACLE_BASE, esto es "$ ORACLE_BASE / admin / DB_UNIQUE_NAME / wallet", de lo contrario es "$ ORACLE_HOME / admin / DB_UNIQUE_NAME / wallet", donde DB_UNIQUE_NAME proviene del archivo de parámetros de inicialización.
Los almacenes de claves no se deben compartir entre los CDB, por lo que si se ejecutan varios CDB desde el mismo ORACLE_HOME, debe realizar una de las siguientes acciones para mantenerlos separados.
  • Utilice la ubicación predeterminada keystore, por lo que cada base de datos CDB tiene su propia almacén de claves.
  • Especifique la ubicación mediante el método $ ORACLE_SID

ENCRYPTION_WALLET_LOCATION =
  (SOURCE =(METHOD = FILE)(METHOD_DATA =
    (DIRECTORY = /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore/)
  • Tenga un "sqlnet.ora" por separado para cada base de datos, asegurándose de que la variable TNS_ADMIN está establecida correctamente.

Independientemente de dónde coloque el almacén de claves, asegúrese de no perderlo. Oracle 12c es extremadamente sensible a la pérdida del keystore. Si lo pierdes o cometes un error tendrás que tener que recrear la instancia limpia una y otra vez.

Crear un Almacén de claves
Debemos de editar el fichero sqlnet.ora, añadiendo la siguiente entrada al fichero:

ENCRYPTION_WALLET_LOCATION =
  (SOURCE =(METHOD = FILE)(METHOD_DATA =
    (DIRECTORY = /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore/)
Crea el directorio para mantener el almacén de claves.

mkdir -p /u01/app/oracle/admin/$ORACLE_SID/encryption_keystore


Conecta al contenedor raíz y crea el almacén de claves


CONN / AS SYSDBA

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/cdb1/encryption_keystore/' IDENTIFIED BY myPassword;

HOST ls /u01/app/oracle/admin/cdb1/encryption_keystore/
ewallet.p12

SQL>
Puedes abrir y cerrar el almacén de claves desde el contenedor raiz usando los siguientes comandos. 

Para abrir:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword CONTAINER=ALL;

Para cerrar:
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY myPassword CONTAINER=ALL;


Es necesario crear y activar una clave maestra en el contenedor de raíz y una en cada una de las bases de datos conectables. Utilizar la cláusula CONTAINER = ALL lo hace en un solo paso. Si se omite la cláusula CONTAINER = ALL, sólo se realizará en el contenedor actual y se deberá volver a realizar para cada PDB individualmente. La información sobre la clave maestra se muestra usando la vista V $ ENCRYPTION_KEYS.

ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY myPassword WITH BACKUP CONTAINER=ALL;

SET LINESIZE 100
SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- ------------------------------------------------------------------------------
         0 AdaYAOior0/3v0AoZDBV8hoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
         0 AYmKkQxl+U+Xv3UHVMgSJC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

SQL>

La información sobre el almacén de claves se muestra usando la vista V $ ENCRYPTION_WALLET.

SET LINESIZE 200
COLUMN wrl_parameter FORMAT A50
SELECT * FROM v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                                      STATUS                         WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID
-------------------- -------------------------------------------------- ------------------------------ -------------------- --------- --------- ----------
FILE                 /u01/app/oracle/admin/cdb1/encryption_keystore/    OPEN                           PASSWORD             SINGLE    NO                 0

SQL>

Conectar al PDB. Si no creó la clave en el paso anterior, cree una nueva clave maestra para el PDB.

CONN sys@pdb1 AS SYSDBA



SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- ------------------------------------------------------------------------------
         0 DSrc9RAE//v/jcxEDSGIEEEEEEEEEEEEEEEEEEEEEEEEEEE

SQL>

Usar el Almacén de claves con la opción TDE


Ahora debe ser capaz de crear una tabla con una columna cifrada en el PDB.

CONN test/test@pdb1

-- Encrypted column
CREATE TABLE tde_test (
  id    NUMBER(10),
  data  VARCHAR2(50) ENCRYPT
);

INSERT INTO tde_test VALUES (1, 'This is a secret!');
COMMIT;
También podemos crear tablespaces cifrados

CONN sys@pdb1 AS SYSDBA

CREATE TABLESPACE encrypted_ts
DATAFILE SIZE 128K
AUTOEXTEND ON NEXT 64K
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);

ALTER USER test QUOTA UNLIMITED ON encrypted_ts;

CONN test/test@pdb1

CREATE TABLE tde_ts_test (
  id    NUMBER(10),
  data  VARCHAR2(50)
) TABLESPACE encrypted_ts;

INSERT INTO tde_ts_test VALUES (1, 'This is also a secret!');
COMMIT;
Si se reinicia el PDB, el almacén de claves debe abrirse en el PDB antes de que se pueda acceder a los datos.

CONN sys@pdb1 AS SYSDBA

SHUTDOWN IMMEDIATE;
STARTUP;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword;

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1 This is a secret!

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 This is also a secret!

SQL>

Si se reinicia el CDB, el almacén de claves debe estar abierto tanto en el CDB como en los PDB.

CONN / AS SYSDBA

SHUTDOWN IMMEDIATE;
STARTUP;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY myPassword CONTAINER=ALL;

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1 This is a secret!

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 This is also a secret!

SQL>

Auto-Login en Almacenes de claves

La creación de un almacén de claves de inicio automático significa que ya no es necesario abrir explícitamente el almacén de claves después de reiniciarlo. La primera referencia a una clave hace que el almacén de claves se abra automáticamente, como se muestra a continuación.

CONN / AS SYSDBA
ADMINISTER KEY MANAGEMENT CREATE LOCAL AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/admin/cdb1/encryption_keystore/' IDENTIFIED BY myPassword;

SHUTDOWN IMMEDIATE;
STARTUP

CONN test/test@pdb1

SELECT * FROM tde_test;

        ID DATA
---------- --------------------------------------------------
         1  Esto es un texto secreto

SQL>

SELECT * FROM tde_ts_test;

        ID DATA
---------- --------------------------------------------------
         1 Esto es otro texto secreto

SQL>


No hay comentarios:

Publicar un comentario

Por favor deja tu comentario, es valioso.