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

18 enero 2015

Oracle 12cR1 novedades (Parte II); Columnas Identidad



Oracle 12c Nueva característica – Columnas Identidad

Viendo las nuevas características de la versión 12c, encontré que ahora podemos definir una columna con el  tipo de dato Identity, tal como lo tiene desde hace tiempo IBM DB2, en concreto desde la versión 8.0, de la siguiente manera:

SQL>CREATE TABLE table (col1 INT,col2 DOUBLE,col3 INT NOT NULL GENERATED ALWAYS AS IDENTITY;
(START WITH 100, INCREMENT BY 5))

Que significa una columna Identity?
Es incorporar a una columna la propiedad de ser auto numérica.


COLUMN_NAME  GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ]AS                                  
  IDENTITY  [ ( identity_options ) ]

Donde

  • ALWAYS      Indica que no será necesario introducir un valor para esta columna en una sentencia insert. Por el contrario indicar un valor aunque sea Null, da un error ORA-32795.
  • BY DEFAULT  Le permite utilizar Identity, si la columna no se hace  referencia en la una sentencia insert, pero si se hace referencia a la columna, el valor especificado se utiliza en lugar de la  identidad. El intento de especificar el valor NULL en este caso se traduce en un error, ya que las columnas de identidad son siempre NOT NULL. 
  • BY DEFAULT [ON NULL]: Si en una sentencia INSERT se mete un valor NULL, esta se generará un nuevo valor, si en cambio si mete un valor para esta columna, se insertará el valor de la sentencia.
Contras al implementar esta característica
  1. Dado a que una columna definida como IDENTITY está vinculada a una secuencia, le ocurre lo mismo que si la secuencia se define por fuera, por lo cual si una sentencia INSERT abortara, los números de la secuencia se perderían.
  2. En el caso de hacer una copia de seguridad de una tabla, se exportaría con todos sus valores, la querer importar esa tabla. 
  • Solución: Deberíamos tener en cuenta que la columna IDENTITY  este en by default porque en caso contrario daría error.
Conclusión 
La inclusión de las columnas IDENTITY, es un importante avance, ya que encapsula en una sentencia INSERT la obtención del nextval de la secuencia. Como ocurre con IBM DB2 o M$ SQL Server.

Por otro lado la inclusión de las opciones By Default y By Default On Null, permiten que los valores puedan ser internos o externos. Lo más importante es que esto lo hacemos casi sin que perdamos performance.

Mi opinion
Esta es una característica poco aseada que se ha introducido unos 20 años tarde. En mi opinión, que fácilmente podría haber sido implementado en Oracle 6.0. Podría ser útil para nuevas aplicaciones, aunque la cantidad de tiempo y esfuerzo ahorrado es insignificante. Para las aplicaciones existentes de la relevancia de esta nueva característica es más cuestionable;´Nadir va a mezclar estilos de codificación y modificar código funcional, por una característica que apenas aporta nada.

Oracle 12cR1 novedades (Parte I); Columnas Invisibles



Oracle 12cR1 – Columnas Invisibles


La primera de las Nuevas Características de Oracle 12c que vamos a traer a este blog son las columnas invisibles. Es una de las opciones menos controvertidas y mas sencillas de explicar.

La idea básica de las columnas básicas es que ellos permiten ser ocultadas desde las aplicaciones.  Las columnas se pueden hacer invisibles en la sentencia CREATE TABLE o posteriormente utilizando una sentencia ALTER TABLE. Por defecto columnas son visibles. Columnas invisibles pueden hacerse visibles de nuevo utilizando una sentencia ALTER TABLE.

¿Como funciona todo esto?

El siguiente ejemplo crea una tabla con una columna invisible:
SQL> CREATE TABLE ejemplo1
(
  c1 NUMBER,
  c2 NUMBER INVISIBLE,
  c3 NUMBER,
  c4 NUMBER
);

SQL> DESC ejemplo1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------
 C1                                                 NUMBER
 C3                                                 NUMBER
 C4                                                 NUMBER

SQL*Plus puede opcionalmente mostrar columnas implementando la opción COLINVISIBLE.
SQL> SET COLINVISIBLE ON

SQL> DESC ejemplo1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------
 C1                                                 NUMBER
 C3                                                 NUMBER
 C4                                                 NUMBER
 C2 (INVISIBLE)                                     NUMBER

A pesar de que la columna es invisible, en esa columna todavía se pueden visualizar y modificar. Por ejemplo:

SQL> INSERT INTO ejemplo1 (c1,c2,c3,c4) VALUES (11,12,13,14);

1 row created.
SQL> SELECT c1,c2,c3,c4 FROM ejemplo1;

        C1         C2         C3         C4
---------- ---------- ---------- ----------
        11         12         13         14

Mirad, que en el ejemplo superior, todas las columnas son listadas tanto en las sentencias INSERT y SELECT. Que ocurre si omitimos los nombres de las columnas en la sentencia INSERT?

INSERT INTO ejemplo1 VALUES (21,22,23,24)
            *
ERROR at line 1:
ORA-00913: too many values

La sentencia INSERT falla por que estamos intentando meter ina columna invisible en la columna (C2). Si nosotros lo intentamos otra vez omitiendo para C2 la sentencia INSERT será correcta:


SQL> INSERT INTO ejemplo1 VALUES (21,22,24);

1 row created.

SQL> SELECT c1,c2,c3,c4 FROM ejemplo1;

        C1         C2         C3         C4
---------- ---------- ---------- ----------
        11         12         13         14
        21                    22         24

Observa que el valor para C2 es NULL para cada fila encontrada. SELECT * no devuelve las columnas invisibles. Por ejemplo:

SQL> SELECT * FROM ejemplo1;

        C1         C3         C4
---------- ---------- ----------
        11         12         14
        21         22         24

Una columna invisible puede ser visible de nuevo, por ejemplo:
ALTER TABLE ejemplo1 MODIFY c2 VISIBLE;

Una columna visible puede ser invisible, por ejemplo:

ALTER TABLE ejemplo1 MODIFY c2 INVISIBLE;

Tip Shell UNIX: Comandos divertidos (Parte III)



Aquí está la tercera lista que compilé de comandos UNIX que devuelven mensajes de error ingeniosas .
Algunos de los comandos no devuelven los mismos mensajes de error , dependiendo de qué sistema operativo se está ejecutando (es decir, HP / UX , Ultrix , Oracle Solaris. ). A Divertirse!



% mkdir yellow_pages; cat > yellow_pages
yellow_pages: Is a directory 
%touch me
%chmod 000 me
%touch me
touch: cannot touch me: permission denied 
% ar x "my love life"
ar: my love life does not exist 
% ar x "matey, the treasure"
ar: matey, the tresure does not exist 
make "bottle open"
make "heads or tails of all this"
make love
make mistake
make sense
man woman
man -kisses dog 
% echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
GET A LIFE! 
% ping elvis.rice.edu | awk '{print substr($1,1,5), $2, $3}'
elvis is alive 
% finger body-of-christ@bread-jar.mass
Unknown host 
% finger huge-keg-party@big-house
Unknown host 
% make ' ' bang ' ' with gun
make: Fatal error: Don't know how to make target ` '

Tip Shell UNIX: Comandos divertidos (Parte II)



Aquí está la segunda lista que compilé de comandos UNIX que devuelven mensajes de error ingeniosas .
Algunos de los comandos no devuelven los mismos mensajes de error , dependiendo de qué sistema operativo se está ejecutando (es decir, HP / UX , Ultrix , Oracle Solaris. ). A Divertirse!



% alias alias alias
alias: Too dangerous to alias that. 
% cat catfood
cat: cannot open catfood 
% cat "food in cans"
cat: can't open food in cans 
% nice man woman
No manual entry for woman. 
% man p***y
No manual entry for p***y. 
% rm God
rm: God nonexistent 
% ar r God
ar: creating God 
% Unmatched ".
Unmatched ". 
% write desert
desert is not logged on. 
% man you
No manual entry for you. 
% !bluemoon
bluemoon: Event not found. 
% scan for <<"Arnold Schwarzenegger"^J^D
"Arnold Schwarzenegger": << terminator not found 
% cat 'the can of tuna'
cat: cannot open the can of tuna 
% cat "door: paws too slippery"
cat: cannot open door: paws too slippery 
% look into "my eyes"
look: cannot open my eyes 
% lost
lost: not found 
% make war
Make: Don't know how to make war. Stop. 

Tip Shell UNIX: Comandos divertidos (Parte I)



Aquí está la primera lista que compilé de comandos UNIX que devuelven mensajes de error ingeniosas . Algunos de los comandos no devuelven los mismos mensajes de error , dependiendo de qué sistema operativo se está ejecutando (es decir, HP / UX , Ultrix , Oracle Solaris. ). A Divertirse!



% make fire
Make: Don't know how to make fire. Stop. 
% why not?
No match. 
% gotta light?
No match. 
% !1984
1984: Event not found. # (on some systems) 
% How's my lovemaking?
Unmatched '. 
% "How would you rate Mariano Rajoy's incompetence?
Unmatched ". 
% [Where is Jimmy Hoffa?
Missing ]. 
% [Where is my brain?
Missing ]. 
% ^How did the sex change^ operation go?
Modifier failed. 
% ^How did the sex change operation go?
Bad substitute. 
% If I had a ( for every $ Congress spent, what would I have?
Too many ('s. 
% man: why did you get a divorce?
man:: Too many arguments. 
% %blow
%blow: No such job. 
% \(-
(-: Command not found. 
% sh
$ PATH=pretending! /usr/ucb/which sense
no sense in pretending! 
$ mkdir matter; cat >matter
matter: cannot create 
% cd /tmp
% touch this; chmod 000 this
% ln -s /usr/bin/touch U
% U this
U: cannot touch this: no write permission 
% rm meese-ethics
rm: meese-ethics nonexistent 
% cd ~god
Unknown user: god. 
% ar m God
ar: God does not exist 
% make love
Make: Don't know how to make love. Stop. 
% sleep with me
bad character 
% ^What is Sacarina?
Bad substitute. 
% drink bottle: cannot open
opener: not found 

27 agosto 2014

ASO y HSM Wallet (Parte 1 de 2)

En el anterior artículo hablamos de cifrar datos mediante el uso de una fichero que almacena nuestra clave maestra (wallet), ahora veremos como asegurar ese fichero para, evitar ataques, es una capa más para tener mayores garantías de que nuestros datos están asegurados. 

Mini guía de Integración de Oracle Database con HSM Thales ncipher
Debido a anteriores experiencias laborales, estuve trabajando con esta tecnología, integrando los HSM de mi anterior compañía, Thales, con las Bases de Datos Oracle. HSM son las siglas de "Hardware Security Module" (Módulo de Seguridad Hardware).


Un HSM es un dispositivo criptográfico basado en hardware que genera, almacena y protege claves criptográficas y suele aportar aceleración hardware para operaciones criptográficas. Estos dispositivos pueden tener conectividad SCSI / IP u otras y aportar funcionalidad criptográfica de clave pública (PKI) de alto rendimiento que se efectúa dentro del propio hardware.


Oracle Database 11g Release 2 TDE cifra de forma transparente los datos que se almacenan en la base de datos Oracle, sin requerir ningún cambio de código en la aplicación que se ejecuta. Es compatible tanto con TDE cifrado de tabla y columna de cifrado TDE. El HSM asegura la clave maestra para cifrar tablespaces y tablas.

El HSM es usado en lugar del fichero Oracle Wallet para proveer un más alto nivel de garantía de seguridad, incluyendo:
  • Almacenamiento centralizado y gestión de las claves maestras. El fichero de clave ya no está en servidor de base de datos, reside en el hardware.
  • Gestión del ciclo de vida completo de la clave (s) de cifrado principal.
  • Mayor nivel de garantía de la seguridad, las claves nunca se almacenan en el dispositivo como texto plano.
  • Certificación FIPS 140-2 level 3 en el hardware. Añade resistencia a la intrusión física con fines de desmontaje o modificación, de manera que dificulta al máximo los ataques. Si se detecta la intrusión, el dispositivo debe ser capaz de borrar los parámetros de seguridad críticos. El Nivel 3 también incluye protección criptográfica eficaz y administración de claves, autenticación basada en la identidad y separación física o lógica entre las interfaces a través de las que se accede a los parámetros de seguridad crítica y se sale de ellos.
  • Soporte de fallos.

 Dependiendo de cómo esté tu instalación de la base de datos esta pequeña guía servirá para:
  • Crear e inicializar un nuevo Wallet protegido mediante un dispositivo HSM. Si no tienes ninguna tabla o tablespace cifrado.
  • Migrar de un Oracle Wallet, que actualmente cifra tablas y tablespaces a un Wallet protegido mediante un HSM.

Al utilizar Oracle TDE, Yo recomiendo utilizar un fichero Wallet separada para almacenar la clave de cifrado principalLa integración entre el HSM y Oracle TDE utiliza la API criptográfica PKCS # 11. La integración ha sido probado con éxito en, y sólo se admite en las siguientes configuraciones:


Para integrar Oracle Database 11g Release 2 TDE con un HSM tendremos que pasar por las siguientes fases:
  • Instalar Oracle Database 11g Release 2 y aplicar los correspondientes parches.
  • Instalar el dispositivo HSM.
  • Instalar el software de soporte y configurar el HSM.
  • Configurar Oracle Database 11g Release 2 TDE para usar el HSM.

Nos centraremos únicamente en la configuración de la base de datos, dado, que los otros pasos se salen del ámbito de esta guía, instalar la base de datos es algo trivial y lo relacionado con los HSM de Thales  se salen de ámbito de este blog, para cualquier duda al respecto, deberéis consultar la web del fabricante, o consultar a algún experto.

Configurar Oracle Database 11g Release 2 TDE para usar el HSM


Copiar la librería  PKCS #11 localizada en  /opt/nfast/toolkits/pkcs11/libcknfast-64.so (o libcknfast.so dependiendo de la arquitectura de tu Sistema operativo) a una de las siguientes localizaciones dependiendo del sistema operativo:

    • Red Hat Enterprise Linux 5 (x86) /opt/oracle/extapi/32/hsm/libcknfast.so
    • Solaris 10 SPARC (64-bit) /opt/oracle/extapi/64/hsm/libcknfast-64.so
    • IBM AIX (PPC64) /opt/oracle/extapi/64/hsm/libcknfast-64.so
Asegúrese de que el directorio existe y que oracle: oinstall es el propietario:grupo del
directorio con acceso de lectura.

Agregue el usuario oracle al grupo nFast. Puede verificar esta adición al ver la entrada correspondiente el grupo nFast en /etc/group.

En el archivo $TNS_ADMIN /sqlnet.ora  añadir o editar las líneas siguientes, dependiendo de si está migrando desde un Oracle wallet:


Autentícate en la base de datos usando uno de estos comandos:
  • Si estás en la shell con UNIX: sqlplus / as sysdba
  • Si estás en SQL*Plus: connect / as sysdba

Cree la clave de cifrado principal dentro del HSM usando uno de los siguientes comandos, dependiendo de cómo desea proteger la clave y si está migrando desde un Oracle wallet:

Protección mediante una tarjeta del juego de operador de HSM (OCS):


Protección de clave OCS requiere una tarjeta OCS para ser insertada en la ranura del módulo. Debe Especificar el nombre de la tarjeta OCS después de la clave de esta,  para identificar una tarjeta OCS en particular en el dominio de seguridad del HSM. 
En el archivo cknfastrc, debe establecer CKNFAST_LOADSHARING = 1

Protección mediante una tarjeta "soft", tarjeta virtual:

Protección de clave soft debe especificar el nombre de la tarjeta soft después de la clave de esta, en el archivo cknfastrc, debe establecer CKNFAST_LOADSHARING = 1

Protección solo HSM:



Esta forma admite cualquier clave dada, únicamente ha de ser alfanumérica de 8 dígitos, en el archivo cknfastrc, debe establecer CKNFAST_FAKE_ACCELERATOR_LOGIN=1


ASO y Oracle Database Vault (Prueba de concepto)

Hasta ahora hemos intentado cubrir ataques externos que vulneren la confidencialidad de nuestros datos, por eso ciframos los datos almacenados, mediante ka tecnología TDE de Oracle, pero la amenaza interna es la mas peligrosa y los DBAs, se han convertido por, culpa de algunos ejemplos de mala praxis, en fuente de inseguridad. Las regulaciones como Sarbanes-Oxley (SOX), la Ley de Portabilidad y Responsabilidad de Seguros de Salud (HIPAA), Basilea II y PCI-DSS tienen temas comunes que incluyen controles internos, separación de tareas y estrictos controles de acceso a la información sensible



Un buen CISOque los hay, recomendaría usar políticas severas de auditorias a los superusuarios, como sysdba y sysadmin y para evitar a priori cualquier tentación recomendaría usar Oracle Database Vault, este producto brinda controles de seguridad flexible, transparente y altamente adaptable sin realizar cambios en la aplicación.

Pero Oracle Database Vault y la opción TDE de cifrado de tablespaces no son suficientes para ocultar datos de los administradores base de datos. Vamos a demostrarlo.

Descripción del entorno de laboratorio
  • OS Oracle Linux Server release 6.3
  • Database Oracle Database 11.2.0.4 EE with Database Vault and Transparent Data  Encryption


Detalles de la prueba de concepto
Queremos demostrar que ODV and TDE for tablespaces puede no ser suficiente para proteger los datos sensibles del “todopoderososysdba. En este pequeño experimento hemos usado el esquema de ejemplo HR y su tabla EMPLOYEES para ilustrar esta incidencia en la seguridad de nuestros datos.

Vamos a suponer que mis datos sensibles son, por ejemplo, los números de teléfono de los empleados. He creado un ámbito (realm) que protege esquema HR conjunto, por lo que SYSDBA no tiene acceso a ella.

SQL> select user from dual;
USER
-----------
SYS
SQL> select count(1) from hr.jobs;
From hr.jobs
           *
ERROR at line 2;
ORA-01031: insufficient privileges

La base de datos que estamos usando se ha habilitado el AMM (Gestión automática de la memoria de la SGA de la base de datos)

SQL> show parameters memory_target;

NAME                                TYPE                    VALUE
-------------------------           -------------              -----------------
Memory_target                 big integer             1520M
SQL>

La tabla Employees esta en un tablespace cifrado, así que acceder al datafile no es posible.

SQL> select table_name, t.tablespace_name, ts.encrypted from DBA_TABLES, t,
2  DBA_TABLESPACES ts where t.tablespace_name=ts.tablespace_name and t.owner=’HR’ and
3   t.table_name=’EMPLOYEES’;

TABLE_NAME                                   TABLESPACE_NAME                              ENC
--------------------------                           ---------------------------------                          ---------
EMPLOYEES                                     EMPLOYEES_AES128                            YES

Cuando estoy usando AMM en Linux, la memoria está representada por los archivos en  /dev/shm, que se puede comprobar mediante los comandos ipcs y lsof.

  • lsof (Lista de archivos abiertos, en español) es una conocida herramienta de monitorización de sistemas operativos tipo Unix que se utiliza para mostrar todos los archivos de disco que mantienen abiertos los procesos, incluyendo los sockets de red abiertos, tuberías, entre otros tipos.
  • ipcs: proporciona información sobre los recursos ipc para los cuales el proceso de llamada tiene derechos de lectura



Ahora un usuario conectado como HR hace una consulta sobre EMPLOYEES:

SQL> select user from dual;
USER
-------------
HR

SQL> select phone_number from hr.jobs;

PHONE_NUMBER
----------------------------
650.507.9833
650.507.9844
515.123.4444
515.123.5555
.
.
.


Después de esta consulta que deberíamos tener los bloques del segmento EMPLOYEES copiados en el búfer cache. Ahora vamos a ver qué podemos hacer con él a nivel de sistema operativo sin ningún privilegio especial...

[oracle@dbaFhell]$ cd /dev/shm/
[oracle@dbaFhell]$ strings ora_orcl_* | egrep …^ {[0-9] {3}\.[0-9] {3}\.}\.[0-9] {4}$” | sort | uniq | tail -10
650.507.9833
650.507.9844
515.123.4444
515.123.5555


Conclusión
Cuando la base de datos Oracle está utilizando AMM en Linux (parámetro MEMORY_TARGET) Oracle Database Vault y TDE no es suficiente para mantener los datos confidenciales ocultos de administrador de base de datos

Si ellos saben lo que están buscando... y lo saben, ¿verdad?