viernes, 6 de agosto de 2010

La reconstrucción II - Arquitectura de mi aplicacion

Arquitectura de software - Sistema multinivel básico

La figura anterior es una de las actuales propuestas de arquitectura del software, por capas o niveles. Nada nuevo si consideramos que el desarrollar sistemas es una actividad que pretende resolver un problema y al mismo tiempo es un problema… nada resulta mejor que dividir.

Mi aplicación, aunque es cliente servidor con programas monolíticos, tiene esta característica, una arquitectura “interna” por capas.

Visual Basic 6 sin ser un lenguaje orientado a objetos ya permitía hacer esta división; módulos de clase que combinados con el componente ADO dan la persistencia de los datos, módulos .BAS con funciones de uso general donde se definen las reglas del negocio y la presentación o interfaz grafica donde se procesan los eventos realizados por los usuarios.

La reconstrucción de mi aplicación debe darse en los mismos términos, sobre la base de una arquitectura por capas. Desde luego que no en un cliente monolítico incapaz de integrarse con otras aplicaciones… !!!!!… Integración de aplicaciones, sin duda un gran tema que abordare posteriormente.

Ejemplo de persistencia de datos en mi aplicación VB6

-para ver mejor click sobre cualquier imagen-

Definicion de los campos de la clase ClsImpuestoArt, basicamente son campos de una tabla de la base de datos.


En la misma clase se define el procedimiento CargaTablaImpuesto que llenara la clase.


En una forma o en un módulo, se intancia la clase

En la misma forma donde se define, se llena la clase Articulo80 ejecutando su metodo CargaTablaImpuesto. El llenado de la clase se hace generalmente al cargar la forma donde se usaran los datos.

Ya con los datos en memoria se utilizan de la siguiente forma:

Articulo80 y Articulo80A son tablas en la memoria del cliente, que se pueden recorrer rapidamente como se observa en la ultima figura. Por estos rumbos, el calculo del impuesto se aplica sobre los ingresos mensuales de un trabajador y dependiendo de su valor hay que buscar en estas tablas ciertos parametros para calcularlo.

Imaginense calcular el impuesto de 5000 trabajadores en un cliente que tenga que ir a la tabla de la base de datos.... Mejor tenerla en la memoria...

La reconstrucción I - Mi aplicación

Hace 12 años desarrolle en Visual Basic 6 algunos módulos de una aplicación utilizada para procesar y pagar la nomina en la Administración Pública, si tomo en cuenta la frase que dice “El software se deteriora en función de los cambios que sufre”, llego a la conclusión de que esta aplicación ya está demasiado estropeada. Aun sin la frase, a 12 años de cambios continuos, veo que el VB6 ya dio todo lo que tenía que dar.

Es software a la medida, desarrollado por personas que sabían bastante sobre las reglas del negocio y supieron plasmar desde el modelo de base de datos las características necesarias para dar solución a una necesidad especifica. Desde la última vez que sufrió un gran cambio, en 2007, con motivo de su implementación en otra dependencia, sabía que era necesario reescribir la aplicación en una plataforma más moderna para darle mayor flexibilidad y adaptabilidad, sin embargo no me fue posible.

Hoy, por enésima vez intento reescribir la aplicación, ahora en Visual Studio, es una tarea muy grande para una sola persona, pero si no empiezo nunca terminare. Me propongo actualizar algunos módulos, pero lo más importante será definir una arquitectura de desarrollo. Ya en VB6 tuve éxito desarrollando muchos componentes reutilizables -los famosos User Controls- y módulos .bas con funciones de uso general… Además, definí clases de “persistencia” de los datos, esto último ayudado por los Class Modules de VB6 y el componente ADO… Ya no viene al caso pero bien pude haber escrito algo sobre el uso y abuso del ADO Activex Data Object… Vaya que abuse de él, para bien…

Día a día iré avanzando algo y por supuesto lo traeré a este blog. Sin duda algo interesante resultara de esto… Muchos tips de un veterano programador….

Características de mi aplicación

Mi aplicación, así la llamare de hoy en adelante, es cliente-servidor, con un cliente “pesado” con toda la lógica del negocio cargada de ese lado. Cuando la construimos, no teníamos un amplio conocimiento de la programación de la base de datos INFORMIX, solo del SQL estándar, esto fue lo que nos obligo a cargarle todo al cliente, que cabe bien decirlo nos aguanto y aguanta de todo. Mi aplicación es soportable desde los equipos con procesador Pentium y menos de 1MB de RAM… Con los nuevos procesadores y las capacidades de RAM de los equipos actuales, mi aplicación ejecuta sin problema.

Una característica de mi aplicación es traer grandes cantidades de información de la base de datos, procesarlos y regresar el resultado a la base de datos. Cuando hicimos el primer prototipo nos dimos cuenta que los continuos accesos a la base de datos, ese ir y venir de la información entre el cliente y el servidor, retardaba el proceso principal de cálculo de la nomina de 30,000 trabajadores… No eran horas de proceso, eran días… No sabíamos entonces una regla de oro… Los accesos a la base de datos son “carísimos” en medida de tiempo… Permítanme reiterarlo porque muchos todavía no lo saben… Si tu aplicación tiene que leer muchos registros, miles de registros, de una base de datos, no vayas por ellos uno a uno… No metas en un bucle la sentencia “select”

La solución fue simple, diseñamos consultas SQL que traen al cliente la mayor cantidad de datos posible de un solo golpe… Una vez resuelto el “gran query” por el manejador de base de datos (RDBMS), la transferencia de información entre cliente y servidor sobre la misma conexión es rapidísima no importa que sean miles de registros. Ya con la información en la memoria del cliente mi aplicación procesa la nomina en minutos.

Mi aplicación, utilizada por más de 200 usuarios repartidos en toda la republica, no mantiene conexiones permanentes con la base de datos, trabaja en modo desconectado la mayor parte del tiempo. Solo cuando es necesario actualizar la información se establece la conexión al RDBMS y trae la mayor cantidad de datos que necesite el proceso en operación…

Con el tiempo me di cuenta que el haber construido mi aplicación de esa manera resulto ventajoso, llegamos a demostrar que mi aplicación podía correr sobre cualquier base de datos con mínimos cambios. Solo reconfigurar el ODBC, modificar algunas consultas SQL no tan estándar y actualizar la cadena de conexión en el componente de acceso a base de datos. Hicimos la prueba con el modulo de censo de recursos humanos corriendo sobre MySql… El mayor trabajo fue cargar los datos de una base de datos a otra…

lunes, 7 de junio de 2010

Manejo de roles en linux con grsecurity

El proyecto “grsecurity” ofrece varios parches al núcleo de Linux que mejoran la seguridad global del sistema, entre sus principales características destacan:

Protección del espacio de direcciones, a través de la herramienta PAX se previene el abuso de los desbordamientos de buffer, además de proveer aleatoriedad a la administración de procesos en memoria.

Protección del sistema de archivos, sobre este aspecto existen restricciones en el /proc, que hacen que un usuario pueda ver únicamente sus procesos, además protecciones de ejecución en /tmp.

Registro de actividad en el “kernel”, configuración de varias opciones de auditoria.

Protección de ejecutables con la configuración de opciones que intervienen en la creación de procesos y a que binarios del sistema se puede acceder.

Protecciones de red con restricciones sobre que tipos de “sockets” podrán utilizar los usuarios y opciones de configuración relacionadas con la selección aleatoria de la pila TCP/IP.

Opciones de registros de eventos que permiten especificar el tiempo entre mensajes de notificación y el número máximo de estos mensajes.

Opciones de control de acceso basado en roles RBAC.

INSTALACION

El proceso de instalación se realizó sobre una versión de Linux con las siguientes características:

Distribución Ubuntu 8.04 Desktop i386
Kernel 2.6.24

En general, el proceso consiste en obtener los fuentes del kernel, obtener los parches de “grsecurity”, aplicar los parches al Kernel, recompilarlo e instalarlo.

Para compilar el kernel se necesitan instalar los siguientes paquetes:

apt-get install build-essential bin86 kernel-package
apt-get install libqt3-headers libqt3-mt-dev

Cambiamos de directorio

cd /usr/src

Bajamos los fuentes del kernel y los fuentes de “grsecurity“

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.bz2
wget http://www.grsecurity.net/grsecurity-2.1.11-2.6.24.5-200804211829.patch.gz

Para el kernel 2.6.24 es necesario bajar la versión mas reciente de “grsecurity” que señala claramente en su nombre de archivo la versión del “kernel” a parchar.

Se descomprimen los archivos

tar –xjvf linux-2.6.24.tar.bz2
gunzip grsecurity-2.1.11-2.6.24.5-200804211829.patch.gz

Cambiamos de nombre al directorio donde se descomprimieron los fuentes y hacemos una liga con un nombre mas corto

mv linux-2.6.24 linux-2.6.24-grsec
ln -s linux-2.6.24-grsec linux

Cambiamos al directorio de los fuentes y copiamos a este directorio, el parche descompactado de “grsecurity”.

cd linux
cp /usr/src/grsecurity-2.1.11-2.6.24.5-200804211829.patch .

Aplicamos el parche

cat grsecurity-2.1.11-2.6.24.5-200804211829.patch "aqui va un pipe" patch –Np1

Con lo anterior ya tenemos listos los fuentes para configurar y compilar

Copiamos el archivo de configuración inicial que tenemos actualmente

cp /boot/config-2.6.24-19-generic .config

Configuramos lo que será el nuevo kernel

make xconfig

Aparece la siguiente ventana de configuración


De la pantalla anterior, seleccionamos las opciones de “grsecurity” requeridas y salvamos el archivo con el botón de guardar.

Ubicados en el directorio /usr/src/linux construimos el paquete .deb

make-kpkg clean
make-kpkg -initrd --revision=ck2 kernel_image

Si no hubo errores se genero el paquete
/usr/src/linux-image-2.6.24-grsec_ck2_i386.deb

Para instalarlo

dpkg -i linux-image-2.6.24-grsec_ck2_i386.deb

Por ultimo descargamos de un mirror de Ubuntu el paquete “gradm2_2.1.11-1_i386.deb” y lo instalamos con “dpkg”.

Reiniciamos el sistema operativo

CONTROL DE ACCESO BASADO EN ROLES (RBAC)

Existen dos tipos de mecanismos de control de acceso usados para prevenir el acceso no autorizado a archivos o información en general: DAC (control de acceso discrecional) y MAC (control de acceso obligatorio). Linux usa por defecto el mecanismo DAC, en el cual el creador del archivo puede definir quien tiene acceso a este.

En DAC un usuario tiene un completo control sobre los objetos que le pertenecen y los programas que ejecuta. Así mismo, el programa ejecutado por un usuario tendrá los mismos permisos de ese usuario que lo esta ejecutando.

Lo anterior implica que la seguridad del sistema depende de las aplicaciones que se están ejecutando y por lo tanto, cuando se produce una vulnerabilidad de seguridad en una aplicación, ésta afecta a todos los objetos a los que el usuario tiene acceso. Así, si la aplicación es ejecutada por “root”, el atacante puede obtener los máximos privilegios en el sistema, comprometiendo la seguridad global.

Un sistema MAC fuerza a que todos sigan las reglas establecidas por el administrador. En este modelo existe una política de seguridad definida por el administrador y que los usuarios no pueden modificar. Esta política va más allá de establecer propietarios de archivos, define contextos, en donde se indica cuando un objeto puede acceder a otro objeto.

La implementación MAC de “grsecurity” es llamada RBAC. Esta herramienta asocia roles a cada usuario, cada rol define que operaciones pueden ser llevadas a cabo sobre ciertos objetos. Dada una colección bien escrita de roles y operaciones, los usuarios estarán restringidos a hacer solamente aquellas tareas que el administrador le dice que pueden hacer.

TRABAJANDO CON RBAC

“gradm2” es el programa que permite administrar y mantener políticas para el sistema. Con el se puede activar o desactivar el sistema RBAC, cambiar su rol y configurar una contraseña para el modo de administrador.

Para introducir una contraseña para el administrador:

gradm2 -P admin (ingresar contraseña del rol administrador)

hecho lo anterior podemos activar el sistema RBAC con:

gradm2 -E

La política predeterminada esta definida en “/etc/grsec2/policy” y es bastante restrictiva ya que siendo usuario “root” no podemos ver el directorio “/etc/grsec2/”, la siguiente instrucción:

cd /etc/grsec2/

dará por resultado que no se encuentra el archivo o directorio.

O bien, una instrucción como “ifconfig” no será capaz de modificar las características de las interfaces con el modo RBAC habilitado.


El usuario “root” no puede modificar la interfaz eth0

Para desactivar el sistema RBAC

gradm2 -D (ingresar la contraseña definida para el administrador)

Para conocer en que estado se encuentra RBAC

gradm2 -S

LISTAS DE CONTROL DE ACCESO

El sistema de control de acceso MAC de “grsecurity” esta implementado con listas de control de acceso ACL's, el administrador define restriciones sobre sujetos (recursos, procesos, archivos, etc.). Para cualquier evento, el “kernel” verifica las ACL's de MAC y las definidas en el estandar de Linux que manejan objetos.

ACL estandar de Linux (sentencia “getfacl”)


Objeto archivo “home/daniel”, objeto usuario y grupo “daniel”

Estructura de una ACL de “grsecurity”:


ARCHIVO DE POLITICAS PREDETERMINADO
“/etc/grsec2/policy”



Como se menciono anteriormente, la politica definida en el archivo predeterminado es bastante restrictiva. Si RBAC esta activo ningun usuario podrá acceder al programa “dmesg” y auditar el sistema.


“dmesg” operacion no permitida

ACTUALIZANDO LAS POLITICAS

La manera mas sencilla de actualizar las politicas para la ejecución de un determinado programa es a través del modo de aprendizaje de “grsecurity” en lugar de hacerlo manualmente.
Para el modo de aprendizaje, será necesario desactivar RBAC temporalmente desde la consola utilizando:

gradm2 -a admin
gradm2 -D

Como ya podemos ver el directorio y los archivos de “grsecurity”, añadimos al final del archivo “/etc/grsec2/policy” una entrada como la siguiente

Lo anterior oculta el directorio raiz a el proceso “dmesg” y elimina cualquier privilegio que pueda necesitar. La “l” junto al nombre del programa significa que se usará el modo de aprendizaje

Activamos RBAC en modo de aprendizaje

gradm2 -L /etc/grsec/learn_config -E

Ejecutamos el comando “dmesg”

dmesg

Si la orden tiene exito, “grsecurity” crea las entradas correpondientes en el registro de aprendizaje. Entonces utilizaremos “gradm2” para generar las ACL's para el programa “dmesg”, a partir de los datos obtenidos.

Desactivamos RBAC y el modo de aprendizaje

gradm2 -a admin
gradm2 -L /etc/grsec2/learn_config -O /etc/grsec2/learning.dmesg



Se creo el archivo “learning.dmesg” con las politicas para “dmesg”

Sustituimos en “/etc/grsec2/policy” la directiva de aprendizaje que inlcuimos para “dmesg” por el contenido de “learning.dmesg” y volvemos a inicar RBAC.

Ahora para “root”, es posible ejecutar el comando “dmesg” con RBAC activo.

Por ultimo definimos dentro de nuestras politicas que también el usuario “daniel” tenga derecho a auditar el sistema con “dmesg”.


Agregando al usuario “daniel”

Esta secuencia se puede seguir para cada programa que necesite permisos especiales para operar.

Mientras “grsecurity” este en modo de aprendizaje debemos asegurarnos de probar todas las operaciones que se vayan a necesitar para que se detecte que llamadas utilizan los procesos o que archivos del sistema se requieren.

CONCLUSION

“Grsegurity” brinda la posibilidad de crear un sistema que proporciona a cada proceso unicamente los permisos que necesita para hacer su trabajo: ni más, ni menos. “Grsegurity” brinda un control muy preciso sobre todo lo que se puede hacer en un sistema.

domingo, 23 de mayo de 2010

Enseñanza de la ingenieria de software

El concepto de ingeniería de software salió a la luz hacia finales de la década de 1960, cuando se observó que el desarrollo de grandes sistemas de software era un problema mas parecido a los problemas de ingeniería que a los matemáticos o de ciencias naturales. Desde entonces se han desarrollado varias prácticas importantes para el desarrollo de software como la ingeniería del software basada en componentes, la ingeniería de software orientada a objetos, la ingeniería del software del comercio electrónico cliente/servidor, la ingeniería del software asistida por computadora y la ingeniería Web.

A pesar de estos logros, la tarea de desarrollar grandes sistemas de software sigue siendo muy difícil. Todavía es común que los grandes sistemas se entreguen con retraso, cuesten más de lo previsto, sean poco confiables y estén documentados de manera inadecuada. Uno de los grandes problemas de la industria del software es que a pesar de que existen estándares, metodologías, técnicas, lineamientos y demás herramientas, estas no se emplean de manera generalizada, haciendo de esta industria algo menos que una artesanía. Además, los responsables de aplicarlas no tienen suficiente capacitación en ingeniería de software.

La educación en ingeniería de software ha sido tema de estudio de diversos autores y aunque sus enfoques difieren en detalle, el consenso es que la educación en este campo se debe basar en un firme fundamento teórico. Por otra parte, resulta evidente la necesidad de dar mayor importancia a la parte práctica de la ingeniería de software. Los currículum de informática y ciencias de la computación de la mayoría de las Universidades de todo el mundo incorporan la asignatura de ingeniería de software y sugieren que los alumnos desarrollen un proyecto de software completo. En este proceso de desarrollo, los alumnos pasan por todas las etapas que constituyen un proyecto de software hasta llegar a la entrega del producto final.

Tradicionalmente, donde los alumnos mejor asimilan los conceptos presentados en las clases teóricas es en las prácticas de laboratorio o en su caso la elaboración de trabajos prácticos, pero en la ingeniería de software hay que resolver los siguientes problemas; Los estudiantes de la ciencia de la computación carecen en los primeros años de su carrera de madurez o experiencia para percibir que los grandes sistemas de software no son simples versiones a escala de los programas que escriben como ejercicios educativos. Solo hacia el final de su carrera, después de adquirir experiencia en escribir programas y de utilizar sistemas de software prácticos, comprenden que la ingeniería de software no es lo mismo que la programación de computadoras. Además, considerando que el proceso de desarrollo de sistemas de software toma mucho tiempo resulta difícil simular el proceso de una manera realista en el tiempo disponible para los estudiantes de licenciatura. Este hecho, por si solo, ha ocasionado que los cursos se concentren en aspectos particulares del desarrollo de software sin considerar el tema como un todo. Sin embargo, y debido a que mucha de la teoría de la ingeniería de software se aborda durante el estudio de la ciencia de la computación, el enfoque de la enseñanza de la ingeniería de software debe ser práctico demostrando cómo se puede aplicar la teoría y como resulta un instrumento útil en este campo.

lunes, 2 de noviembre de 2009

domingo, 18 de octubre de 2009

Instalando módulos en Ruby

RubyGems es un administrador de paquetes cuyo objetivo es distribuir programas o bibliotecas de código en Ruby. Entre sus principales funciones destacan:
  • Instalar paquetes a distancia
  • Admnistrar dependencias de los paquetes
  • Desinstalar de forma facil

Opciones del instalador de paquetes

  • gem list muestra los paquetes instalados
  • gem install nombrepaquete instala paquete y sus dependencias
  • gem unistall nombrepaquete desinstala el paquete
  • gem help commands lista completa de todas las opciones


Modulo de acceso a bases de datos


Poco podemos hacer con cualquier lenguaje de programación si no tenemos acceso a nuestras bases de datos.


Para esta tarea Ruby cuenta con varias opciones, una de ellas es DBI, disponible también para los lenguajes Perl y Phyton. DBI es una interfaz independiente que permite interactuar con distintas bases de datos como Oracle, Sybase, Informix, Mysql, SQLServer y Access.


DBI tambien tiene soporte para ODBC, tecnología todavía muy extendida al igual que su uso.


Para instalar el módulo DBI, desde el administrador de paquetes dar la instrucción:


gem install dbi


Para verificar si el módulo fue instalado utilizar gem list.

sábado, 17 de octubre de 2009

Instalación y prueba del interprete de Ruby

Ruby es un lenguaje de programación orientado a objetos creado por el Japonés Yukihiro Matsumoto que presento su versión inicial en 1995.

Existen distribuciones para los distintos sistemas operativos, hasta este momento pueden descargarse de la dirección http://www.ruby-lang.org/es/downloads/. One-click Installer es la mejor opción para instalar en Windows y de inmediato ponerse a trabajar.

Despues de instalar tenemos:

  • fxri que es el interprete de Ruby con ayuda interactiva
  • SciTE que es un IDE de desarrollo

  • RubyGems que tiene la documentación y el administrador de paquetes

El lado izquiero del intérprete permite conocer las principales clases, sus métodos y propiedades.

El IDE SciTE es un entorno de desarrollo donde podemos administrar nuestros programas como archivos.


Para ejecutar el programa anterior simplemente presionar F5 y esperar el resultado del lado derecho.

El programa anterior define un objeto a (linea 2). Por cada elemento del objeto (linea 4), se imprime su valor (linea 5).