jueves, 30 de julio de 2009

OCA: Auditoria en base de datos Oracle.

Auditoria significa capturar y almacenar información acerca de lo que está sucediendo en el sistema, este proceso por lo tanto aumenta la cantidad de trabajo que el sistema debe de hacer. La auditoria debe ser enfocada a solo aquellos eventos que son de interes, una auditoria apropiadamente direccionada tiene un mínimo impacto sobre el desempeño del sistema, pero una auditoria no adecuada puede tener un impacto significativo negativo sobre el desempeño del sistema. El monitoreo y la auditoria debe ser una parte integral de tus procedimientos de seguridad, los cuales incluyen:

Auditoria obligatoria:
Todas las bases de datos Oracle auditan ciertas acciones a pesar de que las opciones ó parámetros de auditoria esten desactivados, la razón para una auditoria obligatoria es que la base de datos necesita registrar algunas actividades de base de datos críticas como son el inicio ó apagado del sistema.

Auditoria standard
Este tipo de auditoria es una caracteristica que se usa a nivel del sistema, usando un parámetro de inicialización, dicho parámetro es AUDIT_TRAIL. Después de que habilitaste la auditoria, ahora debes de seleccionar los objetos y privilegios que quieras auditar.

Auditoria basada en valores
Este tipo de auditoría extiende la auditoría standard, capturando no solo los eventos de auditoria que han ocurrido sino tambien los valores actuales que han sido insertados, actualizados o borrados, la auditoría basada en valores es implementada a través de triggers de base de datos.

Auditoría detallada
La auditoria detallada extiende la auditoria standard, capturando las declaraciones SQL actuales que han sido ejecutadas y no solo el evento que ha ocurrido.

Mucha teoria, veamos algo de practica sobre como podemos implementar la auditoría detallada en Oracle:
Supongamos que tú como DBA quieres saber cuando un usuario a seleccionado ciertos registros que son de vital importancia para la empresa, los registros los vamos a crear de la siguiente manera:

Objetos a crear:

Una tabla en el schema hr llamada empleados, el ddl es el siguiente:

create table hr.empleados(
codigo char(2) constraint nn_codigo_emp not null,
nombres varchar2(40) constraint nn_nombres_emp not null,
apellidos varchar2(40) constraint nn_apellidos_emp not null,
sueldo number(10,2) constraint nn_sueldo_emp not null,
primary key(codigo)
);

-- y el dml el siguiente:
insert into hr.empleados values('01','nombres1','apellidos1',1000);
insert into hr.empleados values('02','nombres2','apellidos2',2000);
insert into hr.empleados values('03','nombres3','apellidos3',3000);
insert into hr.empleados values('04','nombres4','apellidos4',4000);
insert into hr.empleados values('05','nombres5','apellidos5',5000);

Una vez creada la tablita vamos a auditar(seguir los pasos) de los usuarios que seleccionan los registros de los empleados que ganan más de S/.3000 (campo sueldo de la tabla hr.empleados)

Creamos un par de usuarios y le asignamos los privilegios de conexion y consulta sobre la tabla creada anteriormente:

create user sapo01 identified by sapo01;
create user sapo02 identified by sapo02;
grant connect to sapo01,sapo02;
grant select on hr.empleados to sapo01,sapo02;

Usamos el paquete dbms_fga para crear una politica de auditoria sobre una tabla o vista determinada(en nuestro caso la tabla hr.empleados), si cualquiera de las filas retornadas desde una consulta(query sql) ejecutadas por cualquier usuario coincide con la columna auditada y la condición de auditoria especificada entonces un evento de auditoria será creado y almacenado en las pistas de auditoria de Oracle. Opcionalmente, el evento de auditoria puede tambien ejecutar un procedimiento, La auditoria detallada se enfoca en un nivel declarativo(sql) es así que una declaración select que retorna cientos de filas generará solo un registro de auditoria.

El bloque pl/sql que crea la politica de auditoria es el siguiente:

begin
dbms_fga.add_policy (
object_schema=>'hr',
object_name=>'empleados',
policy_name=>'auditoria_sueldo_empleado',
audit_condition=>'sueldo>3000',
audit_column=>'sueldo',
handler_schema=>null,
handler_module=>null,
enable=>true,
statement_types=>'select');
end;

Ahora entramos con cualquiera de los usuarios creados enteriormente desde sqlplus y ejecutamos una consulta sobre la tabla que ya hemos configurado para que sea auditada:

C:\Documents and Settings\Pc>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sßb Ago 1 22:27:18 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
nolog> connect sapo01/sapo01@optimus;
Conectado.
SAPO01: OPTIMUS> select * from hr.empleados where sueldo=4000;
CO NOMBRES
-- ----------------------------------------
APELLIDOS SUELDO
---------------------------------------- ----------
04 nombres4
apellidos4 4000
SAPO01: OPTIMUS>

Ahora como usuario dba vemos los registros de auditoria creados, consultando a la vista dba_fga_audit_trail vemos algunos datos relevantes, entre los que destacan:

DB_USER, el usuario que realizó la consulta
OS_USER, el usuario desde donde se inició la sesión del sistema operatico cliente
USERHOST, nombre de la máquina del usuario que realizó la consulta
OBJECT_SCHEMA, el nombre del esquema auditado(hr en nuestro caso)
OBJECT_NAME, nombre de la tabla ó vista auditada(empleados en nuestro caso)
POLICY_NAME, nombre de la politica creada(auditoria_sueldo_empleado)
SQL_TEXT, el sql que ejecutó el usuario

El proceso de auditoría creado es bastante simple, en tu trabajo quizás quieras auditar tablas o vistas críticas que involucran miles de accesos por minuto, por lo que estos tipos de registros de auditoria debes de hacerlo con mucho cuidado y solo en casos en que lo amerite, como dije al comienzo una auditoría mal creada puede devenir en un performance negativo.

miércoles, 29 de julio de 2009

SCJP Preguntas y Respuestas Serie 1

Preguntas

Pregunta 1:
Dado el siguiente código:
1. public class Test {
2. public static void main(String [] args) {
3. signed int x = 10;
4. for (int y=0; y<5; y++, x--)
5. System.out.print(" " + x);
6. }
7. }

¿Cuál es el resultado? (Selecciona uno.)
A. 10 9 8 7 6
B. 9 8 7 6 5
C. La compilación falla
D. Una excepción es lanzada en tiempo de ejecución

Pregunta 2:
¿Cuál es una palabra reservada en el lenguaje de programación Java? (Selecciona una)
A. method
B. native
C. subclasses
D. reference
E. array

Pregunta 3
¿Cuál de estas listas contiene solo palabras reservadas del lenguaje java?(Selecciona una)
A. class, if, void, long, Int, continue
B. goto, instanceof, native, finally, default, throws
C. try, virtual, throw, final, volatile, transient
D. strictfp, constant, super, implements, do
E. byte, break, assert, switch, include

Pregunta 4
¿Cuáles dos son palabras reservadas? (Selecciona dos)
A. interface
B. unsigned
C. Float
D. this
E. string

Pregunta 5
¿Cuáles tres son declaraciones válidas de un char? (Selecciona tres)
A. char c1 = 064770;
B. char c2 = ‘face’;
C. char c3 = 0xbeef;
D. char c4 = \u0022;
E. char c5 = ‘\iface’;
F. char c6 = ‘\uface’;

Pregunta 6
¿Cuáles dos son declaraciones válidas de un String? (Selecciona dos)
A. String s1 = null;
B. String s2 = ‘null’;
C. String s3 = (String) ‘abc’;
D. String s4 = (String) ‘\ufeed’;
E. String s5 = “strings rule”;

Pregunta 7
¿Cuál es una declaración válida de un tipo de dato boolean? (Selecciona uno)
A. boolean b1 = 0;
B. boolean b2 = ‘false’;
C. boolean b3 = false;
D. boolean b4 = Boolean.false();
E. boolean b5 = no;

Pregunta 8
¿Cuál es el rango númerico de un char? (Selecciona uno)
A. –128 to 127
B. –(2 ^ 15) to (2 ^ 15) - 1
C. 0 to 32767
D. Depende de la plataforma
E. 0 to 65535

Pregunta 9
¿Cuáles tres son declaraciones válidas de un float? (Selecciona tres)
A. float f1 = -343;
B. float f2 = 3.14;
C. float f3 = 0x12345;
D. float f4 = 42e7;
E. float f5 = 2001.0D;
F. float f6 = 2.81F;

Pregunta 10
¿Cuáles tres son declaraciones legales de un arreglo? (Selecciona tres)
A. int [] puntajes [];
B. char [] caracteres;
C. int [6] caracteres;
D. Persona personas [];
E. Persona personas [7];


Si ya llegaste hasta aquí apunta bien tus respuestas y comparalas con las respuestas de abajo, recuerda que para certificarte tienes que sacar un mínimo de 70%(acostumbrate a la autoevaluación)


Respuestas
Respuesta 1:
C. La palabra signed no es un modificador válido como palabra reservada en el lenguaje Java. Todos los números primitivos en java tienen signo, siempre.

Respuesta 2:
B. La palabra native es una palabra reservada válida que es usada para modificar la declaración de un método. Las alternativas A, D, y E no son palabras reservadas. C no puede ser porque la palabra reservada para subclasear(herencia) es extends no subclasses.

Respuesta 3.
B. Todas las palabras en la alternativa B son parte de las palabras reservadas java. A está mal porque la palabra reservada para el primitivo int inicia con una letra minúscula i. C tambien está mal porque virtual es una palabra reservada en C++, no en Java. D tampoco es porque constant
no es una palabra reservada, las constantes en Java son declaradas como static y final. E tampo es porque include es una palabra reservada en C, no en Java.

Respuesta 4.
A y D. Tanto interface y this son palabras reservadas. B esta mal porque unsigned es una palabra reservada en C/C++ pero no en Java. C tambien está mal porque Float es un tipo de clase, la palabra reservada para el primitivo Java es float. E tambien está mal porque aunque String es un tipo de clase en Java, string no es una palabra reservada.

Respuesta 5.
A, C y F. A es una representación octal del valor enter 27128, el cuál es legal porque pertenece a un tipo de dato entero de 16bits sin signo. C es una representación hexadecimal del valor entero 48879, el cuál pertenece tambien a un tipo de dato entero de 16bits sin signo. F es una representación Unicode de un caracter. B está mal porque no podemos colocar más de un caracter en un literal de caracteres.(esto lo podemos saber porque esta entre comillas simples). Los unicos aceptables literales de caracter que pueden ir entre comillas simples son valores Unicode, y los literales Unicode deben siempre iniciar con '\u'. D tambien está mal porque las comillas simples no aparecen. E tambien es incorrecto porque parece ser una representación Unicode pero inicia con '\i' en vez de '\u'.

Respuesta 6.
A y E. A coloca la referencia String a null; E inicializa la referencia String con un literal.
B es incorrecto porque un null no puede estar entre comillas simples. C es incorrecto porque allí existen multiples caracteres entre las comillas simples(‘abc’). D tambien es incorrecto porque no podemos castear(pasar el valor de una variable de un tipo de dato a otro) un primitivo char a un objeto String.

Respuesta 7.
C. A un boolean solo puede ser asignado el literal true o false. A, B, D, and E son todas asignaciones incorrectas para un boolean.

Respuesta 8.
E. Un char es realmente un entero sin signo de 16bits.

Respuesta 9.
A, C, y F. A y C son literales de enteros (32 bits), y los enteros pueden ser legalmente asignados a floats (que tambien son de 32 bits). F es correcto porque F es agregado al literal, declarandolo como float mas que como un double( el tipo de dato por default para literales de punto flotante, osea decimales). B, D, y E son todos doubles.

Respuesta 10.
A, B, y D. En una declaración de arreglo, podemos colocar los corchetes a la derecha o a la izquierda del identificador. A parece extraño, pero es perfectamente legal porque divide los corchetes y hace un arreglo multidimensional, colocando los corchetes a ambos lados del identificador. C y E son incorrectos porque no podemos declarar un arreglo con un tamaño, el tamaño es solo necesario cuando el arreglo va a instanciarse(y la máquina virtual Java necesita conocer cuanto espacio de memoria asignar al arreglo, basado en el tipo del arreglo y su tamaño).

Primera Aplicacion Web, en java porsupuesto

Lo primero que tenemos que hacer es disponer de las herramientas necesarias, entre las cuales debemos tener: un jdk(no necesariamente el de Sun) y de un contenedor web, para eso suponemos que ya hemos instalado el jdk de Sun, descargamos el Tomcat en su versión comprimida en zip(Binary Distributions/Core/Zip). Para hacer las cosas más fáciles vamos a instalar el tomcat en un determinado directorio , yo lo he instalado en H:\appservers>, el proceso de instalar simplemente es copiar lo que hemos descargado a este directorio y descomprimirlo, yo(adicionalmente) le cambio el nombre al directorio.

1. Primero lo copio a un directorio:

H:\appservers>dir
29/07/2009 10:47 a.m. 6,379,115 apache-tomcat-6.0.20.zip

2. Ahora lo descomprimo
29/07/2009 10:47 a.m. 6,379,115 apache-tomcat-6.0.20.zip
29/07/2009 10:51 a.m. apache-tomcat-6.0.20

3. Ahora le cambio el nombre al directorio creado, por ejemplo a tomcat6
29/07/2009 10:47 a.m. 6,379,115 apache-tomcat-6.0.20.zip
29/07/2009 10:51 a.m. tomcat6

Ok ya tienes instalado el Apache Tomcat en tu máquina.

Antes de iniciar el tomcat tenemos que agregar una variable de entorno, la famosa variable JAVA_HOME cuyo valor debe ser el directorio de tu jdk, el mio es 'C:\Archivos de programa\Java\jdk1.6.0_14' esta variable de entorno en Windwos lo podemos agregar en 'Escritorio/Click derecho en el icono Mi PC/Propiedades/Pestaña Opciones Avanzadas/Variables de Entorno'

Ahora si probemos el tomcat que hemos instalado:

1. Nos vamos hacia el directorio donde lo instalamos y nos dirigimos hacia la carpeta bin, cuyo contenido debe de ser el siguiente:

14/05/2009 01:15 a.m. 17,508 bootstrap.jar
14/05/2009 01:15 a.m. 2,374 catalina-tasks.xml
14/05/2009 01:15 a.m. 10,652 catalina.bat
14/05/2009 01:15 a.m. 13,573 catalina.sh
14/05/2009 01:15 a.m. 9,341 commons-daemon.jar
14/05/2009 01:15 a.m. 1,342 cpappend.bat
14/05/2009 01:15 a.m. 2,104 digest.bat
14/05/2009 01:15 a.m. 1,624 digest.sh
14/05/2009 01:15 a.m. 74,398 jsvc.tar.gz
14/05/2009 01:15 a.m. 4,951 service.bat
14/05/2009 01:15 a.m. 3,452 setclasspath.bat
14/05/2009 01:15 a.m. 4,556 setclasspath.sh
14/05/2009 01:15 a.m. 2,096 shutdown.bat
14/05/2009 01:15 a.m. 1,563 shutdown.sh
14/05/2009 01:15 a.m. 2,097 startup.bat
14/05/2009 01:15 a.m. 1,956 startup.sh
14/05/2009 01:15 a.m. 19,399 tomcat-juli.jar
14/05/2009 01:15 a.m. 240,128 tomcat-native.tar.gz
14/05/2009 01:15 a.m. 57,344 tomcat6.exe
14/05/2009 01:15 a.m. 98,304 tomcat6w.exe
14/05/2009 01:15 a.m. 3,189 tool-wrapper.bat
14/05/2009 01:15 a.m. 3,291 tool-wrapper.sh
14/05/2009 01:15 a.m. 2,101 version.bat
14/05/2009 01:15 a.m. 1,567 version.sh

De todos esos archivos solo nos interesan(por el momento) dos de ellos startup.bat(para iniciar el contenedor web) y shutdown.bat(para detenerlo)

2. Ejecutamos el archivo startup.bat de la siguiente manera:

H:\appservers\tomcat6\bin>startup

-- La salida de la ejecución del programa de inicio nos muestra el directorio base, el directorio
-- home y el directorio temporal del contenedor tomcat, todo esto lo podemos cambiar,
-- adicionalmente nos muestra la versión del
-- JRE(Entorno de ejecución java, muy distinto a JDK, JRE pertenece al JDK)
-- que estamos usando

Using CATALINA_BASE: H:\appservers\tomcat6
Using CATALINA_HOME: H:\appservers\tomcat6
Using CATALINA_TMPDIR: H:\appservers\tomcat6\temp
Using JRE_HOME: C:\Archivos de programa\Java\jdk1.6.0_14
H:\appservers\tomcat6\bin>

Como vemos tambien nos sale una ventana emergente con los logs de inicio del tomcat:

29/07/2009 11:06:44 AM org.apache.catalina.core.AprLifecycleListener init
INFO: La biblioteca nativa de Apache Tomcat basada en ARP que permite un rendimiento ¾ptimo en entornos de desarrollo no ha sido h
allada en java.library.path: C:\Archivos de programa\Java\jdk1.6.0_14\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS
;C:\WINDOWS\SYSTEM32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\WBEM;C:\Archivos de programa\Java\jdk1.6.0_14\bin;H:\oracle10g\product\10.2.0\
db_1\BIN
29/07/2009 11:06:44 AM org.apache.coyote.http11.Http11Protocol init
INFO: Inicializando Coyote HTTP/1.1 en puerto http-8080
29/07/2009 11:06:44 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1033 ms
29/07/2009 11:06:44 AM org.apache.catalina.core.StandardService start
INFO: Arrancando servicio Catalina
29/07/2009 11:06:44 AM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
29/07/2009 11:06:45 AM org.apache.coyote.http11.Http11Protocol start
INFO: Arrancando Coyote HTTP/1.1 en puerto http-8080
29/07/2009 11:06:45 AM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
29/07/2009 11:06:45 AM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/31 config=null
29/07/2009 11:06:45 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1121 ms

La ultima línea nos dice que el servidor se inicio en 1121 milisegundos

3. Ahora procedemos a verificar el servicio en un navegador web, abrimos una ventana del navegador y colocamos la siguiente direccion: http://localhost:8080

Lo que debería de aparecer es lo siguiente:

If you're seeing this page via a web browser, it means you've setup Tomcat successfully. Congratulations!

Si tu estas viendo está página por medio de un navegador web, significa que haz instaladao Tomcat satisfactoriamente. Felicitaciones.



Una vez que hemos instalado las herramientas (jdk+contenedor web) ahora procedemos a crear una pequeña aplicacion que mostrará el famoso Hola Mundo

1. Nos vamos hacia el directorio /tomcat6/webapps
2. Una ves allí creamos una estructura de directorios similar a lo siguiente:

webapps(directorio)
-- holamundo(directorio)
-- -- index.jsp(archivo)
-- -- WEB-INF(directorio)
-- -- -- web.xml(archivo)

El contenido de los archivos es el siguiente:

index.jsp Archivo jsp, java server page, que procesará la información del servidor en forma dinámica

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Mi Primera Página Web</title>
</head>
<body>
<%int cantidad = request.getParameter("cantidad")==null?7:Integer.parseInt(request.getParameter("cantidad"));%>
<%for(int i=0; i<cantidad; i++){%>
<h3>Hola Mundo en Java</h3>
<%}%>
</body>
</html>

web.xml Archivo xml, descriptor de despliegue de tu aplicación web, describe como tu aplicación será montada en el contenedor Tomcat, tiene muchos parámetros y etiquetas para que puedas configurar tu aplicación( si quieres certificarte como SCWCD tienes que aprenderte cada una de ellas)


<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<!-- Nombre de nuestra aplicacion Web -->
<display-name>Mi Primera Aplicacion Web</display-name>
<!-- Tiempo en minutos de duracion de una sesion -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- Lista de archivos de bienvenida -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


3. Ahora lo que hacemos es ir hacia la siguiente url:
http://localhost:8080/holamundo/index.jsp?cantidad=10

Ahora verás el procesamiento de tu página jsp q te mostrará el hola mundo 10 veces

4. Si no quieres colocarle el número de puerto a la dirección(o no quieres usar el por default), entonces edita el archivo server.xml que se encuentra en /tomcat6/conf/server.xml allí aproximandamente en la línea 66, encontrarás la siguiente etiqueta:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

cambia el valor 8080 del atributo port, por el valor 80, ahora puedes acceder a tu aplicación sin especificar el puerto, es decir así: http://localhost/holamundo/index.jsp?cantidad=12