Prevención de hurto de Información en Oracle Database 12c, Advanced Security Option : TDE y Redaction.

#15 Octubre 2024

#OracleTIPSSV

#OracleACEPRO

Debemos configurar el Wallet de encriptación, este se configura mediante el sqlnet.ora en el $OH/network/admin.

Si es RAC, se sugiere usar ACFS para colocar el Wallet en un directorio compartido para todos los nodos.

NOTA: Para más explicaciones, puede consultar el articulo anterior: https://oracletipssv.com/2024/08/06/prevencion-del-urto-de-informacion-oracle-tde/

Configuring the sqlnet.ora File for a Software Keystore Location

Use the sqlnet.ora file to configure the keystore location for a regular file system, for multiple database access, and for use with Oracle Automatic Storage Management (ASM).

  • To create a software keystore on a regular file system, use the following format when you edit the sqlnet.ora file:


Procedemos a crear el wallet para usarlo como keystore con su respectivo password.el wallet puede crearse con autologin.
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/backup/wallet' IDENTIFIED BY password;

OR

ADMINISTER KEY MANAGEMENT CREATE   AUTO_LOGIN KEYSTORE FROM KEYSTORE '/backup/wallet/' IDENTIFIED BY password;

También debe crearse la clave maestra:

ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY password;

ADMINISTER KEY MANAGEMENT SET KEY   IDENTIFIED BY password  WITH BACKUP USING 'backup'  ;

Debe asegurarse tener el compatible en 12.1, recuerde que el compatible no tiene nada que ver con el performance de query, trata de la activación de características de la edición de la BD, un parámetro estático e irreversible.

compatible >=12.1

Para evitar olvidar abrir el wallet cada vez que la bd se reinicia, se puede configurar el autologin.

ADMINISTER KEY MANAGEMENT CREATE   AUTO_LOGIN KEYSTORE FROM KEYSTORE '/backup/wallet' IDENTIFIED BY password;

Vamos crear un tablespace y una tabla para la demostración, que permitirá examinar el contenido de un tablespace/datafile y comprobar el beneficio de la característica.

CREATE TABLESPACE encrypt_ts   DATAFILE '/backup/oradata/encrypt_df.dbf' SIZE 1M ENCRYPTION USING 'AES256'
  DEFAULT STORAGE (ENCRYPT);  2  

Tablespace no encriptado

CREATE TABLESPACE nonencrypt_ts   DATAFILE '/bkp/oradata/nonencrypt_df.dbf' SIZE 1M ;

Tablas en tablespace encriptado

create table dba_copia1 tablespace encrypt_ts as select * from dba_objects;
create table dba_copia1 tablespace encrypt_ts as select * from dba_objects

Le vamos a dar mas tamaño para que no de error por espacio:

SQL> alter database datafile '/bkp/oradata/nonencrypt_df.dbf' autoextend on next 10m;

Database altered.

SQL> alter database datafile '/bkp/oradata/encrypt_df.dbf' autoextend on next 10m;

Database altered.

SQL> 

  1* create table dba_copia2 tablespace encrypt_ts as select * from dba_objects

Tabla en tablespace no encriptado

  1* create table dba_copia2 tablespace nonencrypt_ts as select * from dba_objects

SQL> /

Table created.

^

Consultamos el contenido del datafile del tablespace encriptado:

emrep:oracle@emcc:/bkp/oradata> strings encrypt_df.dbf  | more

}|{z
;ORCL12C
ENCRYPT_TS
${yw7
#B8[
@1 q
yz.x
QjMa{
zORR
MqAa

emrep:oracle@emcc:/bkp/oradata> strings  nonencrypt_df.dbf  | more
SQL> create table dba_copia3 tablespace users as select * from dba_objects;

Table created.

SQL> 

SQL> set linesize 200
  1* select tablespace_name,segment_name from dba_segments where segment_name in ('DBA_COPIA1','DBA_COPIA2','DBA_COPIA3') group by tablespace_name,segment_name

SQL> 

alter table DBA_COPIA3 move tablespace ENCRYPT_TS;

Table altered.

SQL> 

SQL> select tablespace_name,segment_name from dba_segments where segment_name in ('DBA_COPIA1','DBA_COPIA2','DBA_COPIA3') group by tablespace_name,segment_name;

Podemos ver los archivos que componen el wallet, que son el propio wallet y el archivo del autologin, p12 y sso.

emrep:oracle@emcc:/bkp/wallet> ls -lrt

total 12

-rw-r–r–. 1 oracle oinstall 2400 Jun 27 16:20 ewallet_2024062716205812_bckupkey.p12

-rw-r–r–. 1 oracle oinstall 3848 Jun 27 16:20 ewallet.p12

-rw-r–r–. 1 oracle oinstall 3893 Jun 27 16:30 cwallet.sso

emrep:oracle@emcc:/bkp/wallet> mv cwallet.sso cwallet.sso.bkp

emrep:oracle@emcc:/bkp/wallet> 

emrep:oracle@emcc:/bkp/wallet> 

emrep:oracle@emcc:/bkp/wallet> exit

exit

Como todo wallet, puede cerrarse , abrise, etc.

SQL> administer key management set keystore close;

keystore altered.

SQL> SQL> 

 administer key management set keystore open identified by  password;

keystore altered.

SQL> 

cd /bkp/wallet/

Podemos eliminar el autologin

emrep:oracle@emcc:/bkp/wallet> mv cwallet.sso.bkp  cwallet.sso

emrep:oracle@emcc:/bkp/wallet> ls -lrt

total 12

-rw-r–r–. 1 oracle oinstall 2400 Jun 27 16:20 ewallet_2024062716205812_bckupkey.p12

-rw-r–r–. 1 oracle oinstall 3848 Jun 27 16:20 ewallet.p12

-rw-r–r–. 1 oracle oinstall 3893 Jun 27 16:30 cwallet.sso

emrep:oracle@emcc:/bkp/wallet> 

Vamos a simular un apagado y validar que auto abre el wallet y su contenido esta a disposición de la BD.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> SQL> startup

ORACLE instance started.

Total System Global Area 1.0033E+10 bytes

Fixed Size     2934696 bytes

Variable Size 1677723736 bytes

Database Buffers 8321499136 bytes

Redo Buffers   30617600 bytes

Database mounted.

Database opened.

SQL> l

SQL> 

cd ..

emrep:oracle@emcc:/bkp> cd wallet/

emrep:oracle@emcc:/bkp/wallet> ls -lrt

total 12

-rw-r–r–. 1 oracle oinstall 2400 Jun 27 16:20 ewallet_2024062716205812_bckupkey.p12

-rw-r–r–. 1 oracle oinstall 3848 Jun 27 16:20 ewallet.p12

-rw-r–r–. 1 oracle oinstall 3893 Jun 27 16:30 cwallet.sso

Ahora vamos a simular reiniciar sin el autologin.

emrep:oracle@emcc:/bkp/wallet> mv cwallet.sso cwallet.sso.bkp

emrep:oracle@emcc:/bkp/wallet> sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 27 16:58:41 2024

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 1.0033E+10 bytes

Fixed Size     2934696 bytes

Variable Size 1677723736 bytes

Database Buffers 8321499136 bytes

Redo Buffers   30617600 bytes

Database mounted.

Database opened.

SQL> 

Al querer consultar una tabla que esta almacenada en un tablespace encriptado, provoca un error

 select * from dba_copia1;

select * from dba_copia1

              *

ERROR at line 1:

ORA-28365: wallet is not open

SQL> 

 ls

cwallet.sso.bkp  ewallet_2024062716205812_bckupkey.p12  ewallet.p12

emrep:oracle@emcc:/bkp/wallet> mv cwallet.sso.bkp cwallet.sso

emrep:oracle@emcc:/bkp/wallet> 

 sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 27 17:07:29 2024

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>st artup

ORACLE instance started.

Total System Global Area 1.0033E+10 bytes

Fixed Size     2934696 bytes

Variable Size 1677723736 bytes

Database Buffers 8321499136 bytes

Redo Buffers   30617600 bytes

Database mounted.

Database opened.

  2  

SQL> 

y el wallet funcionando:

Espero les sea de utilidad.

saludos.

Multitenant: Conversión de NonCDB a PDB

#OracleTIPSSV

#OracleACEPRO

#26082024

En este ejercicio vamos a ver los pasos para convertir una BD Noncdb de cualquier version hacia PDB , para el caso, si la DB es 12c y la CDB destino es 19c, obvio yo sugiero que hay hacer el upgrade primero.

Primero validamos todos los componentes se encuentran en estado valido y mas importante, esta cantidad de componentes debe ser igual a los componentes que la CDB tiene instalados y funcionando.

DBA_REGISTRY

CATALOG Oracle Database Catalog Views 12.2.0.1.0 VALID
CATPROC Oracle Database Packages and Types 12.2.0.1.0 VALID
XDB Oracle XML Database 12.2.0.1.0 VALID
OWM Oracle Workspace Manager 12.2.0.1.0 VALID
JAVAVM JServer JAVA Virtual Machine 12.2.0.1.0 VALID
XML Oracle XDK 12.2.0.1.0 VALID
CATJAVA Oracle Database Java Packages 12.2.0.1.0 VALID
APEX Oracle Application Express 18.1.0.00.45 VALID
RAC Oracle Real Application Clusters 12.2.0.1.0 VALID

— Si es RAC asegurarse de tener solo una instancia encendida, asegurarse de que el OMF el db_create_file_dest este definido apuntando al diskgroup.

Procedimiento

Existen varias formas de pegar una NonCDB a PDB,

Copia , el método de copia se asegura de dejar la BD original intacta pero es mas tardado. El Reuso, método de reuso no tiene punto de retorno, pues utiliza los datafiles actuales.

Para realizar el procedimiento de reuso de archivos.

Procedimiento de clonación en bd01

1 Apagamos la BD y la ponemos en Read ONLY para que el SCN en la cabecera de todos los datafiles este sincronizado al mismo valor con el control file.

export ORACLE_SID=bd01
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ ONLY;

2 crear manifiesto
el archivo que contiene el descriptivo de la bd sus datafiles, objetos, SCN , etc etc.

BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => ‘/tmp/bd01.xml’);
END;
/

En este caso activamos el modo archive, y creamos los redolog de 4g porque estaban de menos tamaño.

3 shutdown bd01

export ORACLE_SID=db12c
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;

4 en cdb destino

Observar la respuesta de YES en el plsql anónimo siguiente:

SET SERVEROUTPUT ON;
DECLARE
compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/tmp/bd01.xml')
WHEN TRUE THEN 'YES'
ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/
SQL> SQL> 2 3 4 5 6 7 8 9 YES

5. Para chequear imcompatibilidad de PDB a pegar

SQL> select message from PDB_PLUG_IN_VIOLATIONS where type='ERROR' and status ='PENDING';
no rows selected

6. Revisar los dbfiles de la cdb destino para que pueda albergar los datafiles que vienen de la NONCDB.

show parameter db_file, si no es suficiente aumentar valor

NOTA
CREATE PLUGGABLE DATABASE pbd01 USING ‘/tmp/bd01.xml’ nocopy;

LEER ADENDA AL FINAL

Cuando se ocupa nocopy en la sentencia de create plugable database, los tempfile si estan en asm u OMF daran error

1>CREATE PLUGGABLE DATABASE pbd01 USING '/tmp/bd01.xml' nocopy;
CREATE PLUGGABLE DATABASE pbd01 USING '/tmp/bd01.xml' nocopy
*
ERROR at line 1:
ORA-27038: created file already exists
ORA-01119: error in creating database file
'

Solucion ver documento: “Failure In Creating PDB With Temp Files Stored In ASM / OMF Format From Non-CDB Using NOCOPY Option (Doc ID 2778041.1)”
Below bug was opened with our development team:

BUG 26621022 – NEW TEMPFILES ARE CREATED NOT REUSED USING CREATE PLUGGABLE ..TEMPFILE REUSE
Above bug was closed by our development team stating it as expected behavior. In order to resolve this issue,
we can use either of below solutions:
Make sure sufficient free space available in the desired ASM disk group or filesystem (in case of OMF).
or
Delete the TEMP tablespace temp files from source Non-CDB database environment after generating
the XML file and then shutting down the Non-CDB database.


Hay que borrar los tempfiles de la bd origen en el FS datastore después de generar el xml, después de apagar la instancia y antes de pegarla en la cdb

Query para monitorear avance de copia en CDB

select opname, sid, serial#, sofar, totalwork, time_remaining,time_remaining/60 fm,time_remaining/60/60 fh, message
from v$session_longops where time_remaining > 0;

7. Cuando termine, se abre la PDB recién pegada

alter pluggable database pbd01 open;
alter session set container=pbd01 ;

8.Validar violación al pegar pdb

No debe devolver filas, si hay filas debe analizarse cada situación contra MOS.

column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status='PENDING' and type='ERROR' and con_id=3
order by time;
SQL> SQL> SQL> SQL> 2 3 4
no rows selected

9.Script de no marcha atrás: finalización de paso a PDB.

Este script se asegura de crear el diccionario de datos de los objetos permisos, etc que vienen de la NONCDB a PDB.

Yo no se pero en mi experiencia aun hay cositas que le faltan pulir a la PDB , aun en 19c.

@?/rdbms/admin/noncdb_to_pdb.sql

——- el TEMPFILE debe tener espacio suficient een la pdb. mas de 5g.
64GB en PDB y 32Gb en CDB y 20GB al tempo.
–para ejemplo:

alter database tempfile '+dg/tempfile.2.1106479113' resize 31g;

10.Validar fallas en pegado y script final

No debe devolver filas

Observese que hay restricciones de OPEN MODE

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        MIGRATE    YES
SQL> column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status='PENDING' and type='ERROR' and con_id=3
order by time;SQL> SQL> SQL> SQL> 2 3 4
no rows selected

SQL> alter session set container=pbd01;

Session altered.

SQL> column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status=’PENDING’ and type=’ERROR’ and con_id=3
order by time;SQL> SQL> SQL> SQL> 2 3 4

no rows selected


11. validar open mode y que este RW sin restricciones

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.12.0.0.0

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        READ WRITE NO
SQL> alter session set container=pbd01;
Session altered.

PASO MIL.

Abrir la PDB en RW en todos los nodos en todas las instancias si fuera RAC y guardar el estatus.

alter pluggable database pbd01 open instances=all;
alter pluggable database pbd01 save state instances=all;
Pluggable database altered.

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        READ WRITE NO

Espero les sea de utilidad

ADENDA

Puede usarse la instrucción de pegado que pega copiando los datafiles, dejando los originales intactos, esto facilita un método de reversa sin restaurar de backup.

CREATE PLUGGABLE DATABASE pdb6 USING '/tmp/db12c.xml'
COPY
FILE_NAME_CONVERT = ('/rutaCDB/', 'ruta_PDB/');

puede usarse OMF para definir la ruta de crecion, especialmente si es ASM Diskgroup.

Oracle Database Security : Native Network Encryption.

#OracleTIPSV

#ORACLEACEPRO

#25/08/2024

Siguiendo con la serie de artículos de seguridad en la Base de Datos Oracle, vamos a tratar el tema de la seguridad de los datos en el trafico de red.

En un entorno natural en el que se ve involucrada una Base de Datos Oracle, la comunicación es siempre establecida usando el protocolo OracleNet que no es mas que el trafico basado en TCP, por lo cual dicho trafico puede interceptarse por un agente externo no autorizado y descifrar el contenido y hacerlo legible con el objetivo de extraer informacion de forma no autorizada.

Existen mas de un método para cifrar el trafico que se consume de una base de datos Oracle, pero nos centraremos en el ofrecido de forma nativa por Oracle Database: Native Network Encryption.

Al aplicar dicha configuración el flujo de trafico se denota porque no puede leerse dado que ya no viaja plano si no cifrado.

Vamos a validar, me conecto a una BD remota en la Nube de Oracle, no precisamente el funciona solo a dicho tipo de plataformas, pero todavía es una mejor prueba dado que el trafico va por internet.

Ejecuto un SQL a una tabla y observamos sus filas devueltas.

Durante reejecute los statements, previamente active el sniffer para capturar paquetes TCP, mi ambiente es OSX y use tcpdump, para linux funcionaria, para Solaris SNOOP, esta herramienta necesita activar el modo promiscuo de la interfaz y necesita privilegios elevados.

Aquí envíe el trafico capturado al archivo channel-11

El contenido del archivo de trafico se observa así, lo cual personal de redes puede entenderlo mejor, pero aun así no cumple el objetivo en el entendimiento de las tramas para mi Demostración.

Para nuestro caso, utilice una herramienta un poco mas avanzada llamada WireShark ( Un compañero de Redes me enseño a usarla).

Resultado de las filas

Como puede observarse abajo del lado derecho en la imagen de arriba, puede observase el resultado de las filas, de la misma forma puede observarse las encabezados de columnas, el statement o instrucción enviada al motor y de la misma forma, usuarios y passwords.

Para configurar la opción del lado del motor, es tan simple como agregar un parametro en el sqlnet.ora en el $OH del RDBMS.

Encryption_server y types_server para controlas el algoritmo.

Del lado del cliente también debe configurarse la opción:

Hay que denotar las palabras clave required y requested.

Requerido del lado del motor obligara que todas las conexiones obliguen al cifrado en el ingreso de la sesión; solicitado, permitirá aceptar conexiones cifradas y no cifradas.

Al activar la característica, y volver a examinar el trafico de red, ya no logramos leer los paquetes ya muestra texto ilegible.

Algo Importante la característica Native Network Encryption es gratis desde 11.2, ya no forma parte de la opción Advanced Security Option (ASO).

Puede leerse del sitio de información de licenciamiento.

https://apex.oracle.com/pls/apex/features/r/dbfeatures/licenses?license_id=92

La característica funciona tanto para conexiones usando TNSNAMES de forma nativa, para JDBC OCI y/o THIN.

Tomado del sitio Oficial:

https://docs.oracle.com/en/database/oracle/oracle-database/18/dbseg/configuring-thin-jdbc-client-network.html#GUID-96B18FF8-611F-46BC-B7D3-217023234BCB

Saludos, espero les sea de utilidad.

Oracle Data Redaction : Previniendo que se consulten datos no autorizados a observar.

#################

redaction, #OracleACEPRO, #OracleTIPSSV, 23jul2024

#################

Que es la redacción?

Es una característica de Base de Datos que permite colocar un lente ( así lo llamo yo) enfrente de los datos, dicho lente permite que se observen los datos reales o no, dependiendo el origen de la conexión, el usuario que consulta, etc etc, siendo las propiedades de la sesión las posibles variables que permiten consultar los datos al natural redactados.

Usuarios autorizados de consulta podrán observar los datos de forma normal , mientras los que no, observaran patrones generados con informacion totalmente transformada , parcial, etc, dependiendo del patron.

Existen diferentes tipos de patrones para la transformación ( porque eso es la redacción).

PERO HAY QUE HACER MENCION: LA REDACCION ES PURAMENTE VISUAL, TOTALMENTE ONLINE.

De la pagina de la documentación oficial:

Beneficios

Preparación de la DEMO:

Creamos 2 usuarios

--drop user testuser1 cascade;
create user testuser1 identified by testuser1 quota unlimited on users;
grant create session, create table to testuser1;
--drop user testuser2 cascade;

create user testuser2 identified by testuser2 quota unlimited on users;

grant create session to testuser2;

drop table payment_details purge;

create table payment_details (

  id          number       not null,

  customer_id number       not null,

  card_no     number       not null,

  card_string varchar2(19) not null,

  expiry_date date         not null,

  sec_code    number       not null,

  valid_date  date,

  constraint payment_details_pk primary key (id)

);

Nos conectamos e insertamos datos:

conn testuser1/testuser1

insert into payment_details values (1, 4000, 1234123412341234, ‘1234-1234-1234-1234’, trunc(add_months(sysdate,12)), 123, null);

insert into payment_details values (2, 4001, 2345234523452345, ‘2345-2345-2345-2345’, trunc(add_months(sysdate,12)), 234, null);

insert into payment_details values (3, 4002, 3456345634563456, ‘3456-3456-3456-3456’, trunc(add_months(sysdate,12)), 345, null);

insert into payment_details values (4, 4003, 4567456745674567, ‘4567-4567-4567-4567’, trunc(add_months(sysdate,12)), 456, null);

insert into payment_details values (5, 4004, 5678567856785678, ‘5678-5678-5678-5678’, trunc(add_months(sysdate,12)), 567, null);

commit;

alter session set nls_date_format=’dd-mon-yyyy’;

column card_no format 9999999999999999

SQL> 

SQL> 

set linesize 200

SQL> /

Ahora vamos a agregar una simple regla de protección que impida que al conectarse desde una IP especifica los datos se observen naturales.

begin

  dbms_redact.add_policy(

    object_schema => user,

    object_name   => ‘payment_details’,

    column_name   => ‘card_no’,

    policy_name   => ‘redact_card_info’,

    function_type => dbms_redact.full,

    expression=> ‘sys_context(”userenv”,”IP_ADDRESS”) = ”192.168.1.1”’

  );

end;

/

Si desearemos borrar la politica seria:

begin

  dbms_redact.drop_policy (

    object_schema => user,

    object_name   => ‘payment_details’,

    policy_name   => ‘redact_card_info’

  );

end;

/

Al consultar los datos desde la IP indicada:

TOAD EN MI PC

        ID CUSTOMER_ID    CARD_NO CARD_STRING         EXPIRY_DATE   SEC_CODE

———- ———– ———- ——————- ———– ———-

VALID_DATE

———-

         1        4000          0 1234-1234-1234-1234 27-JUN-25          123

         2        4001          0 2345-2345-2345-2345 27-JUN-25          234

         3        4002          0 3456-3456-3456-3456 27-JUN-25          345

         4        4003          0 4567-4567-4567-4567 27-JUN-25          456

         5        4004          0 5678-5678-5678-5678 27-JUN-25          567

5 rows selected.

Al consultar desde otro servidor en la Nube de Oracle

sqlplus testuser1/testuser1@//IPREMOTA:1521/orcl12c.us.oracle.com

SQL*Plus: Release 19.0.0.0.0 – Production on Thu Jun 27 23:43:37 2024

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Jun 27 2024 23:42:59 +00:00

Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

alter session set nls_date_format=’dd-mon-yyyy’;

column card_no format 9999999999999999

set linesize 200

select *

from   payment_details

order by id;   

Desde el propio servidor de base de Datos

alter session set nls_date_format=’dd-mon-yyyy’;

column card_no format 9999999999999999

set linesize 200

select *

from   payment_details

order by id; 

I

Como pudo observarse la redacción es una característica bastante util, transparente a las aplicaciones sin implicaciones de cambio de código y sin implicaciones de no poder alterar los datos, forma parte de la opción Advanced Security Option, de pago extra sobre Licencia de EE.

Espero les sea de utilidad.

saludos.

Prevención del hurto de información: Oracle TDE

Raúl Antonio Molina Alvarenga

05Ago024

#OracleACEPRO

#OracleTIPSSV

Tomado de:

https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/introduction-to-transparent-data-encryption.html

Este articulo se centra en la activación de una de las características de seguridad de la base de datos Oracle Enterprise Edition, Transparent Data Encryption, de la documentación Oficial:

Como mucha característica EE, de paga extra por la metrica de licenciamiento x el # de licencias adquiridas, y replicable a Contingencia, ambientes de desarrollo previos si se utilizan copias de RMAN.

Como primer paso hay que configurar el wallet, en versiones anteriores se usaba solo el sqlnet.ora pero pude percatarme según la guía que ahora se ocupa un parámetro de BD.

De la documentación, el wallet nos sirve para almacenar las claves de encriptación maestras y puede almacenarse en varios lados,

La encriptación puede hacerse a nivel de Columna o tablespace, se recomienda de tablespace porque es menos impactante en la operación que la de columnas.

La de columna encripta y decripta al momento de DMLs, la de tablespace no.

El funcionamiento de la encriptación de tablespaces con la llave maestra y su interacción con el wallet.

El wallet por defecto es un keystore que almacenara la información que permitirá encriptar y desencriptar los datos de la BD.

Solicitado por Luis Caballero, asegurese que el Keystore es autologin y no Local autologin , porque dicho WALLET agrega una validacion de HOST que no permite usarse en diferente maquina, ni siquiera en un Oracle RAC.

These keystores are as follows:

  • Auto-login TDE wallets: Auto-login TDE wallets are protected by a system-generated password, and do not need to be explicitly opened by a security administrator. Auto-login TDE wallets are automatically opened when accessed at database startup. Auto-login TDE wallets can be used across different systems. If your environment does not require the extra security provided by a keystore that must be explicitly opened for use, then you can use an auto-login TDE wallet. Auto-login TDE wallets are ideal for unattended scenarios (for example, Oracle Data Guard standby databases). 
  • Local auto-login TDE wallets: Local auto-login TDE wallets are auto-login TDE wallets that are local to the computer on which they are created. Local auto-login keystores cannot be opened on any computer other than the one on which they are created. This type of keystore is typically used for scenarios where additional security is required (that is, to limit the use of the auto-login for that computer) while supporting an unattended operation. You cannot use local auto-open wallets in Oracle RAC-enabled databases, because only shared wallets (in ACFS or ASM) are supported. 
  • Password-protected TDE wallets: Password-protected TDE wallets are protected by using a password that you create. You must open this type of keystore before the keys can be retrieved or used and use a password to open this type of keystore.

ALTER SYSTEM SET WALLET_ROOT = '/bkp/wallet' SCOPE = SPFILE SID = '*';
ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE = BOTH SID = '*';

Luego de esto debemos configurar el password del keystore donde guardaremos la clave de encriptación maestra:

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY password;
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE IDENTIFIED BY password;

Una vez configurado, se debe abrir el wallet para permitir operaciones de encriptación de columnas o tablespaces.

OJO o NOTA:DEBE CUIDARSE LA LLAVE MAESTRA PORQUE PUEDE SIGNIFICAR LA PERDIDA DE LA BD.

ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY password;

ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN 

FORCE KEYSTORE 

IDENTIFIED BY EXTERNAL STORE;

Una vez se ha creado el wallet y aperturado, este puede consultarse su estado en esta vista:

select * from  V$ENCRYPTION_WALLET;

Una vez tenemos abierto el Wallet y clave maestra asignada, podemos encriptar ya sea columnas o tablespaces, mi ejemplo en este articulo es para tablesapaces completos.

Ejecutamos la encriptación Online, lo cual requiere tanto espacio para la creación temporal de o los archivos ya cifrados.

ALTER TABLESPACE users  ENCRYPTION ONLINE ENCRYPT ;

Con una exploración en el Sistema Operativo podemos ver que el contenido del datafile del tablespace se vuelve ilegible y sin posibilidad de realizar ingeniería inversa.

Pero dirán, es un efecto simulado, vamos a probar algo para demostrar la característica,

create tablespace demo datafile '/bkp/oradata/orclcdb/demo01.dbf' size 10m autoextend on next 50m;
alter tablespace demo  add  datafile '/bkp/oradata/orclcdb/demo02.dbf' size 10m autoextend on next 50m;
create table dba_copia8 tablespace demo as select * from dba_objects;

SQL> select ENCRYPTED,tablespace_name from dba_tablespaces;

ENC TABLESPACE_NAME

— ——————————

YES SYSTEM

YES SYSAUX

YES UNDOTBS1

NO  TEMP

YES USERS

YES NEW_UNDO_TS

YES ENCRYPT_TS

NO  DEMO

8 rows selected.

SQL> 

Antes

Quiero resaltar el hecho que en el listado de resultado del select anterior, el datafile single del tablespace DEMO indica aun no esta encriptado.

Al consultar el contenido del datafile, de forma no autorizada con un tool del Sistema operativo, puede consultarse el contenido bastante legible en Humano.

Despues

ALTER TABLESPACE demo  ENCRYPTION ONLINE ENCRYPT ;

Ya al volver a consultar el contenido del datafile ya aparece encriptado.

Y una vez un tablespace ha sido encriptado, todo datafile que se agregue o crezca no pierde dicha propiedad y contenido protegido.

alter tablespace demo  add  datafile ‘/bkp/oradata/orclcdb/demo03.dbf’ size 10m autoextend on next 50m;

insert into  dba_copia8  select * from dba_objects;

Por ultimo, la propiedad de encriptado o cifrado puede revertirse en caso de ser necesario de la misma forma
Espero les sea de utilidad.

Como consumir un Servicio WEB HTTPS con certificado SSL desde una Base de Datos Oracle.

#OracleACE

#OracleTIPSsv

#Raul Antonio Molina Alvarenga, 22/02/2024

La integración de sistemas es una parte crucial para el correcto funcionamiento de los mismos, los sistemas no son islas que no tienen comunicación con otros sistemas internos y/o externos en nuestras empresas.

Esta integracion puede hacerse con capas de software sofisticadas como un BUS de Servicios etc, pero tambien puede hacerse desde dentro de la poderosisima Oracle Database.

Cuando el consumo esta en HTTP no es problema alguno, pero pongamosle una variable HTTPS, la cosa cambio.

Para solventar dicho impase, necesitamos 3 cosas

1)Un WALLET

2)El certificado de sitio del webservice.

3)Un Procedimiento de prueba para validar el funcionamiento.

Anotados los pasos

Definir el sitio o servicio web a consumir, para el caso usaremos https://www.oracle.com

0) Descarga del certificado para el laboratorio

Dirigirse al sitio, usar chrome de preferencia

Validar la información del sitio seguro

Validar la información del certificado

Cambiarse a la pestaña detalles, seleccionar ROOT arriba y abajo

Click en exportar y guardar con este nombre sitecertify.crt

Trasladar al servidor de base de datos donde se usara.

1) Creacion de un folder que contendra el wallet

El wallet no es nada más que eso , una cartera para guardar identidades.

[oracle@~]$ mkdir -p /U01/app/oracle/admin/DB11G/wallet

2)Creacion del wallet con el tool orapki, existen mas tools para crear wallets, este está incluio varios productos Oracle.

[oracle@~]$ orapki wallet create -wallet /U01/app/oracle/admin/DB11G/wallet -pwd WalletPasswd123 -auto_login
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

3) Importacion del certificado en base 64 (x509 ) del sitio web o del sitio que contiene el servicio en SSL
usualmente se puede obtener del navegador cargando el sitio web, o con wget o CURL en un unix/linux

[oracle@~]$ orapki wallet add -wallet /U01/app/oracle/admin/DB11G/wallet -trusted_cert -cert "/home/oracle/sitecertify.crt" -pwd WalletPasswd123
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

los datos que se usaran dentro del plsql o bloque anonimo, ruta del wallet y password.

WALLET: /U01/app/oracle/admin/DB11G/wallet
PASS: WalletPasswd123

4)para validar su contenido:

orapki wallet display -wallet /U01/app/oracle/admin/DB11G/wallet
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US

5)y así la forma de invocarlo con un select sin bloque anonimo ni plsql.

SIN USAR EL WALLET:
SQL> select utl_http.request('https://www.oracle.com', null,NULL,NULL) from dual;
select utl_http.request('https://www.oracle.com', null,NULL,NULL) from dual
*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1530
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1470
ORA-06512: at line 1

usando el wallet

SQL> SET SERVEROUTPUT ON
select utl_http.request('https://www.oracle.com', null,'file:/U01/app/oracle/admin/DB11G/wallet','WalletPasswd123') from dual;
SQL>

UTL_HTTP.REQUEST(‘HTTPS://WWW.ORACLE.COM’,NULL,’FILE:/U01/APP/ORACLE/ADMIN/DB11G

<meta name="page_type" content="Home"/>Oracle | Cloud Applications and Cloud Platform< /title><link rel="preconnect" href="https://tms.oracle.com/" crossorigin="anonym ous"/><link rel="preconnect" href="https://tags.tiqcdn.com/" crossorigin="anonym ous"/><link rel="preconnect" href="https://consent.trustarc.com" crossorigin="an onymous"/><link rel="preconnect" href="https://d.oracleinfinity.io" crossorigin= "anonymous"/><link rel="dns-prefetch" href="https://dc.oracleinfinity.io" crosso rigin="anonymous"/><link rel="dns-prefetch" href="https://oracle.112.2o7.net" cr ossorigin="anonymous"/><link rel="dns-prefetch" href="https://s.go-mpulse.net" c rossorigin="anonymous"/><link rel="dns-prefetch" href="https://c.go-mpulse.net" crossorigin="anonymous"/><link rel="preload" href="https://www.oracle.com/asset/<br /> web/fonts/oraclesansvf.woff2" as="font" crossorigin="anonymous" type="font/woff2</p> <h2>UTL_HTTP.REQUEST('HTTPS://WWW.ORACLE.COM',NULL,'FILE:/U01/APP/ORACLE/ADMIN/DB11G</h2> <p>"/><link rel="preload" href="https://www.oracle.com/asset/web/fonts/redwoodicons .woff2" as="font" crossorigin="anonymous" type="font/woff2"/><meta name="major_v ersion" content="3"/><meta name="minor_version" content="13"/><meta name="bug_ve</p>

Espero les sea de Utilidad

Saludos.

Oracle Restart 19c Silent

Raul Antonio Molina Alvarenga

#29/01/2024

#OracleACE

#OracleTIPSsv

Instalación de Grid Infraestructure Oracle Restart en modo Silent 19c.

Esta guia complementa la serie de guias en modo no interactivo o silencioso como el caso del Clusterware 19c (https://www.linkedin.com/posts/ra%C3%BAl-antonio-molina-alvarenga-ocm-107b70b5_instalaci%C3%B3n-de-oracle-clusterware-y-oracle-activity-7096850034285006848-DsBD?utm_source=share&utm_medium=member_desktop).

Descargar el instalador que termina en grid_home.zip No usar el RPM

Para mi caso como estoy en una VM en la Nube de OCI , decsargue el ZIP usando wget, puede leerse de este otro articulo (https://www.linkedin.com/pulse/como-facilitar-la-descarga-de-instaladores-producto-ra%2525C3%2525BAl-antonio%3FtrackingId=gI%252BPQmIimPv0CIqefu0odA%253D%253D/?trackingId=gI%2BPQmIimPv0CIqefu0odA%3D%3D).

Podemos realizar la preparación con el modo automatico usando el rpm de pre rdbms o todos los pasos a mano, para el caso haremos todos los pasos a mano.

curl -o oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

O

Modo manual

Configurar parámetros de kernel

Add the following lines to the “/etc/sysctl.conf”

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

Este ultimo parametro (net.ipv4.ip_local_port_range = 9000 65500 ), puede o debe ser ajustado cuando hay instalaciones de Netbackup para respaldos de la vm o de la bd.

Guardar , salir y aplicarlos de forma online

sysctl -p

Agregar limites /etc/security/limits.d/limits.conf

oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728

grid soft nofile 1024
grid hard nofile 65536
grid soft nproc 16384
grid hard nproc 16384
grid soft stack 10240
grid hard stack 32768
grid hard memlock 134217728
grid soft memlock 134217728

Instalar paquetes de YUM local o de internet

yum install -y bc
yum install -y binutils
yum install -y compat-libcap1
yum install -y compat-libstdc++-33

yum install -y dtrace-modules

yum install -y dtrace-modules-headers

yum install -y dtrace-modules-provider-headers

yum install -y dtrace-utils
yum install -y elfutils-libelf
yum install -y elfutils-libelf-devel
yum install -y fontconfig-devel
yum install -y glibc
yum install -y glibc-devel
yum install -y ksh
yum install -y libaio
yum install -y libaio-devel
yum install -y libdtrace-ctf-devel
yum install -y libXrender
yum install -y libXrender-devel
yum install -y libX11
yum install -y libXau
yum install -y libXi
yum install -y libXtst
yum install -y libgcc
yum install -y librdmacm-devel
yum install -y libstdc++
yum install -y libstdc++-devel
yum install -y libxcb
yum install -y make
yum install -y net-tools # Clusterware
yum install -y nfs-utils # ACFS
yum install -y python # ACFS
yum install -y python-configshell # ACFS
yum install -y python-rtslib # ACFS
yum install -y python-six # ACFS
yum install -y targetcli # ACFS
yum install -y smartmontools
yum install -y sysstat

dnf install -y gcc
yum install -y unixODBCC

Crear grupos de oracle y grid y asignarlos a usuarios oracle y grid

useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba oracle
useradd -g oinstall -G oinstall,dba,asmdba,asmadmin,asmoper,oper grid
[root@instance-20231030-1410 ~]# passwd grid
passwd oracle

Configurar al selinux a un nivel inferior, permissive o disabled

En el fichero /etc/selinux/config el parámetro «SELINUX» debe estar a disabled
SELINUX=disabled

Para deshabilitar el firewall, ejecutamos estos dos comandos:
systemctl stop firewalld
systemctl disable firewalld

Crear directorios necesarios, los directorios deben crearse con grid, o si se hace con root darle los permisos necesarios al dueño del Software.

mkdir -p /u01/app/19.0.0/grid
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02

Moverse al directorio
Desempacar software, yo puse el zip en /bkp, No olvidar cambiarse de usuario (su – grid) para las tareas del dueño del software , en mi caso es NUBE y no tengo forma de conectarme directamente, logeo con OPC con la PPK y luego salto a root y salto a grid.

cd /u01/app/19.0.0/grid/
unzip /bkp/gi19.zip

Guardar como grid.rsp en /home/grid

usaremos la forma silent con modo de solo instalación, configuraremos a manual el software para los componenes del oracle restart

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0
INVENTORY_LOCATION=/u01/app/oraInventory
oracle.install.option=HA_SWONLY
ORACLE_BASE=/u01/app/grid
oracle.install.asm.OSDBA=oinstall
oracle.install.asm.OSOPER=
oracle.install.asm.OSASM=asmadmin

Invocar el instalador de esta forma

/u01/app/19.0.0/grid/gridSetup.sh -silent -responseFile /home/grid/grid.rsp

Mostro un warning porque tengo poco espacio

[WARNING] [INS-32020] Installer has detected that the available disk space on the volume for the specified Oracle base location (/u01/app/grid) is less than the recommended value.
ACTION: It is recommended that the volume for the Oracle base have at least 10 GB of available disk space. Choose a location that has sufficient available disk space or free up space on the existing volume.
[WARNING] [INS-30100] Insufficient disk space on the selected location (/u01/app/19.0.0/grid).
CAUSE: Specified location is on a volume without enough disk space on nodes: [instance-20231030-1410].
ACTION: Choose a location that has enough space (minimum of 6.9 GB) or free up space on the existing volume.

The response file for this session can be found at:
/u01/app/19.0.0/grid/install/response/grid_2024-01-29_10-45-29PM.rsp

You can find the log of this install session at:
/opt/oracle/oraInventory/logs/GridSetupActions2024-01-29_10-45-29PM/gridSetupActions2024-01-29_10-45-29PM.log

As a root user, execute the following script(s):
1. /u01/app/19.0.0/grid/root.sh

Execute /u01/app/19.0.0/grid/root.sh on the following nodes:

Successfully Setup Software with warning(s).

Ejecutar los scripts de root que indique el aviso.

[root@instance-20231030-1410 ~]# /u01/app/19.0.0/grid/root.sh
Check /u01/app/19.0.0/grid/install/root_instance-20231030-1410_2024-01-29_22-49-03-943784137.log for the output of root script

Vamos a configurar los demonios del oracle restart con este script:

/u01/app/19.0.0/grid/crs/install/roothas.sh
Using configuration parameter file: /u01/app/19.0.0/grid/crs/install/crsconfig_params
The log of current session can be found at:
/u01/app/grid/crsdata/instance-20231030-1410/crsconfig/roothas_2024-01-29_10-50-34PM.log

instance-20231030-1410 2024/01/29 22:51:16 /u01/app/grid/crsdata/instance-20231030-1410/olr/backup_20240129_225116.olr 724960844
2024/01/29 22:51:17 CLSRSC-327: Successfully configured Oracle Restart for a standalone server

Vamos a configurar las variables de ambiente para el Usuario dueño de la capa de software de GI.

vi .bash_profile
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM

Cargar variables con . .bash_profile o iniciando sesion de nuevo

Se debe crear un listener y la instancia de asm

Se inician despues

[grid@instance-20231030-1410 ~]$ srvctl add listener
[grid@instance-20231030-1410 ~]$
[grid@instance-20231030-1410 ~]$ srvctl add asm
s[grid@instance-20231030-1410 ~]$ srvctl start listener

[grid@instance-20231030-1410 ~]$
[grid@instance-20231030-1410 ~]$ srvctl start asm
grid@instance-20231030-1410 ~]$

Consultar el estado de los componentes del oracle restart.

Nomenclatura permanente de los discos.

Se puede usar la guia para configuración de dispositivos con reglas permanentes (https://www.linkedin.com/pulse/reglas-de-udev-para-discos-asm-en-linux-aplica-rhel-y-ra%2525C3%2525BAl-antonio-%3FtrackingId=93UVkvP7bCQic0Q3efn4hA%253D%253D/?trackingId=93UVkvP7bCQic0Q3efn4hA%3D%3D)

Antes en versiones anteriores de RHEL o OEL, preferia usar el driver ASMLIB para el nombrado y permanencia de los dispositivos de Disco, pero en RHEL8.x ya no funciona y me quede esperando la version 3.x del driver, aun no me gusta usar AFD asi, que , prefiero usar Reglas de UDEV.

Consultar discos

fdisk -l | grep Disk | grep bytes

Disk /dev/sda: 50.0 GB, 50010783744 bytes, 97677312 sectors
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Disk /dev/sdc: 53.7 GB, 53687091200 bytes, 104857600 sectors –> nuestro disco

Discriminar los devices que son FS (sda y sdb)

[root@instance-20231030-1410 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
tmpfs 7.7G 637M 7.1G 9% /dev/shm
tmpfs 7.7G 777M 7.0G 10% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/sda3 39G 33G 5.9G 85% /
/dev/sda1 200M 7.4M 193M 4% /boot/efi
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/993
tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/sdb 49G 12G 35G 26% /bkp

Debe encontrarse el identificador unico del dispositivo, en este caso el ID_SERIAL

udevadm info –query=all –name=/dev/sdc | egrep “WWN|SERIAL”

/dev/sdb 49G 12G 35G 26% /bkp
[root@instance-20231030-1410 ~]# udevadm info –query=all –name=/dev/sdc | egrep “WWN|SERIAL”
E: ID_SERIAL=360f033ce85784a5588a3c92d22b0dc02
E: ID_SERIAL_SHORT=60f033ce85784a5588a3c92d22b0dc02
E: ID_WWN=0x60f033ce85784a55
E: ID_WWN_VENDOR_EXTENSION=0x88a3c92d22b0dc02
E: ID_WWN_WITH_EXTENSION=0x60f033ce85784a5588a3c92d22b0dc02
[root@instance-20231030-1410 ~]#

Si es vmware y no se ve el serial, debe activarse la propiedad por el sysadmin y con la maquina apagada.

Enabling SCSI_ID on VMware
https://communities.vmware.com/t5/ESXi-Discussions/udev-scsi-id-with-rhel-guests/td-p/345366

Preparamos el texto de la regla de udev, para cada dispositivo, cambiamos el nombre del device ASM1 para el caso y su ID.

KERNEL==”sd*”, SUBSYSTEM==”block”, ENV{ID_SERIAL}==”360f033ce85784a5588a3c92d22b0dc02“, SYMLINK+=”oracleasm/ASM1“, OWNER=”grid”, GROUP=”asmadmin”, MODE=”0660″ ,OPTIONS:=”nowatch”

vi /etc/udev/rules.d/96-asm.rules
Grabamos y salimos

Recargamos la regla de udev para control de dispositivos de disco:

udevadm control –reload-rules
udevadm trigger –type=devices –action=change

Encontramos el disco ya
[root@instance-20231030-1410 ~]# ls -lL /dev/oracleasm/
total 0
brw-rw—-. 1 grid asmadmin 8, 32 Jan 30 01:21 ASM1
[root@instance-20231030-1410 ~]#

Como vimos ya tiene los permisos que todo device de asm debe tener desde 11.2, 660 y grid:asmadmin

Lo usamos:

establecemos la propiedad de discos para su descubrimiento en la ruta que la regla de udev lo dejo

Last login: Mon Jan 29 22:54:44 GMT 2024 on pts/0
[grid@instance-20231030-1410 ~]$ sqlplus / as sysasm

SQL*Plus: Release 19.0.0.0.0 – Production on Tue Jan 30 01:22:35 2024
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0

SQL> show parameter string

NAME TYPE VALUE


asm_diskstring string
SQL> alter system set asm_diskstring=’/dev/oracleasm/*’;

System altered.

SQL> select path from v$asm_Disk;

PATH

/dev/oracleasm/ASM1

SQL>

Crear diskgroup

SQL> create diskgroup data external redundancy disk ‘/dev/oracleasm/ASM1’;

Diskgroup Creado

Espero les sea de utilidad.

Saludos

Como solventar corrupción de bloques en datafiles

#OracleACE

#OracleTipsSV

#Raul Antonio Molina Alvarenga

Un día de estos me cruce con una situación en la que obtuve corrupción de bloques en una BD productiva muy grande e importante, bastante preocupante la situación, no daré detalles, pero se estuvo bajo mucha presión (LOL).

Porque es importante tener todos los bloques de datos marcados como limpios y no como corruptos?, obvio el acceso a los datos y el uso de indices.

Pero porque es importante limpiar bloques vacios?, porque a pesar de ser bloques vacios, el diccionario los conoce como corruptos y no se puede tener un backup rman 100% fiable.

Dicho esto, Lo importante en la definición de la solución fue lo siguiente para solventar corrupción en:

Bloques de datos en tablas , poder prescindir de ellos, o restaurar de un backup la tabla

Bloques de datos en indices, reconstruir el indice

Bloques Vacíos, yo pensaba que era solo ignorarlos, pero no.

En este ultimo aspecto, necesitaba se limpiaran, para poder dar el OK del datafile o de los datafiles afectados.

Encontré una nota de MOS:

Use RMAN to format corrupt data block which is not part of any object (Doc ID 1459778.1)

Haciendo la revision se encontro que los bloques que aparecen marcados como corruptos, son bloques vacios.

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

68   FAILED 0              129          4194293         10192968188924

  File Name: /archives/datafile_archivo_datats_12

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       1              3443658

  Index      0              461648

  Other      29             288837

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_8: validation complete, elapsed time: 00:32:45

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

160  FAILED 0              317          4194272         10192967869622

  File Name: /archivesdatafile_archivo_datats_18

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              3353890

  Index      0              501888

  Other      26             338177

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_4: validation complete, elapsed time: 00:31:35

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

181  FAILED 0              890          2992000         10192962696244

  File Name: /archives/bd_datafile_datats_01

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              2947506

  Index      0              38605

  Other      31             4999

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_5: validation complete, elapsed time: 00:23:15

Formas de resolver la corrupcion en terminos del contenido:

Segmentos de datos de tablas: se debe resolver restaurando de backup o estableciendo si es un dato prescindible o no.

Segmentos de datos de indices: puede reconstruirse el indice y el bloque se formateara como nuevo.

Segmentos vacios: deben ser formateados , pero a no tener bloques con datos no es tan sencillo.

Debemos conocer los datafiles con segmentos de espacio libre que estan marcados como corruptos.

El procedimiento para resolver es el siguiente:

Procedimiento  para reparar bloques corruptos cuando es espacio libre

Identificamos los datafiles que tienen bloques corruptos en espacio libre, y se chequean

 VALIDATE CHECK LOGICAL DATAFILE   68,79,85,141,160,181,331,406;

 160,181,68 

Puede corroborarse su contenido desde varias perspectivas:

SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id = 160 and 521184 between block_id AND block_id + blocks – 1;

select TABLESPACE_NAME,RELATIVE_FNO,BYTES from DBA_FREE_SPACE where FILE_ID=160 and 521184 between BLOCK_ID AND BLOCK_ID + BLOCKS -1;

 backup check logical datafile  160 format ‘/backup/rman/%U’ tag ‘CORRUPT_BLK_FILE_BKP’;

Se realiza un backup del datafile, hay que tomar en cuenta el numero de saltos que se pueden permitir para que el backup no muestre error:

 run

 {

  set maxcorrupt for datafile 181 to 150;

  backup as copy  datafile 68,160 format ‘+dgarea’;

 }

Luego restauramos el datafile del backup.

 run {

 set newname for datafile 160 to ‘+dgdatos’;

 restore datafile 160 from tag ‘CORRUPT_BLK_FILE_BKP’;

 }

Al consultar, deberia desaparecer las filas para dicho datafile:

select block#||’,’ from v$database_block_corruption   where file#= 160;

select block#||’,’ from v$database_block_corruption   where file#= 68;

Por ultimo, realizamos la recuperacion de los bloques corruptos de la copia que se realizo previamente:

 blockrecover datafile 68 block 846959 FROM DATAFILECOPY;

  RECOVER CORRUPTION LIST;

Y debería desaparecer completamente y tener un datafile totalmente sano en terminos de corrupción de bloques.

  VALIDATE CHECK LOGICAL DATAFILE 68,160;

  select block#||’,’ from v$database_block_corruption   where file#=160;

Espero les sea de utilidad.

Saludos.

Instalación de Oracle Clusterware y Oracle RDBMS 19c en modo Silent

#OracleACEAssociate

#OracleTIPSSV

10 de Agosto de 2023

Raúl Antonio Molina Alvarenga

El objetivo de este articulo no es preparar todos los pasos previos para instalar un cluster, en realidad lo enfoque solo los comandos importantes en la instalación siguiendo el modo que mas me provoca al momento de instalar: MODO NO INTERACTIVO o MODO SILENT.

Procedamos con una hojeada al concepto de Modo Silencioso.

Todos conocemos el famoso instalador de los productos Oracle, el OUI u Oracle Universal Installer, un Software integrado construido en JAVA y con un complemento de scripts en otras lenguajes de programación que Oracle ocupa que permite instalar los productos Oracle en cualquier plataforma; este software permite realizar dicha tarea en forma interactiva.

Ese Instalador puede considerarse pesado o lento en algunas circunstancias, como por ejemplo usarlo via VPN , desde sitios remotos.

La alternativa a dichas situaciones o escenarios, el modo No Interactivo o Silencioso, este modo utiliza el mismo Instalador, solo que no de forma interactivo si no que requiere que se provean todas las respuestas que el programa requiere.

Las respuestas pueden ser puestas en lote en la linea de comandos (lo cual no recomiendo), o usando un archivo de respuesta, o responseFile ( recomendado).

El archivo de respuesta puede obtenerse de 2 formas, el propio instalador tiene algunas plantillas ya incluidas, por ejemplo propio OUI, DBCA, NETCA.

Otra forma es generarlo ejecutando el propio instalador y guardarlo como se muestra en la imagen:

Nuestro archivo de respuesta quedaría de la siguiente forma:

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0

INVENTORY_LOCATION=/u01/app/oraInventory

oracle.install.option=CRS_CONFIG

ORACLE_BASE=/u01/app/grid

oracle.install.asm.OSDBA=oinstall

oracle.install.asm.OSOPER=

oracle.install.asm.OSASM=asmadmin

oracle.install.crs.config.scanType=LOCAL_SCAN

oracle.install.crs.config.gpnp.scanName=rac-scan

oracle.install.crs.config.gpnp.scanPort=1521

oracle.install.crs.config.ClusterConfiguration=STANDALONE

oracle.install.crs.config.configureAsExtendedCluster=false

oracle.install.crs.config.clusterName=rac-cluster

oracle.install.crs.config.gpnp.configureGNS=false

oracle.install.crs.config.autoConfigureClusterNodeVIP=false

oracle.install.crs.config.clusterNodes=nodo1:nodo1-vip,nodo2:nodo2-vip

oracle.install.crs.config.networkInterfaceList=eno16780032:192.168.51.0:1,eno33559296:10.20.0.0:5

oracle.install.crs.configureGIMR=false

oracle.install.asm.configureGIMRDataDG=false

oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE

oracle.install.asm.SYSASMPassword=Oracle123

oracle.install.asm.diskGroup.name=OCR

oracle.install.asm.diskGroup.redundancy=NORMAL

oracle.install.asm.diskGroup.AUSize=4

oracle.install.asm.diskGroup.disksWithFailureGroupNames=ORCL:ASM1,,ORCL:ASM2,,ORCL:ASM3,

oracle.install.asm.diskGroup.disks=ORCL:ASM1,ORCL:ASM2,ORCL:ASM3

oracle.install.asm.diskGroup.diskDiscoveryString=ORCL:*

oracle.install.asm.monitorPassword=Oracle123

oracle.install.asm.gimrDG.AUSize=1

oracle.install.asm.configureAFD=false

oracle.install.crs.configureRHPS=false

oracle.install.crs.config.ignoreDownNodes=false

oracle.install.config.managementOption=NONE

oracle.install.crs.rootconfig.executeRootScript=false

Una vez tenemos definido su contenido, podemos preparar la equivalencia de usuarios en una capa o dos , si vamos a tener Separación de usuarios ( Role Separation Duties).

./sshUserSetup.sh -user grid -hosts “nodo1 nodo2” -noPromptPassphrase

./sshUserSetup.sh -user oracle -hosts “nodo1 nodo2” -noPromptPassphrase

Para ejecutar el instalador:

./gridSetup.sh -silent -waitForCompletion -ignorePrereqFailure -ignoreInternalDriverError -responseFile /home/grid/gi.rsp

Luego hay que estar atentos a las salidas, archivos de logs, salida en pantalla , etc etc.

Después prosigue instalar la capa de rdbms ( Proceder solo si la capa de GI fue satisfactoria).

La muestra de nuestro archivo de respuesta:

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0

oracle.install.option=INSTALL_DB_SWONLY

UNIX_GROUP_NAME=oinstall

INVENTORY_LOCATION=/u01/app/oraInventory

ORACLE_HOME=/u01/app/oracle/product/19.0.0/db_1

ORACLE_BASE=/u01/app/oracle

oracle.install.db.InstallEdition=EE

oracle.install.db.OSDBA_GROUP=oinstall

oracle.install.db.OSOPER_GROUP=oinstall

oracle.install.db.OSBACKUPDBA_GROUP=oinstall

oracle.install.db.OSDGDBA_GROUP=oinstall

oracle.install.db.OSKMDBA_GROUP=oinstall

oracle.install.db.OSRACDBA_GROUP=oinstall

oracle.install.db.rootconfig.executeRootScript=false

oracle.install.db.CLUSTER_NODES=nodo1,nodo2

Y como ultimo paso el lanzamiento del instalador:

./runInstaller  -silent -ignoreInternalDriverError -ignorePrereqFailure -responseFile /home/oracle/db_install.rsp 

Espero les sea de Utilidad.

Saludos!!

Mover Agente de Cloud (OH) de un folder a otro ( o Filesystem).

Raúl Antonio Molina Alvarenga

07 de Agosto de 2023

#OracleACEAssociate

Hola, un día me enfrente a la siguiente situación: Instale un agente de Cloud Control en la ruta equivocada.

Y se nos viene la idea, fácil, lo remueve y lo reinstalo.

Esto podrá ser fácil, pero si puede complicarse si la red es lenta, es un sitio remoto, etc etc.

Y si existe una forma mas fácil, porque no la ejecutamos?, bueno aquí veremos algo que para mi criterio resulta, más fácil.

Usaremos el DOCID:

Que nos provee el script:

ConvertToStandalone.pl

Hay que tener algunas consideraciones con la nota, hay que definir estas 2 variables de SO:

El Home no es el agent_inst es el $OH/core/Version12c
export OLD_AGENT_HOME=/oracle/agent12c/core/12.1.0.5.0
export ORACLE_HOME=/oracle/agent12c/core/12.1.0.5.0

Generamos el plugin list

$OLD_AGENT_HOME/perl/bin/perl /tfs/oracle/agent12c/core/12.1.0.5.0/sysman/install/create_plugin_list.pl -instancehome /tfs/oracle/agent12c/core/12.1.0.5.0

The agent Base Dir is /oracle/agent12c

 Creating file : /oracle/agent12c/rwFile

Removed the /oracle/agent12c/rwFile file.

oracle.sysman.xa|12.1.0.6.0||discoveryPlugin

oracle.sysman.db|12.1.0.8.0||discoveryPlugin

oracle.sysman.emas|12.1.0.8.0||discoveryPlugin

oracle.sysman.oh|12.1.0.5.0||discoveryPlugin

oracle.sysman.oh|12.1.0.5.0||agentPlugin
oracle.sysman.db|12.1.0.8.0||agentPlugin
/oracle/agent12c/plugins.txt
[oracle@nodo ~]$ 

Cambiar archivo agent12c/agentimage.properties  la ultima  linea

SBIN_MODIFIED_VERSION=12.1.0.5.0

$OLD_AGENT_HOME/perl/bin/perl  ConvertToStandalone.pl -instanceHome /oracle/agent12c/agent_inst -newAgentBaseDir /export/home/oracle/agent12c

OUTPUT

Migrating the agent home to different home

Validating the arguments

The log file is /oracle/agent12c/agent_inst/install/logs/convert/convertingtostandalone_2023-07-05_16-29-55.log

The agent image file Exists : /oracle/agent12c/agentimage.properties. Check for value of : VERSION

The current home is /oracle/agent12c/core/12.1.0.5.0Software only install of the agent bits

Home : /home/oracle/agent12c/core/12.1.0.5.0 already exist. Do you want to overwrite the home? Confirm (y/n)y

User confirmed for overwrite.

 The command is cp -r /oracle/agent12c/core /oracle/agent12c/plugins /oracle/agent12c/agentimage.properties /oracle/agent12c/plugins.txt /home/oracle/agent12c 

The command exitcode 0

The command is cp -r /oracle/agent12c/sbin /home/oracle/agent12c 

cp: cannot open ‘/oracle/agent12c/sbin/nmo’ for reading: Permission denied

cp: cannot open ‘/oracle/agent12c/sbin/nmhs’ for reading: Permission denied

cp: cannot open ‘/oracle/agent12c/sbin/nmb’ for reading: Permission denied

The command exitcode 256

Copying of /oracle/agent12c/sbinto /home/oracle/agent12c Failed

The command is /home/oracle/agent12c/core/12.1.0.5.0/oui/bin/runInstaller -clone -forceClone -silent -waitForCompletion -nowait ORACLE_HOME=/home/oracle/agent12c/core/12.1.0.5.0 -noconfig -force EM_PROTOCOL=https ORACLE_HOME_NAME=agent12c -invPtrLoc /oracle/agent12c/core/12.1.0.5.0/oraInst.loc AGENT_BASE_DIR=/home/oracle/agent12c 

The command exitcode 0

The command is /home/oracle/agent12c/core/12.1.0.5.0/oui/bin/runInstaller -attachHome -force -silent ORACLE_HOME=/home/oracle/agent12c/sbin ORACLE_HOME_NAME=sbin12c -waitForCompletion -invPtrLoc /oracle/agent12c/core/12.1.0.5.0/oraInst.loc 

The command exitcode 0

The command is /home/oracle/agent12c/core/12.1.0.5.0/oui/bin/runInstaller -updateHomeDeps -waitForCompletion HOME_DEPENDENCY_LIST={/home/oracle/agent12c/sbin:/home/oracle/agent12c/core/12.1.0.5.0} -invPtrLoc /oracle/agent12c/core/12.1.0.5.0/oraInst.loc  

The command exitcode 0

Converting the agent to standalone

The command is /oracle/agent12c/agent_inst/bin/emctl start blackout AGT_CNT_BLK_OUT -nodeLevel 

The command exitcode 0

The command is /oracle/agent12c/agent_inst/bin/emctl stop agent 

The command exitcode 0

The command is cp -r /oracle/agent12c/agent_inst/* /home/oracle/agent12c/agent_inst 

The command exitcode 0

The command is /home/oracle/agent12c/core/12.1.0.5.0/jdk/bin/java -jar /home/oracle/agent12c/core/12.1.0.5.0/jlib/updateStateDirectory.jar -migrateBase -emStateDir /home/oracle/agent12c/agent_inst -oldAgentHome /oracle/agent12c/core/12.1.0.5.0 -newAgentHome /home/oracle/agent12c/core/12.1.0.5.0 -oldAgentBase /oracle/agent12c -newAgentBase /home/oracle/agent12c 

The command exitcode 0

The command is /home/oracle/agent12c/agent_inst/bin/emctl setproperty agent -name agentStateDir -value /home/oracle/agent12c/agent_inst 

The command exitcode 0

The command is /home/oracle/agent12c/core/12.1.0.5.0/perl/bin/perl /home/oracle/agent12c/core/12.1.0.5.0/bin/AgentPluginDeploy.pl -oracleHome /home/oracle/agent12c/core/12.1.0.5.0 -agentDir /home/oracle/agent12c -pluginIdsInfoFile /home/oracle/agent12c/plugins.txt -action upgrade -emStateDir /home/oracle/agent12c/agent_inst -ignoreUnzip -dont_restart   

The command exitcode 0

The command is /home/oracle/agent12c/agent_inst/bin/emctl update_inventory plugin 

The command exitcode 0

The command is /home/oracle/agent12c/core/12.1.0.5.0/jdk/bin/java -jar /home/oracle/agent12c/core/12.1.0.5.0/jlib/upgradeCollections.jar -emStateDir /home/oracle/agent12c/agent_inst -newPluginXml /home/oracle/agent12c/core/12.1.0.5.0/sysman/admin/agentLib.xml -oldPluginXml /oracle/agent12c/core/12.1.0.5.0/sysman/admin/agentLib.xml 

log4j:ERROR No appenders could be found for category (oracle.sysman.gcagent.util.logging.ODLLogging).

log4j:ERROR Please initialize the log4j system properly.

The command exitcode 0

The command is /home/oracle/agent12c/agent_inst/bin/emctl start agent 

The command exitcode 0

The command is /home/oracle/agent12c/agent_inst/bin/emctl stop blackout AGT_CNT_BLK_OUT  

The command exitcode 0

The command is mv /oracle/agent12c/agent_inst/bin/emctl /oracle/agent12c/agent_inst/bin/emctl_converted 

The command exitcode 0

Move of File :  /oracle/agent12c/agent_inst/bin/emctl to File : /oracle/agent12c/agent_inst/bin/emctl_converted is successfully done

Modifying the oragchomelist to include the current agent home with the instancehome

The migration is completed Successfully. Run /home/oracle/agent12c/core/12.1.0.5.0/root.sh as root user manually.

Deinstall agent home /oracle/agent12c/core/12.1.0.5.0 manually.

[oracle@nodo ~]$ exit

logout

Ejecutamos el script de root de nuevo:

[root@nodo ~]# /home/oracle/agent12c/core/12.1.0.5.0/root.sh

Con esto el agente de movio de folder a un nuevo directorio.

Espero les sea de Utilidad

Saludos

Adenda de despliegue, cuando se debe forzar el HOSTNAME

EM 12c: Agent installation reports failure for Hostname pre-requisite check – “The host name specified for the installation or retrieved from the system is incorrect” (Doc ID 1488737.1)
/agentDeploy.sh AGENT_BASE_DIR=<Agent Base Directory Path> OMS_HOST=<OMS Host Name> EM_UPLOAD_PORT=<OMS Upload Port> ORACLE_HOSTNAME=mypc.oracle.com