Oracle Seguridad en Profundidad: Advanced Security Option
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
Modificación de SQLNET.ORA
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
export ORACLE_SID=securedb export ORACLE_UNQNAME=securedb
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
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;
Creacion De Tabla Encriptada
- 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
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
- 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
- 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
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
http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/datapump11g_encrypted_1106.pdf
Oracle Advanced Security Transparent Data Encryption Best Practices
http://www.oracle.com/technetwork/database/security/twp-transparent-data-encryption-bes-130696.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
No hay comentarios:
Publicar un comentario