Mostrando entradas con la etiqueta Oracle Database. Mostrar todas las entradas
Mostrando entradas con la etiqueta Oracle Database. Mostrar todas las entradas

11 noviembre 2016

Java Forensics en bases de datos Oracle

Esta vez quiero mostrar cómo determinar si los ataques de privilegio de Java se han producido en su base de datos, tanto como medida de precaución como para el análisis forense después del incidente, con el fin de verificar si un ataque de esta naturaleza ha ocurrido o no.

En primer lugar veamos la situación en la que un atacante utiliza DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY para concederse a sí mismos cualquier privilegio Java de CREATE SESSION debido a ejecutar DBMS_JVM_EXP_PERMS.

Si su base de datos está recogiendo mensajes de error a continuación, busca errores del tipo ORA-29532:

SQL> DECLARE  
  2  POL DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY;  
  3  CURSOR C1 IS SELECT 'GRANT','JAVATEST','SYS','java.io.FilePermission','$','execute',
                        'ENABLED' FROM DUAL;  
BEGIN  
OPEN C1;  
  4    5  FETCH C1 BULK COLLECT INTO POL;  
  6  CLOSE C1;  
DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS(POL);  
  7    8  END;  
  9  / 10  
DECLARE  
*  
ERROR at line 1:  
ORA-29532: Java call terminated by uncaught Java exception:  
java.lang.SecurityException: policy table update java.lang.RuntimePermission,  
loadLibrary.*  
ORA-06512: at "SYS.DBMS_JVM_EXP_PERMS", line 189  
ORA-06512: at line 8 
La escalada de privilegios aún ha tenido éxito por lo que el mensaje de error es un poco engañoso, pero podría ser un indicador útil.

SQL>  SELECT TYPE_NAME, NAME, ACTION FROM USER_JAVA_POLICY WHERE GRANTEE_NAME ='JAVATEST';  
  
TYPE_NAME  
--------------------------------------------------------------------------------  
NAME  
--------------------------------------------------------------------------------  
ACTION  
--------------------------------------------------------------------------------  
java.io.FilePermission  
 $ 
execute  

Vamos a centrarnos en la identificación de la escalada de privilegios de Java. 
Una vez que se han asignado privilegios de Java existen múltiples formas de utilizar el privilegio de ganar SYSDBA, y una vez adquirido, el atacante tendría limpiar el rastro que habían dejado atrás, primero instalando un rootkit, y luego revocar privilegios y eliminando las cuentas que se crearon en el camino. 

Así, el reto de un investigador forense es buscar pistas que un atacante puede no haber sido lo suficientemente diligente para limpiar. 

Así, en primer lugar, ¿cómo podemos saber si un usuario se ha concedido privilegios Java? DBA_JAVA_POLICY es la vista fundamental, y esto muestra amablemente todos los privilegios concedidos por orden cronológico de Java utilizando el número de secuencia de incrementar…


SELECT TYPE_NAME, NAME, ACTION FROM USER_JAVA_POLICY WHERE GRANTEE_NAME ='JAVATEST';  
  
TYPE_NAME  
--------------------------------------------------------------------------------  
NAME  
--------------------------------------------------------------------------------  
ACTION  
--------------------------------------------------------------------------------  
java.io.FilePermission  
ALL FILES
execute 
Así que si un atacante sabe esto, es probable que ha ga drop de a cuenta de ataque y lo recrea si es necesario como parte de un ataque posterior. Sin embargo, si nos fijamos en la tabla base sys.java $ policy $ para la vista DBA_JAVA_POLICY, veremos que la tabla realmente persiste en las concesiones de Java, incluso después de que el usuario haya sido eliminado !!! Esto es útil para una investigación posterior a incidentes.


SELECT * FROM sys.java$policy$ ORDER BY key DESC;  
  
KIND#   GRANTEE#    TYPE_SCHEMA#    TYPE_NAME   NAME    ACTION  STATUS# KEY  
-----------------------------------------------------------------------------------------------------  
0   101 0   java.io.FilePermission  ALL FILES   execute 2   282  
0   100 0   java.io.FilePermission  ALL FILES   execute 2   262  
0   54  0   java.io.FilePermission  ALL FILES   execute 2   242  
  
--Note that the GRANTEE# correlates to the sys.user$.USER# column and we can see   
-- that user 101 and 100 both had execute on ALL FILE   
-- ,but these users no longer exist in sys.user$ and still the privs are recorded in sys.java$policy$ ~which could be very useful info..  
  
SQL> select name from sys.user$ where user# in (101, 100);  
  
no rows selected  
  
SQL> select name from sys.user$ where user# in (54);  
  
NAME  
------------------------------  
SCOTT  
  
--Of course a clever attacker that had gained SYS could delete from the base table..  
  
SQL> delete from sys.java$policy$ where key='242';  
  
1 row deleted.  
  
SQL> commit;  
  
Commit complete.  
  
--And the evidence of the escalation has gone.. How would an investigator see that the table had been modified in this case?   
--Tracing back further it would hopefully be possible to use the dba_tab_modifications view:  
  
SQL> SELECT * FROM dba_tab_modifications WHERE table_name='JAVA$POLICY$'  
  2  ;  
  
no rows selected  
--This empty result set is due to the fact that MONITORING is not set on this table by default. This could be rectified as follows in this example.  
SQL> exec dbms_stats.gather_table_stats ('SYS','JAVA$POLICY$');  
  
PL/SQL procedure successfully completed.  
  
SQL> delete from sys.java$policy$ where key='282';  
  
0 rows deleted.  
  
SQL>  delete from sys.java$policy$ where key='242';  
  
1 row deleted.  
  
SQL> execute dbms_stats.flush_database_monitoring_info;  
  
PL/SQL procedure successfully completed.  
  
SQL> SELECT * FROM dba_tab_modifications WHERE table_name='JAVA$POLICY$';  
  
TABLE_OWNER     TABLE_NAME      PARTITION_NAME      SUBPARTITION_NAME  INSERTS    UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS  
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ----------   
SYS                 JAVA$POLICY$                                           0          0          1        31-MAR-10 NO              0  
  
--It is unlikely that a DB will have had this default setting changed beforehand though..   
--So what else can be done to see if the DBA_JAVA_POLICY table has been changed recently?  
  
SQL> select scn_to_timestamp(Max(ora_rowscn)) from sys.java$policy$;  
  
SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN))  
-----------------------------------------------------  
30-MAR-10 06.10.06.000000000 PM  

Nota: esta consulta normalmente trabajará hasta 7 días después de que el cambio haya ocurrido, por lo que si obtiene este error ORA-08181 la tabla probablemente no ha tenido comandos de manipulación de datos (DML) en él durante ese tiempo.

ORA-08181: specified number is not a valid system change number

07 noviembre 2016

ORACLE DATABASE 12C IN-MEMORY, ¿es la respuesta de Oracle a SAP Hana?

Oracle presentó, hace algún tiempo, Oracle Database In-Memory, una nueva opción adicional a Oracle Database Enterprise Edition 12c, en respuesta al nuevo empuje hacia la industria de bases de datos residentes en memoria que ofrecen otros proveedores tanto  IBM (DB2 10.5 with BLU Acceleration) como SAP (Hana).

Comparativa Oracle vs SAP

Necesidad de negocio a cubrir
Oracle Database In-Memory
SAP HANA
¿Trabaja de manera contra aplicaciones de inteligencia de negocio previamente existentes y herramientas de "reporting"?
100 por ciento compatible con todas las herramientas Oracle y herramientas (ISV)  además de aplicaciones personalizadas por el cliente.
Mucho menos funcionalidad. Requiere nuevas aplicaciones o el registro de las aplicaciones existentes.
¿Es compatible with cloud computing, big data y data warehousing?
No hay límite de tamaño de la base de datos; utiliza dinámica de acceso aleatorio memoria (DRAM), flash, y el disco de forma transparente. No hay un gasto excesivo en el almacenamiento ya que los usuarios no tienen que poner toda su base de datos en la DRAM.
La base de datos entera debe encajar en la memoria DRAM que es costosa, y los datos que residen en sistemas DW  o en Big Data
 no caben. También consolidación de la base de datos de nube no es factible.
SAP afirma que los usuarios pueden combinar HANA con otras bases de datos como Sybase para migrar los datos desde y hacia HANA, pero esto es una arquitectura frágil, compleja y lenta.
¿Asegura la disponibilidad del dato y su seguridad?
La arquitectura de máxima disponibilidad de la base de datos Oracle  se hereda en Oracle  en memoria, mitigando las interrupciones planificadas o no. la duplicación de memoria evita el tiempo de inactividad en caso de fallo de nodo.
Al se un producto inmaduro las  funciones de alta disponibilidad faltan, por lo que lo  hacen que el tiempo de inactividad inevitable. Sin rápida recuperación de fallo de un nodo. falla de seguridad es un agravante.
¿Necesidades especiales de hardware o condiciones limitantes?
Base de Datos Oracle en memoria funciona en cualquier plataforma que ejecuta Oracle 12c de base de datos.
HANA sólo funciona en SAP en equipos informático que cuenten con la certificación  HANA basados en arquitecturas x86 . Los clientes no pueden hacer funcionar HANA en equipos no certificados.
 ¿Aprovecha el talento de de los elementos de la plantilla IT existentes (DBAs, desarrolladores)?
No se requieren nuevas APIs y los nuevos comandos DBA son mínimos, lo que hace de la base de datos Oracle en memoria algo trivial de implementar y mantener.
Debido a que Hana es una nueva "plataforma" se necesita formación para el equipo que explote esta plataforma.
¿Es escalable tanto para aplicaciones de análisis de datos o OLTP?
Base de Datos Oracle en memoria de formato dual, único que  permite la escala transparente tanto para el análisis y las cargas de trabajo OLTP corriendo juntos.
HANA utiliza un formato de columna para análisis de alto rendimiento, que tiene limitaciones arquitectónicas severas para el rendimiento y la escalabilidad OLTP.

En contraste En contraste con la bases de datos relacionales organizadas por filas, almacenadas en disco, un nuevo concepto se extendía a lo largo de los círculos académicos. Capitalizando esta tendencia y con la ayuda de unas pocas adquisiciones, principal competidor de aplicaciones empresariales tradicionales de Oracle, SAP comenzó a apostar por su propia base de datos de memoria llamada HanaMientras que SAP siempre ha sido el líder del mercado en el segmento de ERP, los clientes de SAP suelen optar por Oracle como base de datos back-end para sus aplicaciones SAP.
Ahora se está dibujando otro ecosistema para una instalación de SAP ERP:

  • Base de datos: SAP Hana
  • Middleware: SAP NetWeaver

Con todo este panorama, Oracle respondió introduciendo una capacidad revolucionaria, con una memoria caché residente columna que trabaja en conjunto con su caché fila tradicional.

Las bases de datos se suelen almacenar en discos que giran, en formato de fila y los conjuntos de datos activos se leen en la memoria basada en las memorias caché en hileras, donde los datos están protegidos por el registro de transacciones, mientras que los usuarios de negocios interactuaron a través de las aplicaciones empresariales. El rendimiento de base de datos se incrementó con los avances en el hardware, como las tecnologías de flash y el aumento de la capacidad de DRAM. Si bien esta arquitectura funcionó bien para manipulaciones de datos con sistemas OLTP y obtuvo buenos resultados para el análisis de consultas que impliquen estructuras de datos con un pequeño número de filas y el gran número de columnas. 

No estaba a la altura de almacenamiento de datos con los sistemas OLAP que lleva a cabo el análisis complejo multidimensional un gran número de filas con unas pocas columnas. Debido a esto, se tomó la costumbre de separar los sistemas de análisis,  de sistemas transaccionales cosa que hacía que diseñar un sistema de toma de decisiones fuera prácticamente imposible.


¿Que paso?

Mientras que Oracle dominaba el mercado RDBMS, otros proveedores se aprovecharon de esta oportunidad para proporcionar las bases de datos analíticas especializadas para el almacenamiento de datos, como NCR Teradata e IBM Netezza. El costo de memoriDRAM cayó, algunos proveedores, especialmente SAP, introducen nuevas tecnologías de bases de datos diseñadas para ejecutar bases de datos completas en memoria con las estructuras de datos de columna organizada. Si bien este enfoque aumenta el rendimiento de consulta de múltiples órdenes de magnitud, el rendimiento transaccional se vio afectado negativamente. SAP Sybase propuso utilizar para la transformación y carga de datos de columna organizada transaccionales en Hana para el procesamiento analítico de alto rendimiento. IBM y algunos otros jugadores de nicho también se unieron en la búsqueda para el diseño de bases de datos en memoria.

Respuesta de Oracle

Oracle se tomó un tiempo para hacer un movimiento agresivo, para proteger su producto estrella Con la arquitectura existente de Oracle completamente intacta, incluyendo la caché de fila y los mecanismos de registro de transacciones, Oracle ha diseñado una nueva caché columna que sólo existía en memoria. Como los datos organizada fila se lee desde el disco, Oracle rellena simultáneamente ambas memorias caché: 

  • Caché de fila 
  • Caché de columna

Con lo que mantiene dos copias de los datos en memoria: una fila organizada y la otra columna organizada
A continuación, el optimizador de consultas utiliza automáticamente la caché adecuado para satisfacer cada tipo de consulta, con capacidad para dos tipos de consultas dentro de una única base de datos, manteniendo al mismo tiempo la integridad transaccional a través de ambas cachés. Cuando se consulta la caché de la columna, Oracle utiliza aceleradores de hardware de vectores en las CPU para procesar conjuntos de datos completos en una sola operación atómica. En entornos RAC, cachés de la columna se copian en los nodos de alta disponibilidad. Mediante el uso de esta arquitectura, todas las funciones de base de datos anteriores continuaron el trabajo, que no requiere cambios en las aplicaciones para utilizar la caché de la columna en memoria.
Para utilizar la base de datos en memoria, todo lo que necesita es de dos sencillos pasos:

  • En primer lugar, establecer el tamaño de la caché de columna utilizando un parámetro de inicialización.
  • En segundo lugar, marcan todas las tablas y particiones para almacenar en caché utilizando un flag DDL. En este punto, las consultas se ejecutarán desde 100 a 1000 veces más rápido.

Puede mejorar aún más el DML (SQL de manejo de datos) eliminando todos los índices, excepto:

  • clave primaria
  • clave externa
  • los índices de clave de referencia

con lo que se duplicará el rendimiento transaccional.

Bonus article: El seguimiento de las instrucciones de DDL en las tablas de base de datos Oracle en caché

Cuando se emite una instrucción DDL en una tabla de base de datos Oracle en caché, esta declaración puede ser rastreado en la tabla de base de datos TT_version_DDL_L. Inmediatamente el trigger TT_version_schema-ID_DDL_T se dispara para insertar una fila en la tabla, donde la versión es un número interno de TimesTen (el producto de que deriva Oracle database caché)  y el esquema-ID es el ID de usuario al que pertenece la tabla de base de datos Oracle en caché. 

Un trigger se crea para cada usuario de base de datos Oracle que posee tablas en caché. Una tabla de seguimiento DDL se crea para almacenar instrucciones DDL emitidos en cualquier tabla de base de datos Oracle en caché. El usuario de administración de caché es propietaria de la tabla TT_version_DDL_L y el trigger TT_version_schema-ID_DDL_T.
sql
Por defecto, las sentencias DDL no realizan un seguimiento, para poder hacer lo e ha de hacer o siguiente:
  • Llamar al procedimiento almacenado ttCacheDDLTrackingConfig como el usuario administrador de caché. 

% ttIsql "DSN=cachealone1;UID=cacheuser;PWD=timesten;OraclePWD=oracle"
SQL> CALL ttCacheDDLTrackingConfig('enable');


04 noviembre 2016

¿Certificarte en Oracle? Aquí tienes su portfolio de certificaciones en Oracle

Con mi reciente estado laboral, he estado mirando varias certificaciones en bases de datos y como no, Oracle y MySQL son mis favoritas.
Aquí os dejo todas las que hay y señaladas en amarillo, las que planeo realizar, comenzando por SQL y PLSQL 

·         Database Application Development
o    Oracle Application Express (Oracle APEX)

o    SQL y PL/SQL

·         MySQL
o    MySQL Database Administration

o    MySQL Developer

·         Oracle Database
o    Database Cloud

o    Oracle Database 11g

o    Oracle Database 12c

o    Oracle Spatial 11g

21 enero 2015

Tip: Límites físicos de una Base de datos Oracle

Para aquellos que desean poner al límite una base de datos Oracle 11g y 12c, con motivos perversos, claro.

"El único límite para nuestra comprensión del mañana serán nuestras dudas del presente."
Franklin Delano Roosevelt 


Item
Tipo of Limite
Valor para Oracle 11g R2-12g R1
GROUP BYclause
Maximum length
The GROUP BY expression and all of the no distinct aggregate functions (for example, SUMAVG) must fit within a single database block.
Indexes
Maximum per table
Unlimited
Indexes
Total size of indexed column
75% of the database block size minus some overhead
Columns
Per table
1000 columns maximum
Columns
Per index (or clustered index)
32 columns maximum
Columns
Per bitmapped index
30 columns maximum
Constraints
Maximum per column
Unlimited
Subqueries
Maximum levels of subqueries in a SQL statement
Unlimited in the FROM clause of the top-level query
Partitions
Maximum length of linear partitioning key
255 subqueries in the WHERE clause
Partitions
Maximum number of columns in partition key
4 KB - overhead
Partitions
Maximum number of partitions allowed per table or index
16 columns
Subpartitions
Maximum number of subpartitions in a composite partitioned table
1024K - 1
Rows
Maximum number per table
Unlimited
System Change Numbers (SCNs)
Maximum
281,474,976,710,656, which is 281 trillion SCNs
Stored Packages
Maximum size
PL/SQL and Developer/2000 may have limits on the size of stored procedures they can call. The limits typically range from 2000 to 3000 lines of code.
Trigger Cascade Limit
Maximum value
Operating system-dependent, typically 32
Users and Roles
Maximum
2147483638
Tables
Maximum per clustered table
32 tables
Tables
Maximum per database
Unlimited