Seguridad en aplicaciones Web, ¿Es posible lograr algo consistente?

Síntesis

El objetivo de esta publicación es introducirnos en el ambiente conceptual de la seguridad en aplicaciones Web además detallar con que nos podemos encontrar, y si tener en cuenta que la infraestructura no es la unica muralla que debemos implementar si queremos lanzar una solución Web a la red.

Introducción

En primer lugar voy a dar una breve introducción de las amenazas más conocidas en el ambiente de desarrollo Web.

Los tipos más comunes de ataques recibidos a través de Internet son:

Ataque de secuencia de comandos entres sitios.
Inyección SQL.
Secuestro de sesión.
Ejecución de código con un clic.
Alteración de campos ocultos.

Quiero dejar claro y debemos tomar como normas predeterminadas, que siempre que insertemos algún tipo de entrada de usuario en el marcado del explorador se corre el riesgo de un ataque de inyección de código, el acceso a la base de datos se debe llevar a cabo de modo seguro, los datos confidenciales deben se protegidos de forma idónea.

Es interesante remarcar que la seguridad en Internet tiene según mi punto de vista estos modos:

Prácticas relacionadas con código de la aplicación.
Estrategias de acceso a datos.
Almacenamiento y administración eficaz.

Importante: Una aplicación segura solo se puede conseguir mediante los esfuerzos conjuntos de desarrolladores, arquitectos y administradores.

Normas generales de desarrollo

Evitar que el pirata informático utilice el contenido del estado de vista del cliente para preparar envíos malintencionados contra el sitio o aplicación. (Ataque ejecución de código con un clic).

Prestar especial atención a cookies y a la autenticación, ya que el robo de una cookie hace que se pueda llevar a cabo un ataque. Se sabe que las cookies se pueden robar y envenenar. El éxito radica en realizar un buen manejo de cookies, no usar diseños estáticos de las mismas no implementar estas en los estados de sesión ni tampoco en la autenticación empleada.

Prestar especial atención al Secuestro de sesión, es un ataque coordinado mediante cookies dedicadas a recuperar o administrar el estado de sesión. Este tipo de ataque pone en riesgo la confidencialidad del sistema, exponiendo los perfiles de usuarios y datos sensibles propios de cada integrante del sistema. Para solucionar este tipo de problemas existen métodos de generación de números aleatorios para manejo de este concepto y claro cifrado hash sobre el mismo.

Se debe manejar correctamente el estado de controles en una aplicación Web si es que se implementa estado de controles, para ello existen técnicas de codificación en base64 y firma de valores mediante hash.

Otro cuidado intensivo que se debe llevar es validar los request, para evitar los ataques XSS. Este tipo de ataques se basa en la generación dinámica de código HTML de eco de página. (Se debe prestar atención enérgicamente a las entradas del sistema)

Dedicando un vértice a tratar el tema de la persistencia de datos, tenemos un ataque normalmente difundido que es la “inyección SQL”, para evitar esto debemos prestar especial atención a los comando de base de datos utilizados.


Modelo de Anillos o Capas de Seguridad

En este punto voy a intentar volcar una metodología de implantación de mecanismos de seguridad en una aplicación corporativa de tipo Web.

El modelo de anillos de seguridad es un esquema llevado a la práctica por varios grupos IT avocados al desarrollo de aplicaciones Web corporativas, analizando conceptualmente cada una de los requisitos planteados y realimentando mediante nuevos mecanismos de defensa llegué a conformar una guía realmente rica y eficaz de defensa tomando una visión netamente arquitectónica.

Las capas de seguridad se dividen en 5 niveles, en cada nivel existen mecanismos a cumplir para realizar la aceptación del mismo, de esta manera podremos seguir un control coherente de seguridad de nuestra aplicación.

En este documento voy a dar los conceptos principales a tener en cuenta en un desarrollo de aplicación segura pero no voy a dar la metodología ni la ordenación de los mecanismos de control.

Mecanismos de Control

Veamos un poco de terminología clave de desarrollo:

- Autenticación. Identificar correctamente los clientes de la aplicación, entre los que pueden figurar usuarios finales, servicios, procesos o equipos.
- Autorización. Definir lo que pueden ver y hacer en la aplicación los clientes autenticados.
- Comunicaciones seguras. Garantizar la privacidad y la integridad de los mensajes cuando pasan de una red a otra.
- Suplantación. Se trata de la técnica utilizada por una aplicación de servidor para obtener acceso a recursos en nombre de un cliente. El contexto de seguridad del cliente se utiliza para los controles de acceso realizados por el servidor.
- Delegación. Una forma ampliada de suplantación que permite a un proceso de servidor que trabaja en nombre de un cliente el acceso a recursos de un equipo remoto.
- Contexto de seguridad. Es un término genérico usado para referirse a la colección de configuraciones de seguridad que afectan al comportamiento relativo a la seguridad de un proceso o subproceso. Los atributos de la sesión de inicio y el testigo de acceso de un proceso conforman el contexto de seguridad del proceso.
- Identidad. Hace referencia a una característica exclusiva de un usuario o servicio que lo identifica. Suele tratarse, por ejemplo, de un nombre de visualización, que a menudo adopta el formato autoridad/nombre de usuario.

Debemos llevar principios básicos que he extractado de diversas fuentes:

- Adoptar el principio de privilegios mínimos.
- Usar las defensas a fondo.
- No confiar en los datos introducidos por el usuario.
- Utilizar opciones predeterminadas seguras.
- No depender de la seguridad por medio de la oscuridad.
- Realizar controles en la puerta.
- Asumir que los sistemas externos no son seguros.
- Reducir el área expuesta.
- Cometer errores de forma segura.
- No olvidar que el alcance de la seguridad lo define su punto más débil.
- Si no lo utiliza, deshabilítelo.

Importante: Cada uno de los principios implica un desarrollo que son extendidos en la versión ampliada del documento.

Podemos aplicar los mecanismos que voy a detallar según una organización estándar lógica:

- Servicios de usuarios
- Servicios empresariales
- Servicios de datos

Pero a este punto se preguntarán ¿porque esta organización?, bien esta agrupación lógica lleva a un primer nivel de organización en donde aplicar conceptos de seguridad y control, para esto les dejo mi síntesis de los conceptos planteados:

Los Servicios de usuarios se encargan de la interacción de clientes con el sistema y proporcionan un puente común a la lógica empresarial básica encapsulada por componentes del nivel de Servicios empresariales.
Los Servicios empresariales proporcionan la funcionalidad básica del sistema y encapsulan la lógica empresarial. Son independientes del canal de entrega, de los sistemas de servidor y de los orígenes de datos.
Los Servicios de datos proporcionan acceso a datos (alojados en los límites del sistema) y a otros sistemas (de servidor) a través de interfaces genéricas que resultan sencillas de utilizar desde componentes del nivel de Servicios empresariales.

Bien ahora que tenemos claro los conceptos claves y la agrupación lógica de la metodología de seguridad arquitectónica de nuestra aplicación, voy a detallar los principales conceptos para lograr una plataforma fiable.

Autenticación

Con respecto a nuestro servidor Web:

- Anónima
- Básica
- Implícita
- Integrada en Windows (Kerberos/NTLM)
- Certificados

Con respecto a nuestro código:

- Ninguna (personalizada)
- Windows
- Formularios
- Passport
- Hibrida

Con respecto a Servicios Web:

- Windows
- Ninguna (personalizada)
- Autenticación de mensajes

Con respecto a Servicios Empresariales:

- Windows

Con respecto a SQL Server 2000:

- Windows (Kerberos/NTLM)
- Autenticación de SQL


Autorización

Con respecto a nuestro servidor Web:

- Restricciones de direcciones IP/DNS
- Permisos Web
- Permisos NTFS; listas de control de acceso (ACL) de Windows en archivos solicitados

Con respecto a nuestro código:

- Autorización de archivos
- Autorización de direcciones URL
- Permisos de Funciones

Con respecto a Servicios Web:

- Autorización de archivos
- Autorización de direcciones URL
- Permisos de Funciones

Con respecto a Servicios Empresariales:

- Funciones de Servicios Empresariales (COM+)
- Permisos NTFS

Con respecto a SQL Server 2000:

- Inicios de sesión en el servidor
- Inicios de sesión en la base de datos
- Funciones fijas de base de datos
- Funciones definidas por el usuario
- Funciones de aplicación
- Permisos de objetos

Comunicación Segura

Con respecto a nuestro servidor Web:

- SSL

Con respecto a Servicios Web:

- Cifrado SSL y de mensajes


Con respecto a Servicios Empresariales:

- Cifrado de llamada a procedimiento remoto (RPC)

Con respecto a SQL Server 2000:

- SSL

Con respecto a los servicios empresariales o bien adoptando un entorno genérico de paquetes me interesaría remarcar estas opciones de autenticación:

- Predeterminado: se utiliza el nivel de autenticación predeterminado para el paquete de seguridad.
- Ninguno: no se lleva a cabo ninguna autenticación.
- Conexión: la autenticación se realiza sólo cuando se establece la conexión.
- Llamada: la autenticación se lleva a cabo al inicio de cada llamada a procedimiento remoto.
- Paquete: autentica y verifica la recepción de todos los datos de llamada.
- Integridad de paquete: autentica y verifica que no se ha modificado ningún dato durante la transmisión.
- Privacidad de paquete: autentica y cifra el paquete, incluidos los datos y la identidad y la firma del remitente.

Además en estos conceptos debemos implementar un sistema de guardianes y puertas por nivel, siempre respetando nuestro diseño lógico de capas.

Importante: Estos conceptos no se detallan en esta versión simplificada del documento.

Si hablamos de la autorización es vital remarcar las estrategias que debemos seguir para lograr que este mecanismo llegue a ser confiable, veamos:

- Basada en funciones. El acceso a las operaciones (normalmente métodos) se protege en función de la pertenencia a funciones del llamador.
- Basada en recursos. Los recursos individuales se protegen mediante listas de control de acceso (ACL) de Windows.

En la metodología completa existe un patrón recomendado ya previamente analizado y estudiado a fondo para seguir en el desarrollo de las aplicaciones.

Importante: Estos conceptos no se detallan en esta versión simplificada del documento.

Identidades

¿Quién va a tener acceso a los recursos?
¿Importante no?

Podemos optar por varios diseños en cuanto a este concepto:

- La identidad del llamador original.
- La identidad del proceso.
- Cuenta de servicio.
- Identidad personalizada.

Importante: Estos conceptos no se detallan en esta versión simplificada del documento.

A tener en cuenta: Es vital definir como se transmite la identidad a lo largo del flujo de control de la aplicación

Modelo de acceso a Recursos

El modelo de subsistemas de confianza
El modelo de suplantación/delegación

Dependiendo del modelo utilizado y la conceptualización de cada uno de los mismo tendremos ventajas y desventajas que debemos evaluar dependiendo del entorno donde aplicaremos nuestra solución.

Importante: Estos conceptos no se detallan en esta versión simplificada del documento.

Antes de entrar en la arquitectura es mi deber nombrar conceptos a tener en cuenta que generar muchos de los ataques y pérdidas de información y activos en la organizaciones actuales:

- Firma de lo componentes empresariales: es fundamental realizar firma digital sobre cada uno de los componentes desarrollados para minimizar el impacto de una eventual perdida del mismo.
- Evaluación del verbo de acceso y paso de parámetros en las peticiones HTTP.
- Adaptabilidad de toda la aplicación a mecanismos de control de comunicación, como SSL y no solo dedicar la seguridad del canal.
- Cifrado de las opciones de configuración, cadenas privadas, de accesos, usuarios roles etc.
- Verificación estricta de cookies, cifrado de las mismas en el caso de utilización, ya sea para la propia aplicación, para manejo de sesiones o para persistencia de estado.
- Control de Membresía si es que se utiliza en la aplicación, incluyendo la codificación de datos sensibles, parametrización de credenciales, controles de password, políticas de seguridad y caducidad.
- Personalización de registros de estado de la aplicación.
- Manejo de Estados de Aplicación.
- Manejo de roles de la aplicaciones asociados a la membresía.
- Verificación estricta de datos y comunicación con el motor de datos.
- Verificación de encabezados HTTP, suplantación de extensiones.
- Control del servidor de aplicaciones, tratamiento de autorización y autenticación.
- Énfasis en la implantación de agentes y puertas de control.

Importante: Estos conceptos no se detallan en esta versión simplificada del documento.

Espero que les sea de utilidad esta publicación y ante la necesidad de una implantación de estas características pueden de forma basica introducir estas referencias y lograr una exitosa implantación uniforme.


Bilbiografía consultada

Rechazando Ataques mediante ASP.NET - Dino Esposito
Crear aplicaciones ASP.NET seguras - J.D. Meier, Alex Mackman, Michael Dunner y Srinath Vasireddy

Entradas más populares de este blog

TensorFlow, una simple aproximación al calculo numérico en Python

7 arquetipos #Polymer 1.0 puntos esenciales prácticos

Iniciando la representación de una mobile-web-page pensando en el rendimiento - Parte 1