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