martes, 27 de septiembre de 2016

Usando JMeter y OWAS ZAP en integración contínua



Introducción


Seguramente alguien nos echaba de menos , así que hemos aprovechado uno de esos ratos libres que nos deja el trabajo y aprovechamos para dar unas pequeñas nociones acerca de la sinergia entre herramentas. En este caso en el mundo de la integración continúa y la seguridad ..usando un script de JMeter.

Objetivos.


La idea de este artículo es explicar uina manera de generar informes de seguridad con una herramienta integrable con un entorno de integración contínua como  Jenkins, realizando navegaciones que puedan ser analizadas por dicha herramienta y generando un informe que pueda ser evaluado cuando se haga una nueva versión o implementación de una aplicación

Para ello vamos a trabajar usando las siguiente utilidades

  • Herramienta de seguridad OWASP Zap. Es una evolución de Paros Proxy que es reconocida en el entorno de integración contínua Jenkins, bien como plugin o como herramienta que genera acciones.
  • HTML Report. Es un plugin de Jenkins que permite publicar documentos en foprmato HTML o XML  
  • JMeter. La herramienta para pruebas de calidad, aunque centradas en el rendimiento, también usada para validaciones funcionales y demás
OWAS Zap habilita un puerto de escucha ,actuando como un proxy que permite analizar el tráfico que ciercula por él.

La herramienta realiza una serie de análisis de seguridad tanto pasivos como activos (modo spider, inyección SQL, cross-site scripting..etc) y permite generar un informe de seguridad con los principales fallos detectados.

Requerimientos


1º) Se ha instalado el plug-in de OWAS ZAP Zapproxy
2º) Se prepara un script JMX de Jmeter en el que se define como proxy el definido por el OWAS ZAP Proxy (por defecto ,localhost puerto 9090)
3º) Se crea una secuencia de tareas de este modo
         i.            
             Tarea inicial de arranque del OWAS Zaproxy en la que quede en ejecución en estado de escucha en el puerto, almacenando los resultados de dicha escucha en una sesión (parámetro –session de la invocación por línea de comandos)

Incluir tarea de OWAS ZAP: Uso de línea de comandos shelll

       ii.            Se lanza una instancia de JMeter en la que haga una navegación (con un usuario y una sola iteración a priori bastaría, reutilizando alguno de los casos de las pruebas de rendimiento)
Incluir tarea de ejecución JMeter. Uso de línea de comandos windows


      iii.            Se lanza a continuación una parada controlada del OWAS Zapproxy para que consolide lo monitorizado en la sesión definida como repositorio
Tarea detención OWAS ZAPproxy: Ejecutando comandos shell


     iv.            Se lanza de nuevo el OWAS Zapproxy en modo “generación de informes” , indicando como salida (parámetro de invocación “-last_scan_report) un fichero .html que se genera automáticamente con los resultados del análisis efectuado por la herramienta de seguridad.

Tarea creación informe tras navegación. Ejecutar línea de comandos shell

       v.            Por último , en la siguiente sección “Acciones a ejecutar después” del menú de Jenkins correspondiente a la tarea de seguridad, se puede incluir el plug-in HTML Report, que permite mostrar un enlace directo desde la tarea al fichero generado
Acción post ejecución tarea seguridad: Plugin HTML Report



El informe queda accesible desde el menú del marco izquierdo


O bien desde el propio pantalla de “Estado del proyecto” ,accediendo por el enlace de HTML Report o navegando en el directorio del “Espacio de Trabajo” (WORKSPACE)

Esperamos que os sea útil esta información. Ya sabeis, comentarios, dudas y demás serán bien recibidos.

jueves, 19 de mayo de 2016

JMeter III..y pico.Depurando Scripts avanzado.

En este artículo vamos a completar algunas técnicas que se usan habitualmente en las pruebas con esta herramienta, porque tal y como dicen , “la creación de código es un proceso retroalimentado, dado que siempre se pueden encontrar errores”.

Depurando un script de JMeter. Debug Sampler.


Muchas veces nos encontramos con la necesidad de saber cómo varian los valores de las variables, ya sean parametrizadas o correlacionadas. Para conocer el valor de las mismas , se dispone de un elemento de postprocesado sumamente útil : El debug Post-processor.

Este elemento sigue las normas de ámbito del resto de elementos de un plan de trabajo o script de JMeter, es decir, recoge información acerca de las peticiones que se encuentren por encima del mismo en la estructura de árbol del script.

Debug PostProcessor. Habilitación de visualización de variables

Como se puede ver, el elemento post-procesador de Debug, permite seleccionar
  • Valores del entorno

JMeter properties
Sampler properties
System properties

  • Valores relacionados con la prueba (¡lo que nos interesa! )
                     JMeter Properties

   

lunes, 15 de febrero de 2016

OPTIMIZACION DE LA MAQUINA VIRTUAL DE JAVA II

Resumen General de los Componentes de la JVM

La manera básica del funcionamiento de un compilador es primero tomar como entrada un idioma y producir un lenguaje ejecutable como salida. Un compilador Java tiene dos tareas principales:
  • ·        Habilitar el lenguaje Java para ser más portabe, esto quiere decir que no necesariamente tiene que estar ligado a alguna plataforma en específico.
  • ·         Asegurar que el resultado es el código de ejecución eficiente de la plataforma en curso.

Los compiladores pueden ser estáticos o dinámicos.

Un ejemplo de un compilador estático es “javac”. Para este compilador es necesario el código Java como entrada y lo traduce a bytecode (un lenguaje que es ejecutable por la JVM). Los compiladores estáticos interpretan el código de entrada una vez y el ejecutable de salida es la forma que se utilizará cuando el programa se ejecute.

Debido a que su entrada es estática siempre se ve el mismo resultado. Solo cuando se realizan cambios en el código fuente original y se vuelve a compilar se puede ver un resultado diferente.

Los compiladores dinámicos conocidos como “Just In Time” (JIT), realizan la traducción de un idioma a otro de forma dinámica, lo que significa que lo hacen según como se va ejecutando el código. Un compilador JIT permite recopilar datos en tiempo de ejecución o crear perfiles (por medio de la inserción de contadores de rendimiento) y así tomar decisiones sobre la marcha utilizando los mismos datos del entorno sobre el cual se está ejecutando.

La compilación dinámica permite mejores instrucciones de secuencia en los programas compilado con el lenguaje y reemplazar las instrucciones más eficientes e incluso eliminar las operaciones redundantes,

Con el tiempo se puede recoger más datos acerca de los perfiles de código y tomar decisiones sobre 
optimización de código y recomplilacion.

La compilación dinámica permite la ventada de ser capaz de adaptarse a los cambios en el comportamiento o la carga de aplicaciones. Esta es la razón por la cual los compiladores dinámicos están muy bien adaptados al tiempo de ejecución de Java. El problema es que los compiladores dinámicos requieren estructuras adicionales de datos, hilos, y ciclos de CPU para la optimización.

La asignación de recursos conduce a la recolección de basura (Garbage Collection)

La asignación de recursos se realiza en función de cada hilo (thread) que no es más que un espacio de memoria dedicada y direcciones del proceso de Java también conocido como “Heap” que  no es más que un almacenamiento dinámico.

La asignación de un thread individual es común de encontrar en las aplicaciones cliente-servidor. La asignación de un thread individual hacia un único subproceso

Continuará…


viernes, 12 de febrero de 2016

OPTIMIZACION DE LA MAQUINA VIRTUAL DE JAVA I

Las aplicaciones Java, se ejecutan en la Memoria Virtual de Java, pero alguna vez se ha preguntado que tanto conoce acerca de la tecnología de la Memoria Virtual de Java? Este artículo, el primero de esta serie, es un breve resumen que explica la manera de funcionar de la Máquina Virtual de Java que en lo sucesivo denominaremos JVM, así como los pros y los contras de la misma, el garbage collector y una pequeña muestra de los algoritmos que se utilizan dentro del garbage collector.

Si usted está involucrado en equipos de optimización de aplicaciones Java, es ingeniero de pruebas de rendimiento o programador, sin duda ha experimentado esa sensación especial cuando se encuentra la luz al final del camino en un proceso de pensamiento cuando se encuentra frente a un problema complejo de resolver. Personalmente me encanta la sensación de aprender algo nuevo. Durante el trabajo y la experiencia que he tenido con tecnologías como la JVM, sobre todo con el garbage collector y la optimización de ésta misma, espero poder compartir algunos temas que considero que pueden ser de gran utilidad a alguien más.

¿Qué es una JVM?

De manera sencilla, la JVM es un módulo de software que ejecuta una aplicación Java en modo de código y traduce ese código en instrucciones y procesos entendibles para hardware y ciertas instrucciones propias del sistema operativo.
De tal forma que al hacerlo, la JVM permite que los programas o aplicaciones Java puedan ser ejecutados en distintos entornos (lo que se conoce como portabilidad del software) sin que se requiera algún cambio en el código de la aplicación original. La portabilidad de Java es la clave de su popularidad como un lenguaje para aplicaciones empresariales, donde los desarrolladores no tienen que volver a escribir el código de aplicación para cada plataforma, ya que la JVM se encarga de la traducción y optimización.
La JVM también se encarga de la gestión dinámica de los recursos necesarios para ejecutar las aplicaciones Java. Esto significa que se encarga de la asignación y reasignación de memoria, el mantenimiento de un modelo de hilos consistente en cada plataforma y la organización de instrucciones necesarias. La JVM libera al programador de hacer el seguimiento de las referencias entre objetos y saber el tiempo que éstos deben mantenerse en el sistema. También lo libera de tener que decidir exactamente cuándo emitir instrucciones explicitas para liberar la memoria (un punto de dolor en todos los lenguajes de programación no dinámicos como C).
Se podría pensar en la JVM como un sistema operativo especializado para Java, su función es gestionar el entorno de ejecución de las aplicaciones Java. Una JVM básicamente es un entorno de ejecución virtual que actúa como una máquina para obtener instrucciones de código, mientras que la asignación de tareas de ejecución y la realización de operaciones de memoria a través de la interacción con las capas subyacentes.







martes, 5 de enero de 2016

Big Data II.Ecosistema de Hadoop.

Introducción.



Como ya dijimos en el anterior artículo, Hadoop actúa sobre los datos contenidos en su HDFS mediante las operaciones MapReduce. Ahora voy a contaros una cosa. Antes de empezar a tratar sobre dichos datos debe volcarlos a  ficheros y para ellos , requiere de herramientas externas para realizar lo que se llama E.T.L. (Extraction , Transformation ,Loading).



Extraction: Extrae datos de diferentes origenes. Si se dispone de conectores o drivers específicos sobre BBDD Hadoop y su ecosistema admite la conexión a fuentes de datos via ODBC o similares para el proceso.
Transformation: Valida, normaliza los datos para evitar errores
Loading: Vuelca los datos al HDFS (o a otros sistemas de BigData).

Para ello se introduce aquí el concepto de “ecosistema de hadoop”, es decir aquellas herramientas y utilidades que complementan a Hadoop para realizar las tareas de procesamiento masivo de datos.



Hadoop es el “motor” del vehículo. Las herramientas de ecosistema se pueden ejemplarizar como los neumáticos, la suspensión,..etc



Para realizar dichas operaciones ETL tenemos herramientas como scoop (http://sqoop.apache.org/), que permite la transferencia de datos de E.T.L.  de manera eficiente e integrada con Hadoop. Está también desarrollada por la Apache Software Foundation. Aquí hago un paréntesis para indicar que Hadoop es capaz de tratar tanto con datos estructurados (las clásicas tablas de BBDD organizadas en columnas ) como con no estructurados (XML).



Flujo de Scoop y Hadoop.