Oracle Seguridad en Profundidad: Advanced Security Option
Por Ana Gamba Olmos
Publicado en Abril 2015
Objetivo
- Implementar TDE (Transparent Data Encription) para una tabla
- Generar un backup encriptado
- Recomendar manejo de wallet para la restauración de backups en operadores biométricos
Actividades
- Modificación sqlnet.ora
- Creación de Wallet
- Creación de Tablespace encriptado
- Crear tabla encriptada
- Generación de export
- Gestión del wallet
Software Requerido
Para configurar Advanced Security Option, no se requiere instalar ningún software adicional, ya que esta opción queda instalada, y solo debe ser configurada para que sea utilizada. Una vez utilizada se verifica según sea el caso, encriptación por red, encriptación de tablespaces o encriptación de tablas, generación de backups encriptados.
Modificación de SQLNET.ORA
Modificar el archivo sqlnet.ora, adicionando la siguiente llave donde se debe especificar la ubicación del wallet, llave maestra de encriptación de sus bases de datos.
Se recomienda ubicar el wallet en un directorio fuera del $ORACLE_BASE.
Si este archivo ya existe asegurarse de sacar una copia primero.
ENCRYPTION_WALLET_LOCATION = (SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/ASO/$ORACLE_UNQNAME)))
Creacion del Wallet
Método 1: Crear el directorio donde se va crear el wallet.
mkdir /u01/ASO/
Establecer las variables de ambiente, es importante especificar estas dos variables cuando se sube una base de datos.
export ORACLE_SID=securedb
export ORACLE_UNQNAME=securedb
Conectarse a la base de datos.
sqlplus / as sysdba
Crear y abrir el wallet:
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "seguridad123";
Revisar que el wallet ha sido creado
ls –lrt /u01/ASO
El wallet debe ser reabierto cada vez que se haga un reinicio de la base de datos y se puede cerrar para evitar el acceso a datos encriptados. Siempre se tienen que tener especificadas las variables de ambiente ORACLE_SID y ORACLE_UNQNAME.
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "seguridad123";
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
NOTA: Este método requiere que cada vez que se reinicie la base de datos se abra el wallet;
Para crear llave de inicio automático:
orapki wallet create -wallet /u01/ASO/securedb -auto_login_local
Escribir el password usado en la creación del wallet.
Verificar que el reinicio automático funciona. Recordar que se deben especificar las variables de ambiente ORACLE_SID y ORACLE_UNQNAME, bajar la base de datos, subirla y utilizar el query select * from v$encryption_wallet;.
Método 2: Crear el directorio donde se va crear el wallet.
mkdir /u01/ASO/securedb
Establecer las variables de ambiente
export ORACLE_SID=securedb
export ORACLE_UNQNAME=securedb
Crear wallet con orapki, utilizar una clave fuerte, si no se generará un error.
orapki wallet create -wallet wallet_location -pwd clave123
orapki wallet create -wallet /u01/ASO/$ORACLE_UNQNAME -auto_login_local -pwd seguridad123
En el directorio /u01/ASO/$ORACLE_UNQNAME quedan creados dos archivos, la llave y el archivo de auto login.
pwd
/u01/ASO/securerep
ls -lrt
total 8
-rw------- 1 oracle oracle 3512 Sep 16 09:48 ewallet.p12
-rw------- 1 oracle oracle 3589 Sep 16 09:51 cwallet.sso
El autologin solo ocurre en la maquina en la que se creó.
Creación Del Tablespace Encriptado
Para la creación del tablespace encriptado debe existir un wallet y estar abierto en el momento de la creación. En el momento de la creación se debe seleccionar el algoritmo de encriptación, entre las siguientes posibilidades:
CREATE BIGFILE TABLESPACE "TBSSEC" DATAFILE '/u01/app/oracle/oradata/orcl1/TBSSEC.dbf'
SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO DEFAULT STORAGE(ENCRYPT)
ENCRYPTION USING 'AES192';
ALTER USER HR QUOTA UNLIMITED ON TBSSEC;
Verificar que el tablespace está encriptado:
SELECT tablespace_name, encrypted FROM dba_tablespaces;
Tener en cuenta que el tamaño del tablespace debe ser lo suficientemente grande para contener la tabla.
Creacion De Tabla Encriptada
Dado que la encriptación se hace durante la escritura, se requiere mover la tabla. Una forma de hacerlo es por medio de la redefinición en línea. Se deben seguir las siguientes instrucciones:
- Revisar que la tabla pueda tener una definición en línea:
EXEC DBMS_REDEFINITION.can_redef_table('HR', 'EMPLOYEES');
- Verificar objetos dependientes e índices de la tabla:
set linesize 150
select name, type, referenced_name
from all_dependencies
where referenced_name like 'EMPLOYEES'
and referenced_type = 'TABLE'
and referenced_owner = 'HR';
NAME TYPE REFERENCED_NAME
------------------------------ ------------------ ---------------------
SECURE_EMPLOYEES TRIGGER EMPLOYEES
EMP_DETAILS_VIEW VIEW EMPLOYEES
UPDATE_JOB_HISTORY TRIGGER EMPLOYEES
select index_name, table_name
from dba_indexes
where table_name ='EMPLOYEES';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
EMP_EMAIL_UK EMPLOYEES
EMP_MANAGER_IX EMPLOYEES
EMP_NAME_IX EMPLOYEES
EMP_EMP_ID_PK EMPLOYEES
EMP_DEPARTMENT_IX EMPLOYEES
EMP_JOB_IX EMPLOYEES
- Crear una tabla temporal sobre la cual se haga la redefinición:
CREATE TABLE HR.EMPLOYEES_TEMP
TABLESPACE TBSSEC AS
SELECT * FROM HR.EMPLOYEES WHERE 1=0;
- Iniciar proceso de redefinición:
EXEC DBMS_REDEFINITION.start_redef_table('HR','EMPLOYEES', 'EMPLOYEES_TEMP');
Para incluir los los objetos dependientes como índices se puede ejecutar el procedimiento que los incluye:
SET SERVEROUTPUT ON
DECLARE
l_num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.copy_table_dependents(
uname => 'HR',
orig_table => 'EMPLOYEES',
int_table => 'EMPLOYEES_TEMP',
copy_indexes => DBMS_REDEFINITION.cons_orig_params, -- Non-Default
copy_triggers => TRUE, -- Default
copy_constraints => TRUE, -- Default
copy_privileges => TRUE, -- Default
ignore_errors => TRUE, -- Default
num_errors => l_num_errors);
DBMS_OUTPUT.put_line('l_num_errors=' || l_num_errors);
END;
/
Verificar que los índices y objetos dependientes de la tabla temporal estén creados:
set linesize 150
select name, type, referenced_name
from all_dependencies
where referenced_name like 'EMPLOYEES_TEMP'
and referenced_type = 'TABLE'
and referenced_owner = 'HR';
NAME TYPE REFERENCED_NAME
------------------------------ ------------------ ----------------------
TMP$$_UPDATE_JOB_HISTORY0 TRIGGER EMPLOYEES_TEMP
TMP$$_SECURE_EMPLOYEES0 TRIGGER EMPLOYEES_TEMP
select index_name, table_name
from dba_indexes
where table_name ='EMPLOYEES_TEMP';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
TMP$$_EMP_EMAIL_UK0 EMPLOYEES_TEMP
TMP$$_EMP_MANAGER_IX0 EMPLOYEES_TEMP
TMP$$_EMP_NAME_IX0 EMPLOYEES_TEMP
TMP$$_EMP_EMP_ID_PK0 EMPLOYEES_TEMP
TMP$$_EMP_DEPARTMENT_IX0 EMPLOYEES_TEMP
TMP$$_EMP_JOB_IX0 EMPLOYEES_TEMP
Es posible que se necesite recrear objetos como vistas y sinónimos. Luego se debe sincronizar la tabla, y una vez finalizada se puede borrar la tabla temporal, pero antes se puede revisar que la tabla hr.employees haya quedado encriptada:
EXEC DBMS_REDEFINITION.sync_interim_table('HR','EMPLOYEES', 'EMPLOYEES_TEMP');
EXEC DBMS_REDEFINITION.finish_redef_table('HR','EMPLOYEES', 'EMPLOYEES_TEMP');
DROP TABLE EMPLOYEES_TEMP;
Para la prueba, borrar la tabla original después de verificar que los datos han sido encriptados. Si se quiere revisar los datos y están en filesystem se puede abrir el archivo con “vi tablespace.dbf” y escribir “:%!xxd”, y buscar los datos de la tabla employees: por ejemplo HBAER:
select table_name, tablespace_name from dba_tables where table_name like 'EMPLOYEES%';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
EMPLOYEES TBSSEC
EMPLOYEES_TEMP EXAMPLE
Tablespace EXAMPLE, donde está la tabla EMPLOYEES_TEMP
Tablespace TBSSEC, donde está la tabla EMPLOYEES:
Generación de Export Encriptado
El Data Pump permite que se genere un export encriptado. La encriptación se puede manejar con los siguientes métodos: dual, transparent y password. También se puede decidir si la encriptación se aplica a todos los datos o cuales columnas serán encriptadas.
Los modos de encriptación dual y transparent requieren que el Wallet esté abierto y disponible. El modo más sencillo es proporcionar un password al momento del export y que este mismo se use en el momento del import, si el password no es el mismo el import fallará.
Se debe definir el directorio en el que se generen los exports:
CREATE OR REPLACE DIRECTORY dump_dir AS '/u01/ASO/';
GRANT READ, WRITE ON DIRECTORY dump_dir TO HR;
Parámetros de Data Pump:
- encryption: se usa para especificar qué encriptar:
- all: habilita la encriptación para datos y metadatos del export.
- data_only: habilita encriptación solo para los datos exportados.
- encrypted_columns_only: habilita encriptación de columnas encriptadas.
- metadata_only: encripta la metada exportada.
- none: deshabilita la encriptación de los objetos de la base de datos
- encryption algorithm: especifica el tipo de algoritmo de encriptación con alguno de estos valores:
- AES128, por defecto
- AES192
- AES256
- encryption_mode: define cómo se maneja la seguridad del export
- password: password en la generación y restauración del backup. Export recomendado cuando la restauración se realiza en una base de datos remota, o diferente a la de la fuente.
- transparent: Requiere el uso de un wallet . Export recomendado cuando la restauración se realiza en la misma base de datos.
- dual: crea un dumpfile que se puede recuperar con cualquiera de las dos alternativas anteriores
- encryption_password: se usa para especificar el password para el dumpfile
Ejemplos:
- Encriptación con password
expdp HR/oracle dumpfile=expHR.dmp logfile=d expHR.log encryption=all encryption_mode=password
encryption_password=test encryption_algorithm=aes25
- Encriptación con transparent
expdp HR/oracle dumpfile=expHR1.dmp logfile=expHR1.log encryption=all encryption_mode=transparent
encryption_algorithm=aes256 directory=dump_dir
Importación:
- Encriptación con password
impdp system/oracle dumpfile=expHR.dmp logfile=impHR.log directory=dump_dir
Import: Release 11.2.0.1.0 - Production on Wed Sep 17 07:24:31 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: invalid operation
ORA-39174: Encryption password must be supplied.
Se debe proveer el password para la importación
impdp system/oracle dumpfile=expScott.dmp logfile=impscott.log directory=dump_dir encryption_password=test
- Encriptación con transparent
impdp system/oracle dumpfile=expScott1.dmp logfile=impScott1.log
Gestion del Wallet
Respaldo
Se recomienda crear un respaldo de la llave:
- Inmediatamente después de haberla creado
- Cuando se cambie el master key (antes y después)
- Cuando se actualice el password (antes y después)
- Cuando se haga backup de la base de datos, guardar en medios (destinos) diferentes el backup del wallet y el backup de la base de datos
El backup de la llave debe ser guardado en una ubicación segura y en un resguardo onsite y offsite.
Permisos
Se recomienda restringir los permisos del archivo y el directorio donde reside el wallet.
chown –R oracle:oinstall /u01/ASO/$ORACLE_UNQNAME
chmod –R 700 /u01/ASO/$ORACLE_UNQNAME
Una vez creado el wallet establecer estos permisos sobre el wallet:
chmod 600 ewallet.p12
Para evitar el borrado del walet por equivocación agregarle permisos de “immutable” (Linux, ext2, ext3, ext4 y OCFS):
chattr +i ewallet.p12
chattr +i cwallet.sso
Para poder hacer un re-key o cambiar el password, recuperar los permisos:
chattr -i ewallet.p12
chattr -i cwallet.sso
Una vez finalizados los cambios restaure a #”immutable”.
Password
Se recomienda el uso de un password fuerte que sea fácil de recordar, ya que si se compromete el password , se comprometen los datos encriptados en la base de datos, debe contener número y letras y tener como mínimo 10 caracteres.
Vistas Relacionadas con ASO
- DBA_TABLES
- DBA_TABLESPACES
- DBA_ENCRYPTED_COLUMNS
- ALL_ENCRYPTED_COLUMNS
- USER_ENCRYPTED_COLUMNS
- V$WALLET
- V$ENCRYPTION_WALLET
Documentos de Referencia
Oracle Data Pump Encrypted Dump File Support
/a/tech/docs/technical-resources/datapump11g-encrypted-1106.pdf
Oracle Advanced Security Transparent Data Encryption Best Practices
a/tech/docs/technical-resources/twp-transparent-data-encryption-bestpractices.pdf
RMAN Configuring Backup Encryption
http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmconfa.htm#BRADV89467
Advanced Security Option orapki Utility
http://docs.oracle.com/cd/E11882_01/network.112/e10746/asoappf.htm#ASOAG500
Ana Gamba Olmos (ana.gamba@oracle.com), actualmente se desempeña como Senior Sales Consultant - DB Specialist en Oracle Enterprise Accounts
Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.