miércoles, 27 de mayo de 2015

Oracle Seguridad en Profundidad: Advanced Security Option



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

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