viernes, 14 de junio de 2013

INGENIERIA DE SOFTWARE



Seguridad en Ingeniería de Software


La seguridad de un sistema de software es un concepto multi-dimensional. Las múltiples dimensiones de la seguridad
Son:

·         Autenticación: el proceso de verificar la identidad de una entidad.
·         Control de acceso: el proceso de regular las clases de acceso que una entidadtiene sobre los recursos.
·         Auditoria: un registro cronológico de los eventos relevantes a la seguridad deun sistema. Este registro puede luego examinarse para reconstruir unescenario en particular.
·         Confidencialidad: la propiedad de que cierta información no esté disponible aciertas entidades.
·         Integridad: la propiedad de que la información no sea modificada en eltrayecto fuente-destino.
·         Disponibilidad: la propiedad de que el sistema sea accesible a las entidadesautorizadas.
·         No repudio: la propiedad que ubica la confianza respecto al desenvolvimientode una entidad en una comunicación.

La seguridad puede tener diferentes significados en distintos escenarios. Engeneral, cuando se habla de seguridad implica referirse a más de una de las dimensiones mencionadas anteriormente.

 Por ejemplo:

·         Seguridad en correo electrónico: involucra confidencialidad, no repudio eintegridad.
·         Seguridad en compras online: implica autentificación, confidencialidad,integridad y no repudio.

Bajo este punto de vista, se define un ataque a la seguridad como un intento deafectar en forma negativa una o más de las dimensiones del concepto de seguridad. Una vez definido el concepto de seguridad, se pueden establecer objetivosbásicos para un software seguro:

·         Independencia de la seguridad: la seguridad debe construirse y utilizarse demanera independiente de la aplicación.
·         Independencia de la aplicación: la aplicación no debe depender del sistemade seguridad usado, debe ser desarrollada y mantenida en forma separada.
·         Uniformidad: la seguridad debe aplicarse de manera correcta y consistente através de toda la aplicación y del proceso que desarrolla la misma.
·         Modularidad: mantener la seguridad separada. Entre otras ventajas, esto nosbrindará mayor flexibilidad y menor costo de mantenimiento.
·         Ambiente seguro: se debe partir de un entorno confiable. Es decir, lasherramientas de desarrollo y lenguajes de programación no deben conteneragujeros de seguridad.
·         Seguridad desde el comienzo: la seguridad debe ser considerada como unrequerimiento desde el inicio del diseño.


4.1 Seguridad de Software

La seguridad de software aplica los principios de la seguridad de información al desarrollo de software.

Information security

(La seguridad de información) se refiere a la seguridad de información comúnmente como la protección de sistemas de información contra el acceso desautorizado o la modificación de información, si está en una fase de almacenamiento, procesamiento o tránsito. También la protege contra la negación de servicios a usuarios desautorizados y la provisión de servicio a usuarios desautorizados, incluyendo las medidas necesarias para detectar, documentar, y contrariar tales amenazas.

Muchas preguntas con respecto a la seguridad, son relacionadas al ciclo vital de software.
En particular, la seguridad del código y el proceso de software; deben de ser considerados durante la fase del diseño y desarrollo.
 Además, la seguridad debe de ser preservada durante la operación y el mantenimiento para asegurar la integridad de una parte (pedazo) de software.

Una gran cantidad de seguridad usada en los Sistemas de Redes de hoy, nos pueden engañar en la creencia que nuestros trabajos como diseñadores de sistema de seguridad ya han sido realizados. Sin embargo, las cadenas y computadoras son increíblemente inseguras. La falta de seguridad se origina en dos problemas fundamentales: Los sistemas que son teóricamente seguros pueden ser inseguros en la práctica, Además los sistemas son cada vez más complejos.

La complejidad proporciona más oportunidades para los ataques. Es mucho más fácil probar que un sistema es inseguro que demostrar que uno es seguro -- probar la inseguridad, simplemente una toma ventaja de ciertas vulnerabilidades del sistema.

 Por otra parte, probando un sistema seguro, requiere demostrar que todas las hazañas posibles puedan ser defendidas contra (muy desalentadora), si no imposible la tarea.

Actualmente, no hay ninguna solución singular para asegurar la ingeniería de software. Sin embargo, hay métodos específicos que mejoran la seguridad de los sistemas. En particular, podemos mejorar laconfiabilidad de software. También podemos mejorar nuestra comprensión de los requisitos de un pedazo de software.










Buena Práctica
La seguridad requiere más manejo y riesgo de mitigación, de la que requiere la tecnología.
Como un desarrollador, uno primero debe de determinar los riesgos de una aplicación particular.
 Por ejemplo, el Web site típico de hoy puede ser sujeto de una variedad de riesgos; la desfiguración o la negación distribuida de ataques del servicio.
Una vez que se identifiquen los riesgos, identificar medidas de seguridad apropiadas llega a ser manejable.
En particular, al definir los requisitos, es importante considerar cómo la aplicación será utilizada. Con ese conocimiento uno puede decidir, sí o no, utilizar características complejas como contabilidad, auditoría etc.

Otro asunto potencialmente importante es como soportar el nombramiento del producto. El aumento de los sistemas distribuidos ha hecho el nombramiento cada vez más importante. Típicamente, el nombramiento esta manejado por rendezvous: un principal exporta un nombre y lo anuncia en alguna parte, y alguien que desea utilizar el nombre lo busca en los libros y directorios de teléfono. Por ejemplo, en un sistema como elsistema del descubrimiento del recurso, los recursos y los individuos que usan esos recursos deben ser nombrados.

 A menudo hay cosas buenas y malas con respecto al nombramiento: mientras que el nombramiento puede proporcionar a un nivel de dirección, también puede crear problemas adicionales si los nombres no son estables. Los nombres pueden permitir que los directores desempeñen diversos papeles en un sistema determinado que pueda también ser útil.


4.2 Seguridad en el ciclo de desarrollo del software

La norma ISO 12207 define el Ciclo de Vida del Software como Un marco de referencia que contiene los procesos, las actividades y las tareas involucradas en el desarrollo, la explotación y el mantenimiento de un producto de software, abarcando la vida del sistema desde la definición de los requisitos hasta la finalización de su uso.

Existen distintos modelos de Ciclo de Vida, que determinan cuales son y de qué manera se ejecutan las etapas del desarrollo de software. Cada modelo presenta sus propias características y alcances de estas etapas. Para este artículo hemos considerado las siguientes etapas: Expresión de Necesidades y Especificaciones (Requerimientos), Análisis, Diseño, Implementación, Pruebas y Mantenimiento.

ISO 27001 en el Ciclo de Vida del Software

Como ya se mencionó, la mayoría de las organizaciones sustentan su operación en sistemas informáticos. Esto ha convertido que la gestión de estos sistemas, incluyendo la ISM, sea un tema crítico dentro de ellas.



En la actualidad, esta situación se ha manejado a través de los estándares de IS, que presentan el problema de seguridad como un conjunto de controles que representan garantías para las distintas vulnerabilidades de seguridad. Por otro lado, se debe considerar que también existen normas nacionales que no necesariamente se alinean a los estándares internacionales, lo que provoca que la organización deba cumplir como ambos requerimientos.

Esto se agrava aún más, si se considera una organización gubernamental, que además, debe cumplir con las normas internas de gobierno. Esto pone a la organización en un problema respecto de qué estándar aplicar o qué nivel de cumplimiento lograr en los estándares que le interesa conseguir.


En el pasado, la industria en general consideraba aumentado productividad como el aspecto más importante de Tecnología de dotación lógica. Poca consideración fue dada referente confiabilidad o seguridad del producto de software. Estos últimos años, el papel del software y el hardware se ha convertido en el comando y el control de complejo y sistemas costosos de los cuales las vidas humanas pueden depender. Los ingenieros deben reconocer que el software es justo otro componente del sistema, y que este componente puede contener los errores o los defectos que pueden causar acontecimientos indeseados en el sistema del hardware él está controlando.

 Los ingenieros de seguridad del sistema deben trabajar con los técnicos y los expertos del dominio para conseguir requisitos funcionalidad a descompuesta y seguridad-crítica puesta en ejecución correctamente en software por las Software Engineers. Un proceso de la seguridad del software por las mejores prácticas de la industria, tales como IEEE STD 1228-1994 o equivalente, se debe desarrollar y adherir para a los métodos y a las técnicas para identificar las insuficiencias y los errores potenciales del diseño del software que pueden causar peligros o acontecimientos indeseados del producto.


La seguridad del sistema de software, un elemento de la seguridad total y programa de desarrollo del software, no se puede permitir funcionar independientemente del esfuerzo total. Los sistemas múltiples simples y altamente integrados están experimentando un crecimiento extraordinario en el uso de computadoras y software para supervisar y/o controlar subsistemas o funciones seguridad-críticos.

A especificación del software el error, el defecto de diseño, o la carencia de requisitos seguridad-crítico genéricas pueden contribuir a o causar un fallo del sistema o una decisión humana errónea. Para alcanzar un nivel aceptable de la seguridad para el software usado en usos críticos, la ingeniería de la seguridad del sistema de software se debe dar énfasis primario temprano en la definición de los requisitos y el proceso del diseño conceptual del sistema. El software Seguridad-crítico debe entonces recibir énfasis de la gerencia y análisis continuos de la ingeniería a través del desarrollo y ciclos vitales operacionales del sistema.







4.3Confiabilidad del software

La confiabilidad de software significa que un programa particular debe de seguir funcionando en la presencia de errores

 Los errores pueden ser relacionados al diseño, a la implementación, a la programación, o el uso de errores. Así como los sistemas llegan a ser cada vez más complejos, aumenta la probabilidad de errores. Como mencionamos, es increíblemente difícil demonstrar que un sistema sea seguro.

Ross Anderson dice que la seguridad de computación es como programar la computadora del Satán. Software seguro debe de funcionar abajo de un ataque. Aunque casi todos los software tengan errores, la mayoría de los errores nunca serán revelados debajo de circunstancias normales. Un atacante busca esta debilidad para atacar un sistema.

Muchos de los problemas de la seguridad de hoy son relacionados con el código defectuoso.
 Por ejemplo:

El Morris Internet Worm (el gusano Internet de Morris) utilizó overflow en un programa de UNIX para ganar acceso a las computadoras que ejecutaron el programa. Los ataques de buffer overflow han sido el tipo de ataque más común en las últimos diez años e implican el sobre grabar instrucciones en el programa.

Específicamente, una cantidad fija de memoria en la pila, puede ser reservado por el usuario; si la entrada de información del utilizador es más grande que este espacio reservado, el usuario puede sobre grabar los instrucciones de la programa. Si esto se hace cuidadosamente, el usuario puede insertar sus propias instrucciones en el código del programa, así haciendo la máquina receptora realizar operaciones arbitrariasdictados por el atacante. Mientras que tales ataques se pueden prevenir típicamente con bounds checking (revisando el tamaño de la entrada de información antes de copiarla), ésta es una cuestión de práctica de  programación que confiamos en que el programador mismo seguirá.

El aspecto difícil de buffer overflows es que pueden ocurrir en una gran cantidad de lugares en cualquier programa, y es difícil de prevenir el suceso por todas partes. Este ha sido el caso en el pasado, especialmente, en los últimos 10 años.



4.4Ingeniería de seguridad

Este curso trata sobre Ingeniería de Seguridad entendida como los métodos para diseñar y construir sistemas que permanezcan confiables a pesar de posibles actos maliciosos o a errores de diverso tipo incluyendo las fallas de  carácter fortuito.

Tradicionalmente se ha dado una particular atención a la criptografía como el centro de las actividades asociadas a la seguridad en sistemas de diversa naturaleza, como veremos a lo largo de este curso hay mucho más que eso si queremos diseñar e implementar un entorno confiable.

Los sistemas se han vuelto cada vez más complejos, y esa complejidad es la que permite que hayamás y más fallas de seguridad. En la medida en que los sistemas están constituidos por múltiples componentes que interactúan permanentemente, cada espacio de interacción se convierte en una oportunidad para aquellos que quieren subvertir la seguridad establecida.

Incluso cuando se piensa en la criptografía como una herramienta para proteger  nuestros sistemas, no solo es importante la fortaleza del algoritmo de encriptamiento, cuentan también la calidad de la clave, la seguridad con que se guarda, donde se guarda, que tipo de password se exige al usuario. Y nada de esto tiene ninguna utilidad
si un hacker ha logrado ingresar a una de las computadoras que están envueltas en la comunicación.

El interés por tanto de este curso está centrado en darle al estudiante una visión clara de los problemas de seguridad a los que hoy día nos enfrentamos y cuáles son las medidas que pueden ayudar a reducir esos riesgos.

Esta visión, por la naturaleza del problema tiene que ser necesariamente una visión sistémica, de no ser así, ninguna medida que implementemos tiene la esperanza de funcionar adecuadamente.

Cuando diseñamos un sistema de seguridad debemos tomar en cuenta que uno de nuestros principales enemigos es el usuario mismo. Su confianza casi ciega en las computadoras y lo que estas hacen le hace una persona vulnerable. Los sistemas informáticos se han vuelto cada vez más y más complejos, con lo que es prácticamente imposible que no fallen, y las fallas siempre pueden ser usadas por personas maliciosas para atacar el sistema.

El problema empeora notablemente gracias a la Internet. Un hacker exitoso es probable que decida publicar su ataque y compartir su habilidad técnica con otros. Esta es la razón por la que gente con pocos conocimientos y habilidad técnica pueden convertirse en atacantes exitosos de sistemas relativamente complejos.

Multiplicando de esta forma el número de ataques realizados a diversos sistemas. Una medida útil de cuan vulnerables están siendo nuestros sistemas se puede conseguir poniendo “trampas” atractivas en Internet y midiendo cuanto demora en ser atacados. El tiempo es sorprendentemente breve. En el caso de sistemas basados en Linux, en promedio 72 horas desde que el sistema es puesto en funcionamiento hasta que un hacker tiene control de la cuneta del administrador.

Algunos ejemplos de sistemas en los que la seguridad es un aspecto fundamental son los siguientes:

·         La contabilidad de un banco.
·         Los cajeros automáticos.
·         Los mecanismos de protección física, como alarmas y sensores en general, destinadosa detectar intrusos no deseados.
·         Los servicios en línea, vía Internet.
·         Obviamente en aplicaciones militares.

·         La privacidad es un tema de importancia en el caso de información de salud, ola información obtenida a través de los censos. Los sistemas de seguridad tienenpor objeto proteger esa privacidad impidiendo por diversos métodos el acceso ala información mientras se permite operar en forma general sobre la data (por ejemplo, para obtener estadísticas).
·        
 La necesidad de manejar operaciones seguras en la Internet, espacio en el cual los ataques del tipo negación de servicios son comunes.
·         El clonado de teléfonos celulares.