jueves, 7 de agosto de 2008

Gestión de requerimientos II

Abordaremos someramente el tratamiento de los requerimientos. En particular cómo:
- apuntarlos y documentarlos
- abstraerlos en casos de uso tradicionales
- manejarlos y fusionarlos con otros análisis:
   1.- requerimientos funcionales y no funcionales
   2.- matriz de requerimientos
   3.- priorización de los requerimientos.

Apuntar y documentar requerimientos


Hay muchas maneras, desde muy metodológicas a muy informales, de documentar los requerimientos.
Yo utilizo fundamentalmente las historias de usuario.
Una historia de usuario tiene los siguientes elementos:
1.-Identificador
2.-Título
3.-Historia
4.-Notas

El identificador lo suelo poner como F1,F2,F3... para las historias que conllevan requerimientos funcionales, y NF1, NF2... para las que conllevan no funcionales (veremos qué es un requerimiento funcional y otro no funcional en breve).

El título tiene una frase cortísima que me permite recordar el requerimiento de un vistazo (yo soy muy malo recordando siglas y números).

La historia explica el requerimiento. O bien de forma clara, breve y concisa ("el sistema debe permitir editar las fichas de los productos y que queden todas las operaciones registradas") o bien en forma tradicional de historia ("como gerente de productos debo poder editar las fichas de los productos para hacer las modificaciones que necesite y todas las operaciones han de quedar guardadas").

En notas voy apuntando todo lo que se me va ocurriendo del requerimiento, clarificaciones, cuestiones de desarrollo, etc. Con fecha, autor y texto.

Abstracción a casos de uso


En algunas ocasiones es necesario (bien por requerimientos de la compañía, bien para generar una documentación interesante y vendible, bien por gusto) hacer una agrupación de los requerimientos en casos de uso al estilo RUP o al estilo Cockburn.

Lo que yo hago en este caso es seleccionar los actores intervinientes en todos los requerimientos y agrupar los mismos en función de estos actores. Luego, usando el sentido común, agrupo los requerimientos en un mismo caso de uso.

La descripción del caso de uso viene de manera natural a la vista de los requerimientos que lo conforman (¡no más de diez!) y es cuando, según Cockburn, yo los documento.

Otros análisis sobre los requerimientos


Estamos viendo que todas las acciones sobre los requisitos nos van sirviendo para ir dándoles forma y que ésta es una labor continua, sin una fase claramente delimitada.
Entre las otras acciones que podemos hacer para "amasar" los requerimientos están:

Distinción en requerimientos funcionales y no funcionales


En breve, los requerimientos funcionales son los que aportan valor al producto. Los no funcionales son el lastre con el que tenemos que contar pero que no aportan nada visible; sin embargo, de no encontrarse, se echarían en falta.
Tadicionalmente, los requerimientos no funcionales ser refieren a:
 
Disponibilidad
Certificación
Dependencia de otras partes
Documentación
Eficiencia
Ser extensible
Aspectos legales y de licencias
Mantenimiento
Performance
Plataforma
Precio
Calidad
Necesidad de recursos
Seguridad
Compatibilidad
Estabilidad
Soporte.

Matriz de requerimientos


Siguiendo con nuestras técnicas de manipulación, podemos interrelacionar los requerimientos entre ellos, con los casos de uso y con los elementos del software que vamos creando (por ejemplo pantallas, APIs, módulos o cualquier agrupación que hagamos) por medio de matrices.

Una matriz de requerimientos tiene en un eje los requerimientos y en el otro los otros requerimientos, los casos de uso o los elementos funcionales. En sus entradas aparecerá o una X cuando haya cierta relación de relevancia o un valor (habitualmente 1,3,9) que indique esa relación y su grado.

Así sabremos cuáles son los requerimientos con mayor influencia sobre los casos de uso, los que tienen un mayor impacto a la hora de ser cambiados sobre los elementos funcionales o los que se relacionan con otros requerimientos formando una malla.
Lo ideal a nivel de gestión del cambio de requerimientos es que los requerimientos sean ortogonales (es decir, la matriz requerimientos-requerimientos sea diagonal), porque elimina la necesidad de estudiar el impacto de un cambio en los requisitos.

Priorización


Si pensamos que todos los requerimientos han quedado absolutamente claros y puestos de manifiesto y que vamos a ser capaces de desarrollarlos completamente en el tiempo esperado, la priorización sobra.
Quizás sea por eso por lo que cuesta tanto extraer de las personas sobre las que pesa la decisión de impulsar el proyecto y de obtener el mayor beneficio de él una priorización: estamos obligándo a asumir que no todo es evidente ni claro ni completo ni predecible. En definitiva, les estamos forzando a que asuman como cierto el riesgo inherente en el proceso de fabricación de software... algo que es verdadero, en definitiva.

Como la gestión de los requerimientos surge de la falta de precisión implicita en todo proyecto de software, es evidente que una parte de esa gestión será la priorización: ¿qué queremos que se clarifique con mayor prioridad?.

En definitiva, priorizar los requerimientos es también un paso conducente a clarificarlos, porque nos ayuda a determinar qué se espera realmente del software por hacer. También nos sirve de vehículo de comunicación con los promotores: es posible hacer una plan de ruta claro en los objetivos. Y sirve para dotar de mayor control a los promotores del proyecto, que pueden detenerlo cuando estén satisfechos con los objetivos.

En conclusión, debemos vender la necesaria priorización de requisitos con la idea de que aportan:
- un plan de releases claro en los objetivos y aproximado en el tiempo
- una vía para clarificar requerimientos: qué se espera del producto
- mayor control a los promotores del proyecto: viibilidad y capacidad para detener el proyecto

viernes, 1 de agosto de 2008


X-509 PKI



Entendemos por PKI el marco para mantener/revocar/usar certificados confirmados por un tercero.



X509 es un conjunto de especificaciones de la IETF y la ISO/IEC/ITU-T definido en el rfc2459. Vamos a centrarnos en el X509 v3, que añade a las versiones anteriores la capacidad de autofirmar un certificado, añadir extensiones a un certificado.



X509 inicialmente tenía que ver con X-500 (que versa sobre directorios compartidos), pero ahora ni siquiera lo necesita.
Aunque se publicó y desarrolló al mismo tiempo (en 1988), el X500 ha quedado
sin implementar compeltamente.



En el rfc3280 se recoge la estructura y las listas de revocación (CRL), parte imprescindible en una PKI.





Estructura interna



A grandes rasgos, tenemos


  1. Certificado:

    • Version (1 a 3)

    • Número de serie

    • Algoritmos relacionados con la parte pública del certificado


  2. Algoritmo que se ha usado para firmar el certificado.

  3. Firma del certificado.






Explicación detallada:


Version: 1, 2 ó 3
Número de serie:
asignado por la CA
permite a la CA asociar el certificado con un identificador
es imprescindible para listar la CRLs
Identificador del Algortimo de firma:
sirve para saber qué algortimo se ha usado en la firma del paquete
X509
CA:
Autoridad certificadora, en formato X500
Validez:
ventana temporal para la que ha sido verificado
Identidad:
entidad cuya clave pública se está certificando
en formato X500
Clave pública:
clave pública de la entidad que se está firmando
con diversos subcampos:
algortimo de cifrado (DSA, RSA)
clave pública en sí misma
Extensiones:
según la versión puede haber uno o más campos de información adicional
Firma:
firma del contenido anterior, con el algoritmo dado en el tercer
campo usando la clave privada de la CA.



Los algoritmos de firmado y cifrado soportados por el estándar X509 son MD2, MD5 y SHA1 y RSA y DSA respectivamente.




Para los algoritmos de clave pública, se reconocen las llaves RSA, DSA y el mecanismo de intercambio Diffie-Hellman.






Extensiones



Los campos "Extensiones" en el certificado X509 permiten a las CAs añadir su propia información.



Para un certificado X509 "autofirmado", los campos con la


Identidad,
Clave pública
Extensiones

desaparecen y el campo de la CA puede referirse a cualquier entidad.







Listas de Revocación (CRL)



Hay un tipo de extensión, llamada "CRLDistributionPoints", que indica la URI donde puede encontrarse la lista de revocación de certificados de la CA que firma el certificado.



La version 3 del X509, definió tambien los delta-CRL, que son no publicaciones enteras de las listas de revocación sino simples modificaciones incrementales.



En cualquier caso, en el RFC3280 se define el formato que tienen que tener las CRLs.




En general, hay tres métodos para estar actualizado de las CRL:


1.- muestrear periódicamente las CRLs publicadas por cada CA
2.- esperar el anuncio de la CA sobre la CRL nueva
3.- verificar en el momento la CRL de la CA que firma el certificado

El tercer método es el mejor, pero es el más costoso para las CAs. De ahí que ciertas operaciones se deleguen en las RA para estas cuestiones.




Las CRL para el formato X509 contienen:


Version de certificados anulados
Identificador del algoritmo que firma la CRL
Identidad de la CA
Fecha y hora de la CRL
Próxima fecha en la que se publicará una CRL
Extensiones a la CRL
Lista de certificados revocados:
identificador de certificado
fecha de revocación
motivo (unspecified, cese de operaciones, cambio de afiliación,
sustituido, temporalmente suspendido,
eliminado definitavemente)



Ejemplo de CRL:


Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: /C=CL/O=REUNACA/CN=REUNA Certification Authority
Last Update: May 6 12:54:53 2008 GMT
Next Update: Jun 5 12:54:53 2008 GMT
CRL extensions:
X509v3 Authority Key Identifier:
keyid:A3:AE:48:8E:B9:C1:8E:B1:92:AA:5E:0C:D0:DC:9D:4B:05:2E:2C:57

X509v3 CRL Number:
16
Revoked Certificates:
Serial Number: 02
Revocation Date: May 15 15:39:41 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 03
Revocation Date: May 16 12:46:19 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Cessation Of Operation
Serial Number: 07
Revocation Date: Dec 11 11:36:13 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 08
Revocation Date: Oct 10 11:57:50 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 0A
Revocation Date: Oct 11 12:30:32 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 0B
Revocation Date: Dec 11 11:38:57 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 0C
Revocation Date: Dec 11 11:39:49 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 0D
Revocation Date: Dec 11 11:37:10 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 0E
Revocation Date: Oct 11 13:01:51 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 12
Revocation Date: Dec 11 12:43:19 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 13
Revocation Date: Dec 11 12:44:45 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 14
Revocation Date: Nov 7 15:30:14 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 16
Revocation Date: Dec 11 11:46:32 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 17
Revocation Date: Dec 11 12:49:25 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 18
Revocation Date: Dec 11 11:42:03 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 1C
Revocation Date: Dec 11 11:42:59 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 1D
Revocation Date: Dec 11 12:38:49 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 1F
Revocation Date: Dec 12 16:25:44 2007 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Serial Number: 36
Revocation Date: Mar 7 10:52:10 2008 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Unspecified
Signature Algorithm: sha1WithRSAEncryption
0e:2b:49:e3:30:7e:80:18:4e:3c:3b:b4:ea:25:99:26:eb:9f:
f9:ff:ee:70:12:f0:ac:18:43:94:64:64:37:e3:17:85:fd:24:
5d:b9:81:9f:a4:69:62:63:67:1d:86:94:c1:d3:e5:1c:48:6c:
56:a0:cc:96:a4:b3:9a:72:1d:5b:5c:0a:c2:46:10:76:81:b8:
1a:af:d8:23:2f:66:f5:07:54:0f:20:91:d0:da:da:4d:ba:80:
85:92:8f:f8:e0:da:24:8b:42:bd:b2:d4:d8:9d:f1:bc:d8:23:
77:19:3b:99:29:98:ef:e2:b1:2c:61:14:bb:27:2d:95:8f:e7:
7f:19:30:2f:5c:ab:ae:9f:07:0e:a9:6a:fd:c9:f9:b1:d6:38:
00:e7:86:71:7a:04:8b:9b:17:fa:b4:f8:f3:17:f1:c5:38:02:
ce:c9:f4:73:0e:ee:14:26:dc:f9:9a:53:61:a9:5e:f0:a2:5f:
bf:46:25:d8:0f:80:65:42:52:b1:c4:bd:52:52:48:13:af:f5:
45:63:c1:ea:bf:4b:26:a7:5c:94:e9:e1:fa:07:38:07:4b:94:
4a:34:d9:f3:39:e4:2d:7e:cd:a2:06:5a:86:09:8b:37:9f:46:
e5:68:55:e2:86:af:8b:97:5d:46:72:c0:5d:45:67:24:38:1a:
af:e3:bb:47
-----BEGIN X509 CRL-----
MIIETDCCAzQCAQEwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0wxEDAOBgNV
BAoTB1JFVU5BQ0ExJjAkBgNVBAMTHVJFVU5BIENlcnRpZmljYXRpb24gQXV0aG9y
aXR5Fw0wODA1MDYxMjU0NTNaFw0wODA2MDUxMjU0NTNaMIIChjAgAgECFw0wNzA1
MTUxNTM5NDFaMAwwCgYDVR0VBAMKAQAwIAIBAxcNMDcwNTE2MTI0NjE5WjAMMAoG
A1UdFQQDCgEFMCACAQcXDTA3MTIxMTExMzYxM1owDDAKBgNVHRUEAwoBADAgAgEI
Fw0wNzEwMTAxMTU3NTBaMAwwCgYDVR0VBAMKAQAwIAIBChcNMDcxMDExMTIzMDMy
WjAMMAoGA1UdFQQDCgEAMCACAQsXDTA3MTIxMTExMzg1N1owDDAKBgNVHRUEAwoB
ADAgAgEMFw0wNzEyMTExMTM5NDlaMAwwCgYDVR0VBAMKAQAwIAIBDRcNMDcxMjEx
MTEzNzEwWjAMMAoGA1UdFQQDCgEAMCACAQ4XDTA3MTAxMTEzMDE1MVowDDAKBgNV
HRUEAwoBADAgAgESFw0wNzEyMTExMjQzMTlaMAwwCgYDVR0VBAMKAQAwIAIBExcN
MDcxMjExMTI0NDQ1WjAMMAoGA1UdFQQDCgEAMCACARQXDTA3MTEwNzE1MzAxNFow
DDAKBgNVHRUEAwoBADAgAgEWFw0wNzEyMTExMTQ2MzJaMAwwCgYDVR0VBAMKAQAw
IAIBFxcNMDcxMjExMTI0OTI1WjAMMAoGA1UdFQQDCgEAMCACARgXDTA3MTIxMTEx
NDIwM1owDDAKBgNVHRUEAwoBADAgAgEcFw0wNzEyMTExMTQyNTlaMAwwCgYDVR0V
BAMKAQAwIAIBHRcNMDcxMjExMTIzODQ5WjAMMAoGA1UdFQQDCgEAMCACAR8XDTA3
AIBFxcNMDcxMjExMTI0OTI1WjAMMAoGA1UdFQQDCgEAMCACARgXDTA3MTIxMTEx
NDIwM1owDDAKBgNVHRUEAwoBADAgAgEcFw0wNzEyMTExMTQyNTlaMAwwCgYDVR0V
BAMKAQAwIAIBHRcNMDcxMjExMTIzODQ5WjAMMAoGA1UdFQQDCgEAMCACAR8XDTA3
MTIxMjE2MjU0NFowDDAKBgNVHRUEAwoBADAgAgE2Fw0wODAzMDcxMDUyMTBaMAww
CgYDVR0VBAMKAQCgLzAtMB8GA1UdIwQYMBaAFKOuSI65wY6xkqpeDNDcnUsFLixX
MAoGA1UdFAQDAgEQMA0GCSqGSIb3DQEBBQUAA4IBAQAOK0njMH6AGE48O7TqJZkm
65/5/+5wEvCsGEOUZGQ34xeF/SRduYGfpGliY2cdhpTB0+UcSGxWoMyWpLOach1b
XArCRhB2gbgar9gjL2b1B1QPIJHQ2tpNuoCFko/44Noki0K9stTYnfG82CN3GTuZ
KZjv4rEsYRS7Jy2Vj+d/GTAvXKuunwcOqWr9yfmx1jgA54ZxegSLmxf6tPjzF/HF
OALOyfRzDu4UJtz5mlNhqV7wol+/RiXYD4BlQlKxxL1SUkgTr/VFY8Hqv0smp1yU
6eH6BzgHS5RKNNnzOeQtfs2iBlqGCYs3n0blaFXihq+Ll11GcsBdRWckOBqv47tH
-----END X509 CRL-----

sábado, 12 de julio de 2008

Gestión de requerimientos I

Comenzamos la serie de artículos sobre gestión de requerimientos en software de seguro con la explicación de la orientación general sobre la manipulación de los mismos que daremos en adelante.

La primera de las premisas es que

los requerimientos cambian durante el proyecto

según la cual debemos estar dispuestos a aceptar modificaciones en los requerimientos según avanza el desarrollo.
Porque aunque estemos seguros de la idea que se tiene sobre el proyecto, aunque haya un acuerdo completo en lo esperado, los requisitos son una de las formas de verbalizar esta idea. ¿Qué ocurre? Que la verbalización puede no ser absolutamente precisa al principio y ha de ser refinada a medida que pasa el tiempo o bien puede que no exista ninguna manera de formalizarla. Así que es muy importante que tengamos en cuenta que

los requerimientos son una posible aproximación a lo esperado del sistema.

La manera de ir refinando los requerimientos en conjunto es comunicar de manera fluida con los involucrados en el proyecto, y ello implica identificarlos, temporizar y personalizar los mensajes y tramitar las respuestas.

Consecuentemente, hemos de

enmarcar los requerimientos en un Plan de Requerimientos

que contendrá los siguientes elementos:
  1. Un sumario del proyecto

  2. Personas y roles involucrados

    • Proveedores de requerimientos

    • Interesados en el éxito

    • Responsables de aprobación
    •  
    • Interesados colaterales

    • Reticencias posibles y apoyos residuales


  3. Modelo de gestión de los requerimientos

    • Planificación temporal de tratamiento

    • Esbozo del Plan de Gestión de Cambios

  4. Esbozo del Plan de Comunicación

Simultáneamente, deberíamos conformar dos planes adicionales, perfectamente reutilizables entre proyectos (y que acabarán constituyendo parte del estilo de desarrollo del equipo):
  1. Plan de Gestion de Cambios

  2. Plan de Comunicación
En sucesivos artículos entraremos en la descripción detallada de los elementos de estos dos planes junto con el Plan de Requerimientos global.

Los problemas que suelen encontrarse como manifestaciones de una deficiente gestión de los requerimientos, son de sobra conocidos y atribuidos habitualmente a la hipotética crisis del software:
    ➡ Requerimientos incompletos o poco claros
    ➡ Requerimientos cambian muy a menudo
    ➡ Todo tiene la misma prioridad
    ➡ Retraso en la implantación que se aprovecha para añadir más requerimientos
    ➡ Cliente y otros interesados empiezan a ignorar el desarrollo del proyecto
    ➡ Preocupación desorbitada por el presupuesto excedido

Ante estos indicios, podemos extraer una serie de conclusiones parciales sobre la importancia que tiene la manipulación correcta de los requerimientos:
  • Escuchar a los usuarios, promotore e interesados NO es suficiente
  • No se ha de comenzar demasiado pronto
  • No se ha de comenzar demasiado tarde
  • Aprovechemos todas las herramientas para nuestro beneficio
  • Flexibilidad y aceptación del cambio
Evidentemente, si pensamos que los requerimientos no son más que una de las expresiones posibles de las expectativas que un individuo o un conjunto de ellos tienen del sistema, queda claro que no basta con tomar nota de lo que se nos está pidiendo explícitamente. Hay que entender, proponer, sintetizar, eliminar redundancias, buscar relaciones y prioridades, siempre involucrando a los personajes relacionados con el proyecto. Los requerimientos irán surgiendo, refinándose o desapareciendo a lo largo del tiempo de vida del desarrollo del proyecto. Así que nuestra vida será más fácil si los contemplamos como un fruto del proceso de desarrollo mismo: además de la ya vista evolución fluida de los requisitos

son un fruto también del equipo de desarrollo.

El riesgo derivado del inicio temprano o tardío de la codificación, pruebas u otras actividades tradicionalmente consideradas como productivas, lo veremos en la lista de patrones y antipatrones adaptados a la gestión de los requerimientos. Obtendremos un listado de herramientas útiles para la extracción, análisis y manipulación de los requerimientos, así como la repercusión en los distintos modelos de desarrollo de software ágil. Para poder hacer realidad la flexibilidad ante el cambio, tendremos la aplicación de los planes, herramientas y patrones anteriores explicada en detalle adaptándola a este fin.

Algoritmos de Hashing




Definición



Criptográficamente, entendemos por funcion hash
una aplicación de cifrado en la que el mensaje no se puede recuperar. Más ampliamente, las funciones hash son funciones
de resumen de contenido y reciben, en criptografía, también el
nombre de digest.



Una función hash perfecta es aquella que mapea diferentes
valores de origen en diferentes valores destino. Claro está que
no puede ser perfecta una función cuyo espacio de imágenes
sea más pequeño que el de actuación.



Las funciones hash utilizan habitualmente una serie de operaciones
combinadas y aplicadas reiteradamente sobre el valor de entrada:


  • truncamiento o extracción: elimnando una serie de bits
    del principio o el final del mensaje

  • modúlo: actuación en un grupo finito de las operaciones
    para conseguir el hash

  • selección: tomcar una serie de posiciones fijas del
    mensaje, despreciando el resto

  • cambio de base: representación del mensaje en una
    base diferente a la original.

  • doblamiento: división del mensaje en varias partes de igual
    tamaño y aplicación de determinada operación entre las partes
    para obtener como resultado algo de igual tamaño que los
    fragmentos tomados.

  • multiplicación: multiplicar el valor del mensaje truncándolo
    o reduciéndolo módulo una constante.


Esta lista está más bien obtenida a partir de los más representativos
mecanismos de cálculo de hashes; es decir, no excluyen que haya
algoritmos de hashing que no utilicen estos elementos.






Utilizaciones



El más elemental de los usos es para el almacenamiento y
localización de objetos:


  • arrays asociativos

  • buscadores en redes P2P: DHT


Para estas aplicaciones cuestiones tales como el número de
colisiones o el conocimiento o no de la inversa de la función hash
no son tan relevantes en tanto en cuanto no es la seguridad
el objetivo buscado.



En criptografía, hay ocasiones en las que cifrar el mensaje
entero es sumamente pesado y realmente innecesario. En estos
casos se utilizan funciones hash que convierten un mensaje de
tamaño ilimitado a priori en un valor acotado. Es importante
en este caso que no sea factible encontrar una inversa para la
función hash y que la probabilidad de colisiones se lo más baja
posible. También, para evitar reconstruir la inversa de la
función por fuerza bruta, las funciones hash utilizadas con esta
finalidad han de ser pesadas, es decir, que el tiempo empleado
en calcular no sea muy poco y no pueda ser reducido.



Para almacenar claves, en conformidad con los preceptos
expresados en la LOPD (artículo 93.3, BOE núm 17 de
19 de enero de 2008), por ejemplo, se requiere que no
puedan ser descubiertas aunque se acceda a lugar donde se guardan éstas. Aunque existen varias maneras, la forma más simplificada consiste en recordar el hash de la clave del
usuario. En este caso buscamos la minimización de colisiones
y una gran dispersión de valores próximos, frente a otras
caracterísitcas como reducción del espacio ocupado por
el valor hash frente al valor original o la velocidad
de cómputo.



La aplciación a criptografía para verificar la autenticida
d de un
mensaje se conoce con el nombre de HMAC (del inglés
keyed-Hash Message Authentication Code). Una HMAC utiliza una
clave privada y una función hash para demostrar que el mensaje
no ha sido alterado desde que lo generara el propietario de la clave privada.



Matemáticamente, un HMAC es


HMACk(msg) = h((K ^ opad) | (K ^ ipad) | msg)

siendo ipad=0x36363636...36 y
opad=0x5c5c5c...5c
(secuencia de bits impares y pares),
h una función hash criptográfica y K la clave privada.




Características deseables



Ante todo, la función hash de estar bien definida, es decir
el valor del hash ha de estar completamente determinado a partir de
los datos a resumir. Es la única manera de que la función hash
pueda ser utilizada para comprobar la integridad de los datos
resumidos.



La función hash ha de utilizar completamente todos los
datos de entrada. La pretensión es que no haya colisiones a
priori definidas por la propia función hash.



La distribución de valores sobre el espacio de imagen ha de ser
uniforme. Si siguiera alguna distribución no uniforme,
habría una mayor probabilidad de colisionar para determinados
valores de entrada.



Ha de generar valores suficientemente diferentes para
valores de entrada muy similares. Lo que sería característico
de un problema mal puesto en mecánica es algo deseable
por tanto en cuanto desviamos las probabilidades de encontrar
colisiones.



En general, cualquier función que cumpla estas caracterísitcas
podemos encuadrarlas en el conjunto de funciones hash. Por las
particulares características pedidas a las funciones hash y
dada la dificultad de demostrar que se cumplen es habitual
utilizar algoritmos ya implementados y probados.


Por ejemplo, a modo de muestra de la infinidad de lista de funciones
hash tenemos:


  • Unix ELF hash:


    unsigned long hash(char *text) {
    unsigned long h = 0, g;
    while(*name) {
    h = (h<<4) + *name;
    *name++;
    g = h & 0xF0000000;
    if(g!=0) h^=g > 24;
    h &= ~g;
    }
    return h;
    }

  • Hash XOR:


    char XORhash(char *text, int len) {
    char hash;
    int i;
    for(hash=0, i=0; i<len; i++) hash=hash^key[i];
    return hash % 101;
    }


El espacio destino de estas funciones es muy reducido (8 bits en un
caso y 32 en el otro), lo que hace que para firmado sea poco
útiles. Sin embargo, para comprobar la integridad de contenidos
pequeños, o para su utilización en tablas hash y cuando hay
restricciones de cómputo son perfectamente
utilizables, cumpliendo las caracterísitcas pedidas (es un
interesante ejercicio demostrarlo).






Colisión



Se llama así, para una función hash dada, a la situación en la
que dos valores diferentes tienen el mismo valor hash.



Evidentemente, como el objetivo de las funciones hash es el
resumen de contenidos, el espacio imagen es menor que el espacio
de origen de la función. Incluso, en el caso más general,
el espacio inicial es ilimitadamente grande (por ejemplo, todas
los posibles secuencias de caracteres) mientras que el
destino está acotado (por ejemplo, el espacio de valores de
160 bits). Así que es trivial que habrá colisiones
inevitablemente. La cuestión es si las colisiones son predecibles
y hasta que punto. Cuando, dada una función hash, se
descubre un mecanismo para provocar las colisiones, se
dice que el sistema hash ha sido vulnerado.






Aleatoriedad



Los algoritmos de hash son, por definición predecibles. Es decir,
para la misma entrada, producen la misma salida.


Sin embargo, a la hora de utilizarlos para el firmado de documentos
o para almacenamiento seguro de contraseñas, conviene provocar la
dispersión aleatoria del hash generado, añadiendo al contenido
original un valor o valores aleatorios.



Si el generador de números aleatorios es predecible en algún sentido,
como ha ocurrido con el generador de OpenSSL de Debian
en mayo de 2008, el almacenamiento de claves y generación de
valores para identificadores de sesión con los que cifrar
queda seriamente comprometido.


jueves, 12 de junio de 2008

Gestión de Claves





Necesidades



Para entender que es la Getión de Claves, debemos tener en
cuenta las opciones frente a la manera de manipular las claves,
sobre todo privadas, que protegen nuestros certificados.



La más inocente de las formas es no guardar las claves.
Denominamos a esta manera de gestión al vuelo.
La segunda manera que veremos es el almacenamiento de claves
en algún soporte físico, lo que originará la necesidad
de mecanismos de protección y protocolos de manipulación
de éstas para que preserven tanto su integridad como su
confidencialidad y disponibilidad.



Así pues, concluiremos que la Gestión de Claves busca el
proveer de CIA (Confidencialidad-Integridad-Disponibilidad)
a las claves privadas que custodian nuestros certificados.
Un debilitamiento en el CIA sobre nuestras claves privadas
lleva inmediatamente a un debilitamiento en el CIA
consecuencia del uso de los certificados custodiados.



Desde un punto de vista méramente técnico, podemos encontrar
una forma de ejemplo de gestión de claves en la manera en
que SSH guarda los certificados en el directorio del usuario.





Gestión al vuelo



Hay dos razones poderosas para evitar la gesitón de claves
"al vuelo" (aun suponiendo que fuéramos capaces de
memorizarlas de alguna manera).



La primera es que prescindimos (por definición) del concepto
de memorización de la clave. De esta forma, cuando
cambiamos de clave, no hay forma de recuperar lo cifrado
con la clave antigua. La segunda es que no hay forma de
restituir las claves corrompidas o de comprobar su integridad.






Tipos de sistemas de gestión



Se impone por tanto la necesidad de implementar algún mecanismo
o sistema para gestionar las claves que supere los problemas
anteriores, guardando registro de los cambios efectuados en las
claves y permitiendo de alguna manera comprobar que no han sido
corrompidas sin que ello suponga un debilitamiento de la
Confidencialidad.



Tenemos de esta manera dos tipos principales de sistemas para
almacenar las claves privadas de nuestros certificados.
El primero de ellos es se basa en una única clave que
sirve para cifrar el contenido del conjunto de claves privadas.
Es evidente que descubrir esta clave implica acceder a todo
el repositorio de claves privadas y compromoter la Confidencialidad.
Esta es la forma, por ejemplo, en la que se guardan las claves
en el llavero de Gnome o de Leopard para un usuario.



La segunda familia de sistemas de almacenamiento de clave consiste
en cerrar el repositorio con una clave y volverlo a cerrar con
las claves individuales de los que tienen acceso. De esta manera
podemos también trazar y controlar el acceso al repositorio
de claves.






KMPS/KMP



En todo caso en imprescindible, antes de la aplicación de
medios técnicos, la definición de una Política de Gestión
de Claves
(KMP).
La KMP es un documento de alto nivel que indica los
objetivos de protección y autorización relativos a las claves,
las restricciones a aplicar a la generación, distribución,
uso y almacenamiento y revocación del material sujeto
a la política de gestión de claves.



No vamos a describir una política de ejemplo aquí, pero sí
hay que mencionar que hay de contener, además de los
objetivos antedichos, una relación de responsabilidades
organizativas exigibles en la relación con la Gestión
de Claves.



La cristalización de la KMP se produce en las Prácticas
de Gestión de Claves
(KMPS), que describe detalladamente
la forma de conseguir los objetivos propuestos, las
responsabildiades y los elementos que intervienen en concreto
en la Gestión de Claves de la organización. Para que
sea coherente con el KMP, debe referirse a él como una forma
de desarrollarlo. En esto, sigue la tendencia actual
en SGSI que exigen una serie de documentos a nivel Gerencial
o Estratégico y su concreción en Políticas y Procedimientos
descrito a nivel táctico o Técnico.



Es recomendable en extremo seguir las diversas guías de
"buenas prácticas" que publican los organismos encargados
de la difusión de la Gestión de la Seguridad de la Información
(NIST, NSA, FNMT, Isaca, I2C) relativos a la
gestión de claves e integrar estas prácticas dentro de las
empresariales como un elemento más y en el mismo sentido.







KMI



A la hora de implementar las políticas y procedimientos,
debemos contar una infraestructura que permita las actuaciones
recogidas. Esta infraestructura se donimina KMI
(Key Management Infraestructure) y consta de los siguientes
elementos principales:


  • COA (Autoridad Central de Supervisión)

  • KPF (Elementos de procesado de claves)

  • SA (Agentes)

  • CN (Client Nodes)

  • Usuarios finales



Las COAs se encargan coordinar las políticas y prácticas
de protección y documentación, proveyendo además servicios
como:


  • registro de información sobre los productos utilizados
    para la KM,

  • repositorio de políticas y especificaciones,

  • acciones relativas al comprimos de todas las claves.




Los elementos de procesado de claves (KPF) son piezas
externas que actúan como proveedores de servicios relativos
a las acciones necesarias para la Gestión de Claves. Entre
otras:


  • Adquisición de certificados

  • Distribución de certificados

  • Base de datos de la estructura relativa a los certificados
    y usuarios y secciones en la organización

  • Mantenimiento y distirbución de las CRLs y CKLs
    (listas de Claves Comprometidas)

  • Generación de registros de auditoría y control.




Los Agentes utilizan los elementos de procesado de claves
y son supervisados y gestionados de la COA para centralizar
los servicios que demandan los nodos clientes, como son:


  • registro

  • servicios de directorio

  • soporte de servicios de recuperación

  • asignación de privilegios y roles relativas a la gestión
    de claves

  • ayuda de primera línea relativa a la gestión de claves




Los nodos ciente (CN) ofrecen la interfaz para los gestores,
dispositivos y las aplicaciones que necesitan acceder a las
funciones relativas a la Gestión de Claves. Interactúan
con los Agentes para la obtención de los servicios que éstos
proporcionan. En concreto, por fijar ideas, los nodos pueden
ser programas o dispositivos instalados en estaciones de trabajo
que interactúan con los servidores que contienen los agentes.



Para cada tipo de usuario final, tendremos un tipo de nodo
cliente. Así por ejemplo, habrá nodos cliente para gestores
(con capacidades para manipular la gestión de las claves),
nodos cliente para distribuidores, para dispositivos y
para aplicaciones usuarias finales (que ofrecen los servicios
necesarios para el uso de las claves de manera
transparente y acorde con la KMP).







Funciones de la Gestión de Claves



Mostraremos una lista de puntos a tener en cuenta a la hora de administrar la Gestión de Claves, según las buenas pr&a
acute;cticas
publciadas por el NIST:


  • Identificación del material susctible de ser tratado
    por la Gestión de Claves, así como de la persona
    (o rol) encargado de esta identificación.

  • Identificación de la persona o personas encargados de
    las relaciones con la CA y la RA.

  • Descripción de los roles que tienen acceso a las claves
    motivos y permisos concretos:

    • Generación y adquisición de claves

    • Acuerdos con terceros sobre la compartición
      de material relativo con los certificados y lo relacionado
      con la Gestión de Claves
    • Diseño y gestión de la estructura de revocac
      ión y
      distribución de claves
    • Definición de los periodos de vida y recovación

    • Protección de las claves y material secreto

    • Procedimientos de emergencia para la revocación
      de material comprometido

    • Auditoría del material gestionado

    • Destrucción de los elementos revocados

    • Recuperación de claves dañadas o perdidas

    • Planes de contingencia y recuperación

    • Definición y control de la aplicación de los
      planes y políticas de Gestión de Claves


  • Estructura de la Gestión de Claves. Es decir,
    distribución, revocación y demás procesos relativos
    con las claves dentro de la organización.

  • KMP, en concreto breve descricpción de los
    siguientes procesos:
    • Generación de claves (estándars, requisitos, g
      uías)

    • Adquisición de claves: identificación de las fuentes de adquisición y procesos de incorporación.

    • Certificación cruzada y procesos de establecimiento
      de confianza con terceros certificados

    • Distribución y seguimiento del material

    • Rutinas de emergencia para revocar material
      comprometido

    • Procedimientos para garantizar la protección y el
      secreto de las claves, teniendo en cuenta las
      diversas situaciones a las que se ven expuestas

    • Procedimientos de destrucción

    • Procedimientos de auditoría

    • Procedimientos de recuperación y restauración

    • Procedimientos de cambio en la política y los
      procedimientos




sábado, 10 de mayo de 2008

Persepectivas pasadas de evolución de los Virus

Relectura de Investigación y Ciencia, año 1998, artículo "Guerra al Virus Informático". Y la verdad, es que no han dado ni una.
(Bueno, es una exageración, porque su explicación divulgativa de cómo funcionan los virus informáticos clásicos es muy intuitiva; pero de las predicciones, ni una).

Es divertido leer cosas como "conocemos algunos virus diseñados específicamente para Windows 95 y otros sistemas de 32 bits, aunque no es probable que estos virus lleguen a generalizarse" o que "en general, sólo se comparten programas y datos con muy pocas personas, en su mayoría dentro de grupos definidos". Y a la vez enternecedor. Porque distintas ideas pero igual de equivocadas podemos tener ahora sobre la Seguridad Informática.

Pero al menos hemos aprendido algo: la seguridad como reacción frente a una amenaza concreta está condenada al fracaso a largo plazo. Eso no quiere decir que no se puedan establecer beneficiosos negocios sobre la base de la solución de un problema actual. Pero teniendo muy en mente que al final, esta solución quedará desviada y entonces, una vez perdida la primera de las intenciones, quedarán los restos. Entre estos restos, si conseguimos aportar algo en especial valorable y apreciable, nuestra solución pervivirá. Si no, morirá con el fin del problema que la ocasionó.

Por ejemplo, si la industria antivirus hubiese caminado hacia la monitorización del sistema y la inferencia de patrones de comportamiento de nuestros equipos, al día de hoy tendríamos los mismos problemas con los virus pero, al menos, la capacidad de saber si se nos está quedando pequeño el ordenador de casa o si realmente no lo usamos más que para leer el correo web.

A propósito del Phishing: no news... no good news



La ausencia de noticias llamativas sobre phishing en España, no es inidicativo de ausencia de evolución en este tipo de ataques ni de desaparición de la amenaza.
Más aún, si estamos un poco atentos a los movimientos que se siguen produciendo (ver noticia de la Asociación de Internautas), sabemos que dos bancos españoles (ING y Bankinter) están en este momento en el punto de mira de un kit muy concreto para este tipo de ataques. Sin embargo, ninguno de ambos bancos notifica a sus clientes que estén
sobreaviso ante el real y concreto peligro de estafa, lo que no deja en muy buen lugar sus políticas de seguridad informática...
Más aún cuando el Banco de España considera que son las entidades bancarias las responsables de estos hechos.

¿Por qué? Porque el ataque por Phishing se sigue considerando (erróneamente según demuestran los datos) como un fallo de seguridad del usuario, y que sólo afecta a usuarios poco concienciados con la Seguridad de la Información.

No es cierto. Tenemos Phishing para todos los estratos socio-empresariales y para todos los niveles de preparación: phishings para CIOs, phishings inofensivos (como encuestas de calidad), kits para que cualquier scriptkiddy pueda atacar nuestra imagen.

Como muy bien comentaba el Comandante D. Juan Salom, del GDT, en ya en 2006 , las medidas antiPhishing basadas en la detección de los sites fraudulentos y su cierre son ineficaces (lo corrobora el RockPhishing iniciado en verano de 2007 y aún no resuelto -ver la wikipedia, que ya lo recoge como conocimiento-): la única vía eficaz es la protección del usuario.



Desde Tasecurity.net estamos comenzando a desarrollar una herramienta antiPhishing, gratuita, que basa su eficacia no en la detección de sites engañosos sino en la confirmación de sites confiables y en asistir inteligentemente al usuario de las conexiones potencialmente dañinas o de aquellas en las que confiar. Cuando tengamos algo completo, lo publicaremos ampliamente, dado el gran interés y utilidad que parece tendrá.

viernes, 2 de mayo de 2008

COFEE: la llave USB de Microsoft para explotar vulnerabilidades de Windows

El revuelo levantado por la noticia comunicando el reparto por Microsoft de una llave USB con la intención de que la policía pueda acceder a los contenidos de los sistemas Windows corresponde, en nuestra opinión, más a la reiteración de una forma de actuación de Microsoft que a un problema real de seguridad.

Veamos:
a.- la llave tiene una serie de herramientas para hacer saltar las claves de los usuarios de Windows: cosa nada nueva y que sólo remarca la debilidad del sistema NTLS
b.- también contiene algunas utilidades para recabar información sobre el uso del sistema (entradas del registro, ficheros guardados...); nada especialmente complicado
c.- posiblemente utiliza información sobre el funcionamiento del sistema que todavía no ha sido descubierta, pero que será cuestión de tiempo
d.- cualquiera puede hacerse su propia llave juntando las herramientas que hay por la red. De hecho, desde Tasecurity estamos confeccionando una llave parecida

En definitiva, la llave no explota ningún agujero de seguridad de Windows. Simplemente recopila información y facilita el tomar esa información "en caliente", sin tener que apagar el equipo (lo que podría imposibilitar acceder a particiones cifradas en el futuro). Así que su existencia no es un problema de seguridad.

Sin embargo, que Microsoft haga este tipo de cosas de manera, como viene siendo habitual, oculta y escondida para sus clientes no hace sino minar la confianza en la seguridad global aportada por Microsoft, además de hacer un flaco favor a los propios investigadores: ahora "los malos" empezarán a usar otros sistemas operativos. Sinceramente, Microsoft no parece el ejemplo a seguir en cuanto a estrategia de Seguridad de la Información.

miércoles, 30 de abril de 2008

Brevísima introducción a la Arquitectura de Seguridad

De nuevo viendo Isaca y sus artículos públicos, nos encontramos con éste en el que, de manera sencilla, se nos describen los elementos de la Arquitectura de Seguridad, cómo manejar el proceso de creación de esta arquitectura y una breve lista de puntos mínimos que debería tener.

domingo, 23 de marzo de 2008

Seguridad de la Información: derecho a la protección de la información personal

No estamos diciendo nada nuevo. Como pueden ver, ya en 2005, en el 27º Congreso Internacional de Protección de Datos, se recogieron los principios fundamentales de la protección de datos personales:
- Principio de legalidad y adecuada recolección y procesado.
- Principio de limitación a un propósito y especificación de éste
- Principio de proporcionalidad
- Principio de transparencia
- Principio de participación individual y del derecho de acceso
- Principio de no discriminación
- Principio de supervisión independiente
- Principio de seguridad en los datos
- Principio de veracidad
- Principio de responsabilidad
- Principio del adecuado nivel de protección


Estos principios fueron firmados por todas las Agencias Reguladoras Europeas. ¿Qué quiere esto decir? Al no existir en Europa una ley similar a la SOX, sino diferentes regulaciones y leyes dispersas que se fijan en problemas similares, hemos de recurrir a la presencia de estas Agencias Reguladoras para el control del cumplimiento de los principios.

Para estas Agencias Públicas, es una obligación de las compañías y entes públicos el cumplimiento de los objetivos de la Seguridad de la Información (y sus ideas clave como el Gobierno de la Seguridad, el Análisis del Riesgo, los Planes de Continuidad).

domingo, 16 de marzo de 2008

Nuevo triunfo del equipo de atletismo de Tasecurity

La Media Maratón Universitaria de Madrid, celebrada este 16 de marzo en la capital, ha terminado con otro triunfo para el Equipo de Tasecurity al coronar el primer puesto absoluto masculino y el segundo puesto femenino.

¡Enhorabuena!

sábado, 1 de marzo de 2008

Gestión de la Seguridad bajo demanda

Paisley, compañía dedicada a ofrecer servicios de valor en Seguridad Informática, ofrece una herramienta llamada "GRC on demand" para gestión de la seguridad en modo servicio.

Según Gartner, la próxima generación de servicios de Seguridad de la Información tendrá el distintivo de ser proporcionados en modo servicio.

Más información sobre GRC, aquí.

lunes, 4 de febrero de 2008

Triunfo en el Maratón-cross por equipos Ekiden 2008

El equipo de Tasecurity ha conseguido la primera plaza en el pasado Maratón Cross por equipos organizado por Ekiden y celebrado en la madrileña localidad de San Sebastián de los Reyes, el 2 de febrero de 2008.


viernes, 25 de enero de 2008

PRIAMOS

Hoy he descubierto (practicando un poco el idioma sueco recién aprendido) un detector de vulnerabilidades tipo sqlinjection, gratuito, llamado Priamos, y que se puede encontrar en Priamos-Project

Al parecer, ha sido utilizado para extraer bastante información sensible de las bases de datos del ejército norteamericano (http://www.flashback.info/showthread.php?t=608727&page=7).