domingo, 15 de noviembre de 2009

Patrones de seguridad para SOA

Cuando aplicamos en general la seguridad atacamos diferentes dimensiones: La primera es la Autenticación que nos indica como nos vamos a autenticar a un servicio, la segunda Autorización es decir que operaciones podemos hacer a que recursos podemos acceder, la tercera es la Auditoría o conocida como no repudio donde podemos hacer rastreos de las operaciones no autorizadas y las ultimas Confidencialidad, Integridad y Disponibilidad las cuales nos aseguran que los datos son confiables, que no fueron alterados en el transporte y que nuestros servicios deben seguir disponibles para nuestros usuarios


EXCEPTION SHIELDING

Problema: Sin filtrar datos de la excepción de salida de un servicio, este puede contener detalles de la implementación interna que puede comprometer la seguridad del servicio y su entorno.

Solución: Asegurar las excepciones sustituyendo los datos sensibles de la excepción, por datos seguros.

Aplicación: En tiempo de diseño, mediante ejecución (subrutinas).

Impacto: El seguimiento de errores es más difícil.



Message Screening

Problema: Un atacante puede transmitir mensajes con contenido malicioso o incorrecto a un servicio, dando lugar a un comportamiento indeseable.

Solución: Cuando un servicio recibe un mensaje, éste hace una serie de controles para detectar el contenido del mensaje de datos dañinos

Aplicación: Cuando un servicio recibe un mensaje este hace una serie de chequeos para detectar el contenido mal formado.

Impacto: Se requiere tiempo de procesamiento extra, y la lógica de detección requiere rutinas especializadas para procesar contenido de los mensajes binarios, tales como archivos adjuntos

Trusted Subsystem

Problema: Un consumidor que tiene acceso a los recursos backend de un servicio directamente, puede comprometer la integridad de los recursos

Solución: El servicio está diseñado para utilizar sus propias credenciales de autenticación y autorización de los recursos backend en nombre de los consumidores

Aplicación: Dependiendo de la naturaleza de los recursos subyacentes, varias opciones de diseño y tecnologías de seguridad se pueden aplicar

Impacto: Si este tipo de servicio se ve comprometido por los atacantes o usuarios no autorizados, puede ser explotado para acceder a una amplia gama de recursos.

Service perimeter guard

Problema: Los consumidores externos que requieren acceso a uno o más servicios en una red privada, podrían atacar el servicio o usuario para acceder a recursos internos

Solución: Un servicio intermedio se establece en el perímetro de la red y este es asignado para trabajar con un FireWall así que pueda establecer comunicación entre la red externa y la interna

Aplicación: Establecer un mecanismo seguro, entre redes externas e internas

Impacto: Adiciona complejidad y sobrecarga al rendimiento ya que hay una labor intermedia
Para más información: http://www.soapatterns.org/masterlist_c.asp

Modelos operacionales

Las empresas tienen modelos operativos y es importante que estas hagan uso de la tecnología para apoyar su modelo.

Dentro de la “Arquitectura Empresarial” (En otro post ampliare este concepto), es importante que las empresas identifiquen en que cuadrante “están” o a cual se quieren “mover en el futuro” ya que la forma de operar debe estar alineada con la estrategia de la organización. A continuación presento un mapa mental que presenta un resumen del paper del MIT donde se encuentran explicados estos modelos:

http://web.mit.edu/cisr/resbrfgs/2005_12_3C_OperatingModels.pdf


jueves, 13 de agosto de 2009

Que indican los cuadrantes mágicos de Gartner? Cuál es su objetivo?

Primero que todo Gartner es una empresa consultoría encargada de investigar, la industria y las tendencias del mercado. Dentro de sus famosos cuadrantes mágicos, se pueden identificar las diferentes empresas que se encuentran en la vanguardia en tecnologías como: BPM, BI, ERP, etc. A continuación podrán ver un resumen de los cuadrantes del 2004, 2007 y 2009 que hacen referencia a BPM, las clasificaciones se encuentran por competidores, lideres, buenos jugadores y visionarios. Su objetivo es ser uno de los puntos de partida o base, para aquella organización que está buscando implementar tecnología BPM en la automatización de sus procesos de negocio. Por supuesto mi favorito y que además ha estado en lo cuadrantes es BizAgi – Vision.








jueves, 16 de julio de 2009

Que se debe tener en cuenta en los componentes y arquitectura involucrados en un LoadTest?

En la Internet, se habla mucho de TeamTest, hasta podemos encontrar imágenes y videos muy superficiales de cómo hacer pruebas unitarias y de carga, a nuestras aplicaciones WEB. Lo cierto es que en la actualidad nuestras aplicaciones WEB son cada vez más robustas y dinámicas. Por ello es que en los ambientes que disponemos para las pruebas, se deben hacer unas preparaciones previas en nuestra infraestructura y ambientes, para garantizar su éxito.

Consejos importantes para garantizar el éxito de tus pruebas: (De no hacerlo tus pruebas se van a ver frustradas y mal interpretadas).

Configuraciones en el Servidor WEB:

  • WEB.CONFIG: Validar que en el Web.config la opción de debug se encuentre apagada:
  • Se debe asegurar que los assemblies de la aplicación, se generen en release y no Debug
  • MACHINE.CONFIG: Para aprovechar el o los procesadores de tu servidor, debes cambiar la configuración predeterminada del FrameWork, realizando el siguiente cálculo matemático, por procesador con el fin de reducir contención, cuando se maneja mucha carga:
http://msdn.microsoft.com/en-us/library/ms998549.aspx

Configuraciones en la Base de Datos SQL 2005:

  • En SQL 2000 anteriormente para manejar los bloqueos o abrazos mortales, debíamos añadir a nuestras consultas, las conocidas sentencias sucias (NOLOCK). Con SQL 2005 ya no es necesario, basta con configurar adecuadamente el nivel de aislamiento (ISOLATION LEVEL) a SNAPSHOT y así nuestro motor funcionará similar a como lo hace ORACLE, manejando versionamiento de filas. En una instalación predeterminada el nivel de aislamiento de la transacción READ COMMITTED, vine por defecto. Para utilizar el aislamiento SNAPSHOT, debemos agregar el siguiente Transact-SQL: ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ONCon este otro no hay necesidad de hacer algo adicional en el código (Como colocar en las transacciones: SET TRANSACTION ISOLATION LEVEL SNAPSHOT;):ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

http://msdn.microsoft.com/es-es/library/ms174269(SQL.90).aspx

Reportes y contadores a analizar después de un LoadTest en VS2008

Este es uno de los resúmenes, que nos arroja el Team Test:
A continuación el tipo de análisis que debes hacer, luego que termina la carga. Los siguientes imágenes se obtienen haciendo clic sobre la traza de contadores, dentro de la herramienta Team Test (cuando finaliza la carga), por supuesto debes tener en cuenta adicionar los contadores apropiado, y aportar un buen analisis:

Indicador General

A continuación se presenta el total de las solicitudes, y las peticiones por segundo: En el contador de carga de usuarios podemos visualizar como se fue incrementando 5 usuarios a 50 en el primer minuto con los 30s de la prueba.(Haciendo uso de la carga completa de usuarios virtuales). También podemos observar el número de solicitudes por segundo y ver que número de errores presentados durante la prueba en este caso con valor 1.
Indicador de Procesador y Memoria

Servidor WEB (10.1.5.116):En el siguiente gráfico podemos observar, que el procesador se mantuvo en un promedio de %32 y tuvo 3 picos de %89 lo cual es normal, al no tratarse de un valor constante. Su uso de memoria se mantuvo en un 30%. Es importante resaltar que el proceso w3wp en el servidor de mantiene en un intervalo de 200m a 230m.

Servidor BASE DE DATOS(10.1.5.119):En el siguiente gráfico podemos observar, que el procesador se mantuvo en un promedio de %3 este no presenta ningún pico. Su uso de memoria se mantuvo en un 14%

Indicadores IIS

En el siguiente gráfico podemos observar, que se presentaron 8 peticiones en cola (Requests Queued). También podemos ver a nivel de ASP NET, no se presentaron solicitudes rechazadas (Requests Rejected) ni reinicios del proceso W3p (Worker Process Restarts) utilizado por la aplicación.

En los últimos 30s, los requerimientos se empiezan a encolar (Requests Queued), esperando una respuesta, por defecto en el machine.config el máximo es 100. Cuando se sobre pase este valor, entonces el servidor Web habrá alcanzado el límite de requerimientos concurrentes que puede procesar.



Indicadores SQL Server
En el siguiente gráfico podemos observar que no se presentaron bloqueos (Number of Deadlocks/sec), el máximo Número de bloqueos (Lock Waits/sec) por segundo fue de 1s. Total de (Full Scans/sec) 138. El Número máximo de transacciones en la base de datos corresponde a 1.524. Número máximo de conexiones a la base de datos 22.



Indicadores .NET CLR Memory y Loading

Porcentaje de uso de CPU que se lleva el recolector de basura CLR (% Time in GC). Se observa que el tiempo de procesamiento que le esta llevando al GC en recolectar la basura, está por encima de los umbrales propuestos por Microsoft. Los iconos amarillos corresponden a Umbrales sobrepasados de warning y los rojos a umbrales de error




El contador Current Assemblies, que nos indica el número total de assemblies en memoria se mantuvo en un valor constante, lo cual es normal.
Byte in all Heaps: Este contador es la suma de otros cuatro contadores: Gen 0 Heap Size, Gen 1 Heap Size, Gen 2 Heap Size y Large Object Heap Size. Muestra la cantidad de memoria virtual en bytes actualmente alocada en los heaps manejados. Si este contador crece sostenidamente indica que existe una leak de memoria en código manejado.











Configurando un WebTest y LoadTest en VS2008

1. Cuando realizas una grabación de tipo WEBTEST para tu aplicación, obtienes los Request y Response junto con sus respectivos parámetros POST y GET e información que viaja a través de estos. Como se muestra a continuación:

2. Transacciones: Cuando manejas formularios dinámicos en un mismo ASPX o página, en diferentes momentos dentro de la ejecución de tu aplicación, es importante bautizar y agrupar las URLS en transacciones, para que su posterior análisis sea más preciso. Como se muestra a continuación:
Bastara con indicar un nombre descriptivo como adicionando teléfono, o guardando datos del cliente, en el cual le indicaras la URL inicial Y la URL donde deseas que finalice la transacción


3. Reglas de Extracción: Alunos parámetros: Visual Studio Team test, los reconocerá automáticamente, otros no, sobre todo cuando se trata de aplicaciones muy dinámicas complejas. Y si tú aplicación es una de ellas tendrás que indicarle al Team test, tus propios patrones o reglas de extracción, de tal forma que la herramienta sepa exactamente qué información se alimentara dinámicamente, como IDS que usamos o pasamos por nuestros queryStrings que vienen de la base de datos, para poder hacer búsquedas o simplemente visualizar una grilla, o un detalle de una de uno de nuestros ASPX. Como se muestra a continuación:


La regla de extracción consistirá en indicarle, de nuestro reuest/response que la información va a ser dinámica, para este ejemplo el valor que aparece en negrilla:name="h_idCase" value="454“>



Posteriormente el editor gráfico nos dejara, reutilizar esta variables a mediantes combos o escribiendo directamente el nombre de nuestro parámetro dentro de los caracteres {{}}



4. Como preparar nuestra prueba de carga?

Bautizar nuestra prueba de carga:


Distribución de usuarios (Total 50 y como se van a ir incrementando):



Pruebas de carga a adicionar, en este caso 1, pero se pueden adicionar varias en paralelo:

Distribución en términos porcentuales de navegadores a emular, en este caso 100 % para IE:

Distribución en términos porcentuales de las redes a emular (se pueden las más optimas canales T1, para nuestro caso LAN):

Registro de servidores de contadores a analizar, para el ejemplo se adicionaron dos servidores, los cuales veremos más adelante en los reportes (Proximo POST)

Tiempo de calentamiento de nuestra aplicación, este no se tiene en cuenta para la estadística
Ejecutar prueba de carga.

Como desarrollar un servicio WEB con WCF

Dentro de una arquitectura orienta a servicios (SOA), es muy probable que nos veamos enfrentados a realizar servicios WEB, como hacerlo con las nuevas tecnologías? A continuación ilustro como desarrollar un servicio WEB con WCF en 7 pasos:

  • Creando un WCF Service Library
  • Configurando el contrato
  • Implementando el contrato del servicio
  • Creando un WCF Service Application
  • Configurando los EndPoitns
  • Probando el servicio
  • Consumiendo un servicio desde un cliente

Problema: El servicio que se desarrollara a continuación, simulará la revisión sobre una la lista negra/clienton, este revisará el último dígito del número de identificación proporcionado, si es par retornará VERDADERO (o sea es NEGATIVO), caso contrario si es impar retornará FALSO.

1. Creando un WCF Service Library

  • Crear un nuevo proyecto de tipo WCF(para este ejemplo en lenguaje C#), luego seleccionamos la plantilla WCF Service Library y lo nombramos así: ListaClintonService


  • Abrimos las propiedades del proyecto ListaClintonService y cambios el namespace o espacio de nombres que viene por defecto por: com.micompania.ListaClintonService

2. Configurando el contrato

  • Renombramos el archivo IService1.cs por ListaClintonServiceContract.cs y dentro del código de este cambiamos el namespace por: com.micompania.ListaClintonService y renombramos el nombre de la interfaz.
  • Luego borramos de ListaClintonServiceContract.cs

- Todos los comentarios

- La definición de la clase CompositeType

- Y los métodos GetData y GetDataUsingDataContract que se encuentran en la Interface

  • Modificamos el atributo [ServiceContract] de la clase ListaClintonServiceContract.cs e incluimos http://micompania.com/services/ListaClintonService
  • En la definición de la clase ListaClintonServiceContract definimos el método verificarDocumento que recibe como parámetro un string (numeroDocumento) y retorna un bool (Resultado).
  • Adicionamos al método verificarDocumento el atributo [OperationContract]


3. Implementando el contrato del servicio

  • Renombramos el archivo Service1.cs por ListaClintonServiceContractImplementation.cs y dentro del código de este cambiamos el namespace por: com.micompania.ListaClintonService y renombramos el nombre de la clase.
  • Borramos de la clase ListaClintonServiceContractImplementation.cs

-Todos los comentarios

-Y los métodos GetData y GetDataUsingDataContract

  • Implementamos la clase ListaClintonServiceContract


  • Definimos el Método:

Hacemos el build del proyecto: ListaClintonService

4. Creando un WCF Service Application

  • Adicionamos un nuevo proyecto de tipo Web y seleccionamos la plantilla WCF Service Application y lo nombramos así: ListaClintonServiceIISHost

  • En la propiedades del proyecto ListaClintonServiceIISHost en el tab WEB de la sección Servers especificamos el puerto: 8081 y guardamos los cambios.

  • Borramos del proyecto ListaClintonServiceIISHost

-El archivo IService1.cs

-El archivo Service1.svc

-El directorio App_Data

  • Adicionamos una referencia a ListaClintonService
  • Renombramos el archivo Service1.svc a ListaClintonService.svc
  • Dento del código del archivo ListaClintonService.svc cambiamos el atributo service a: com.micompania.ListaClintonService.ListaClintonServiceContractImplementation y borramos el atributo CodeBehind junto con su contenido.

  • Guardamos y construimos el proyecto ListaClintonServiceIISHost

5. Configurar los endPoitns del proyecto ListaClintonServiceIISHost

  • Hacemos clic derecho sobre el archivo de configuración, y hacemos clic en Edit WCF Configuraton
  • Renombramos los comportamientos, nombre del servicio y el contrato así:


  • Guardar los cambios y cerrar:


6. Probar el servicio ListaClintonService

  • Clic derecho sobre el servicio ListaClintonService.svc y colocar set as start page
  • Clic derecho sobre el servicio ListaClintonService.svc debug, start new instance
  • Se ha desplegado en nuestro IIS nuestro primer webService sobre WCF



7. Consumir un servicio:

  • Crear un proyecto WINDOWS con el Nombre ClientListaClintonService y adicione referencia de Servicio:


  • Haga clic en Discover para buscar los servicios locales, coloque en el NameSpace ClintonService

  • Adicione el NameSpace: ClientListaClintonService.ClintonService;
  • En la interfaz grafica coloque los siguientes controles:txtNumeroDoc ylblResultadoDescripcion donde mostrara el resultado

  • Proceda Añadir el siguiente codigo en el boton:

private void Aceptar_Click(object sender, EventArgs e) { ClintonService.ListaClintonServiceContractClient newLista = new ListaClintonServiceContractClient();

if (newLista.verificarDocumento(this.txtNumeroDoc.Text)) this.lblResultadoDescripcion.Text = "Esta en lista Negra";

else this.lblResultadoDescripcion.Text = "No esta en lista Negra";

}

  • Resultado con numero documento par:

  • Resultado con numero documento Impar: