¿Cómo desarrollar aplicaciones más seguras?

Anuncio
¿Cómo desarrollar
aplicaciones más
seguras?
Presentada por:
Julio César Ardita
CTO CYBSEC
Marcelo Stock
Jefe de Seguridad Informática
Banco Columbia
Aclaración:
©
Todos los derechos reservados. No está permitida la
reproducción parcial o total del material de esta
sesión, ni su tratamiento informático, ni la
transmisión de ninguna forma o por cualquier
medio, ya sea electrónico, mecánico, por
fotocopia, por registro u otros métodos, sin el
permiso previo y por escrito de los titulares de los
derechos. Si bien este Congreso ha sido concebido
para difusión y promoción en el ámbito de la
profesión a nivel internacional, previamente
deberá solicitarse una autorización por escrito y
mediar la debida aprobación para su uso.
¿Cómo desarrollar aplicaciones más seguras?
- Desarrollo de un Proyecto de Desarrollo
- Problemáticas más comunes en el desarrollo de aplicaciones
- Inclusión de la seguridad en SDLC
- Seguridad en el Análisis
- Seguridad en el Diseño
- Seguridad en la Codificación
- Testing de Seguridad
- Implementación Segura
¿Cómo desarrollar aplicaciones más seguras?
Desarrollo de un proyecto de Desarrollo
Proyectos de desarrollo de software
¿Qué problemáticas actuales tiene el desarrollo del software?
¿Qué problemáticas actuales tiene
el desarrollo del software en un
entorno seguro?
Desvíos en proyectos de IT
¿Cómo desarrollar aplicaciones más seguras?
Desarrollo de un proyecto de Desarrollo
Costo de solución de Problemas
1000
40-1000
Costo de un error por fase
900
Unidad de Costo
800
700
600
500
400
300
30-70
200
1
100
3-6
10
15-40
0
Requerimientos
Diseño
Desarrollo
Test en desarrollo
Test de Aceptación
Operación
Barry Bohem determinó el rango de costo por error generado por falsos
supuestos en la fase de requerimientos y no detectados hasta fases
posteriores (“Software Engineering Economics”). “Poor management can
increase software cost more rapidly than any other factor”.
¿Cómo desarrollar aplicaciones más seguras?
Desarrollo de un proyecto de Desarrollo
Etapas en el System Development Life Cycle
1. Planificación
2. Análisis
3. Diseño
4. Codificación/Desarrollo
5. Testing
6. Implementación y Operación
7. Mantenimiento
¿Cómo desarrollar aplicaciones más seguras?
Problemáticas más comunes en el desarrollo de aplicaciones
¿Por qué fracasan los proyectos de sistemas?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Poca participación y compromiso de usuarios
Requerimientos incompletos
Cambio de requerimientos
Falta de soporte de la dirección
Incompetencia tecnológica
Falta de recursos
Expectativas ilusorias
Objetivos poco claros
Cronogramas irreales
Nuevas tecnologías
Otros
Fuente: The Standish Group
¿Cómo desarrollar aplicaciones más seguras?
Problemáticas más comunes en el desarrollo de aplicaciones
Grandes mitos y excusas flacas
La seguridad de la aplicación es responsabilidad del programador.
Nadie sabe cómo funciona, por ende, no la van a atacar.
Si no se encontraron vulnerabilidades hasta ahora…
A nadie le interesaría atacar nuestra aplicación.
La aplicación es segura porque corre detrás de un firewall.
La aplicación es segura porque usa encripción.
Si, ese característica (que es insegura) viene habilitado por default,
pero el administrador lo puede deshabilitar.
Si no corre como Administrador no funciona.
No hay tiempo para incluir seguridad
¿Cómo desarrollar aplicaciones más seguras?
Problemáticas más comunes en el desarrollo de aplicaciones
Interacción con Desarrollo: ¿Ciencia o arte?
Ciencia
Métricas Métodos
Standards Técnicas
Training Templates
Arte
Comunicación
Lenguaje
Resol. Problemas Conflictos
Interpretaciones Juicios
Cap. Escucha
Cultura
Negociación
Expectativas
Percepciones
Educación
¿Cómo desarrollar aplicaciones más seguras?
Problemáticas más comunes en el desarrollo de aplicaciones
Modelos mentales
Las personas son diferentes y por lo tanto, también lo son sus
representaciones de la realidad.
Una aplicación
“bien” segura,
NO HAY
PROBLEMA!!!
Buenísim o.
Em pecem os ya.
La necesitam os
en 2 m eses.
¿Cómo desarrollar aplicaciones más seguras?
Problemáticas más comunes en el desarrollo de aplicaciones
La naturaleza del conflicto
El conflicto es natural. Ni positivo ni negativo.
Lo que importa no es el conflicto sino como lo gestionamos.
Ganar o perder son objetivos de los juegos. No de los conflictos.
Resolver un conflicto no tiene que ver con quién tiene razón sino
con el entendimiento y la apreciación de las diferencias.
Para cambiar nuestra perspectiva en un conflicto debemos
movernos desde nuestro punto de vista a un punto de observación.
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
¿Participa Seguridad en el SDLC?
¿Porqué?
¿Debe participar en el SDLC?
¿Porqué?
¿Cómo y cuándo debe participar?
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Grado de madurez del área
de Seguridad Informática
Grado de madurez de la Organización
Cultura organizacional
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Modelos actuales
- ISO/IEC 21827 - Information technology — Security techniques — Systems
Security Engineering — Capability Maturity Model® (SSE-CMM®)
- Microsoft’s Trustworthy Computing Security Development Lifecycle
- Team Software Process for Secure Software Development (TSP)
- Correctness by Construction
- Software Assurance Maturity Model
- Software Security Framework
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Participación de Seguridad Informática
en el desarrollo de Aplicaciones
El área de Seguridad debe:
- Evaluar el grado de madurez del área y la Compañía.
- Seleccionar en que proyectos participar
- Definir en que etapas del SDLC va a participar:
- Participar desde el inicio
- Definir como va a participar
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Participación de Seguridad Informática
en el desarrollo de Aplicaciones
- Política de Seguridad
- Estándares
- Regulaciones
- Aspectos legales
- Validación de conceptos básicos
- Determinación de amenazas y vulnerabilidades.
- Requisitos de seguridad.
- Análisis costo/beneficio
- Nivel de protección deseada.
- Desarrollo de planes de testing.
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Participación de Seguridad Informática
en el desarrollo de Aplicaciones
- Incorporar especificaciones de seguridad.
- Ajustar planes de test.
- Determinar controles de acceso.
- Diseñar documentación.
- Evaluar opciones de encripción.
- Diseñar controles de seguridad tomando en cuenta
requerimientos regulatorios.
- Diseñar controles de acceso.
- Utilizar encripción.
- Adaptar los planes de testing.
- Diseño detallado de la documentación.
- Considerar aspectos de la continuidad del negocio.
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Participación de Seguridad Informática
en el desarrollo de Aplicaciones
- Desarrollar código de forma segura.
- Implementar testing de código.
- Dar soporte al plan de continuidad del negocio.
- Desarrollar documentación.
- Integrar componentes de seguridad.
- Testing integrado de seguridad
- Ajustar documentación.
- Llevar a cabo verificación integral del producto.
¿Cómo desarrollar aplicaciones más seguras?
Inclusión de la seguridad en SDLC
Participación de Seguridad Informática
en el desarrollo de Aplicaciones
- Instalar software de forma segura.
- Llevar a cabo test de aceptación.
- Testing de seguridad (PT`s).
- Completar la documentación.
- Certificación y acreditación de ser necesaria.
- Revalidar controles de seguridad.
- Realizar Penetration tests y análisis de vulnerabilidades.
- Gestionar requerimientos de cambios.
- Implementar control de cambios.
- Implementar cambios de forma segura.
- Evaluar el nivel de servicio.
- Actualizar y mantener la documentación.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Análisis
Durante el análisis de requerimientos, se pueden identificar diversas
características que derivarán en los requerimientos de seguridad del
software.
Arquitectura de la aplicación.
Plataforma donde correrá la aplicación.
Requerimiento de compliance con normativas y marcos regulatorios.
Tipo de conectividad
Tipos de datos que se almacenarán o transmitirán
Perfiles de usuario necesarios para la aplicación.
Tipos de registro que el sistema debe generar.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Análisis
Seguridad en el análisis de requerimientos
REQUISITOS DE SEGURIDAD INFORMÁTICA PARA ADQUISICIÓN
Y DESARROLLO DE SOFTWARE
- Arquitectura de la aplicación
- Mecanismo de autenticación de usuarios
- Administración de usuarios
- Administración de contraseñas
- Encripción
- Transmisión
- Registro de eventos
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Reducción de superficie de ataque
Superficie de ataque: Puntos de entrada que tiene una aplicación
desde el punto de vista de un atacante. Cuanto menor sea nuestra
superficie de ataque, menos posibilidades tendrá un potencial
atacante de explotar vulnerabilidades en nuestro sistema.
Servicios/procesos activos
Sockets TCP/UDP
Características del sistema
Usuarios de la aplicación sin privilegios administrativos ni demo.
Repositorios de ejemplo
Archivos temporales / Archivos de intercambio
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Principio del menor privilegio
En Windows y Unix, las aplicaciones y procesos corren en el
contexto de un usuario “X”.
Privilegios de la aplicación = Privilegios del usuario “X”.
Si un atacante explota una vulnerabilidad de la aplicación, podrá
actuar con los privilegios del usuario “X”.
Se debe utilizar un usuario “X” con los privilegios mínimos e
indispensables para ejecutar la aplicación.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Defensa en profundidad
Implementar medidas de seguridad en TODAS las capas del
sistema.
Asumir siempre que la capa anterior pudo ser comprometida
Nunca confiar en los datos recibidos
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Manejo seguro de mensajes de error
Brindar únicamente la información necesaria para que el
usuario tome las acciones correspondientes.
Evitar mostrar los mensajes de error de otras capas y
aplicaciones.
Expresar los mensajes de manera clara y concisa.
Diseñar los mensajes teniendo en mente el perfil de usuario
que los leerá.
Evitar mensajes con
demasiada información.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Manejo de información sensible
Almacenamiento protegido
Encripción
Hashes
ACL`s
Restricciones en DB
Transmisión segura
Encripción de la comunicación
Borrado de datos
Depuración de datos
Borrado seguro
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Encripción y manejo de claves de encripción
Definir algoritmo de encripción
Definir “granularidad” de la encripción
NUNCA colocar la clave en el código (MUY INSEGURO!)
Considerar encripción de claves de encripción
La aplicación debe contemplar el cambio de claves de encripción
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Interacción de la aplicación
- Interacción con Firewalls.
- Interacción con dispositivos (Proxy / Reverse Proxy / Firewalls).
- Interacción con Bases de Datos.
- Interfases (que sean seguras!!!).
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Auditoría y logging
Los registros de auditoría son una herramienta de vital importancia
en cualquier aplicación.
Una buena aplicación, debería proveer facilidades de logging para:
Definir qué eventos a registrar
Definir distintos niveles de logging.
Definir cómo y dónde registrarlos
Definir políticas de rotación de logs
Definir acciones a tomar si no se pueden registrar logs
¿Dónde loguear?
Archivos propios de la aplicación
Sistema de logging local (Event logger / Syslog).
Sistema de logging remoto
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Auditoría y logging
¿Qué loguear?
Lo que se haya definido en la etapa de análisis.
Accesos al sistema en general (exitosos y fallidos)
Accesos a datos sensibles
Cambios de permisos y privilegios
Cambios de configuraciones
Modificaciones a objetos de la aplicación
Todos los errores de la aplicación
Inicio y detención de la aplicación (servicios)
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Diseño de autenticación
¿Qué hay que tener en cuenta en la etapa de diseño?
Autenticación local vs. autenticación externa (integrada).
Tipos de autenticación (integrada vs. propia).
Factores de autenticación.
Usuarios y contraseñas por defecto.
Nivel de acceso de los usuarios por defecto.
Bloqueo de cuentas / vs. Captcha.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Diseño de autorización
Una vez que el usuario fue autenticado, la aplicación deberá decidir
si tiene o no permisos para realizar las acciones que solicita.
Definición de niveles de acceso (ej: Roles)
Funciones que puede ejecutar cada nivel
Datos que puede leer / escribir / modificar cada nivel
Asignación de niveles propia o integrada
Roles / grupos definidos localmente
Pertenencia a grupo en servicio de directorios
Requerimiento de autorización en TODOS los componentes del
sistema
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en el Diseño
Documentación
Utilizar lenguaje claro y conciso.
Diferenciar complejidad para usuarios básicos y administradores.
Incluir instructivos "paso a paso“.
Documentar TODOS los aspectos de seguridad de la aplicación.
Explicar los riesgos concretos de cada caso
Incluir configuraciones de seguridad recomendadas.
Deben corresponderse con la instalación default
Explicar cómo usar la aplicación
de forma segura.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Programadores
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Programadores
¿Cómo es la relación de seguridad informática con los
programadores?
¿Cómo ven los programadores al área de seguridad informática?
Áreas de desarrollo interno y la tercerización del desarrollo
CLAVE: CAPACITACIÓN Y
CONCIENTIZACIÓN
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Tipos de Vulnerabilidades
Existen muchos tipos de vulnerabilidades.
El impacto depende del tipo general de vulnerabilidad y las
condiciones particulares del software y el sistema donde se
ejecuta.
Tipos más comunes:
Stack buffer overflows
Heap buffer overflows
SQL Injections
Cross Site Scripting (XSS)
Directory Traversal
void main(int argc, char **argv) {
char nombre[10];
char apellido[10];
strcpy(nombre, argv[1]); // argumento 1
strcpy(apellido, argv[2]); // argumento 2
printf(“Hola %s, %s”, apellido, nombre);
}
Authentication Bypass
Information Disclosure
Escalamiento de privilegios
Manejo inseguro de sesiones
Denegación de servicio
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Revelación de información
Es la publicación de información sensible acerca de la Aplicación,
su arquitectura, configuración o implementación.
Dicha información es utilizada como fuente para la diagramación
de ataques más avanzados.
Algunos ejemplos:
Comentarios en código fuente.
Información de rutas y nombres de archivos.
Información de nombres de servidores, strings de conexión.
Mensajes de error de capas inferiores (no capturados).
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Recomendaciones de seguridad
Principio del menor privilegio.
Evitar correr la aplicación /servicio con privilegios administrativos
Validar SIEMPRE los valores de entrada.
Proteger de archivos de configuración y registro.
Restringir posibles archivos de salida.
Basar los privilegios en la autenticación del usuario.
Utilizar manejo de sesiones seguro.
¿Cómo desarrollar aplicaciones más seguras?
Seguridad en la Codificación
Programación segura
Programación de forma segura (C++, Java, .NET, etc.)
Training / explicación / monitoreo a los desarrolladores.
Revisión de código (automatizada y manual).
Secure Programming in Java
http://www.secologic.org/downloads/java/051207_Draft_EUROSEC_Whitepaper_Secure_Java_Programming.pdf
Secure Coding Guidelines for the Java
http://www.oracle.com/technetwork/java/seccodeguide-139067.html
Secure Coding Guidelines .NET
http://msdn.microsoft.com/es-ar/library/d55zzx87(v=vs.71).aspx
CERT - Secure Coding
http://www.cert.org/secure-coding/
¿Cómo desarrollar aplicaciones más seguras?
Testing de Seguridad
Testing funcional vs. Testing de seguridad
Bugs que se
encuentran mediante
Testing de seguridad
Funcionalidad
diseñada
Funcionalidad
real
Bugs que se
encuentran mediante
Testing funcional
¿Cómo desarrollar aplicaciones más seguras?
Testing de Seguridad
Testing funcional vs. Testing de seguridad
Testing Funcional
Consiste en verificar que las funcionalidades esperadas de la
aplicación cumplan con los requerimientos.
Se basa en un uso “bien intencionado” de la aplicación.
Se levanta un error cuando la aplicación no hace lo que debería.
Testing de seguridad
Consiste en verificar que no se pueda forzar a la aplicación a
efectuar acciones que excedan a la funcionalidad especificada.
Se basa en un uso “malintencionado” de la aplicación.
Se levanta un error cuando la aplicación hace lo que no debería.
¿Cómo desarrollar aplicaciones más seguras?
Testing de Seguridad
Testing de seguridad (Penetration Test)
Contenidos de paquetes de red
Variables de entorno
Archivos de configuración
Contenido de archivos temporales
Registro de Windows
Valores de peticiones y respuestas
Todos los que sirvan como valores de entrada
¿Cómo desarrollar aplicaciones más seguras?
Testing de Seguridad
Testing de seguridad (Penetration Test)
Testear al cliente con un server falso
Desarrollar un prototipo de server “Ad Hoc” que pueda ser controlado
Enviar respuestas incorrectas
Enviar respuestas fuera de orden
Insertar delays
Idem para testear un server con un cliente falso
Test de Stress
Generar una carga alta de peticiones/transacciones a la aplicación
Mantener esta carga durante tiempos prolongados
Simular tráfico en ráfagas
¿Cómo desarrollar aplicaciones más seguras?
Implementación Segura
Implementación segura de aplicaciones
Todo el esfuerzo de seguridad empleado en las etapas anteriores
puede ser que haya sido en vano si la implementación / instalación
de la aplicación no se hace de forma segura.
Topología de la implementación
Instalación y hardening de software de base
Proceso de implementación
Administración de implementación y mantenimiento
¿Cómo desarrollar aplicaciones más seguras?
Implementación Segura
Topología de la instalación
La topología sobre la que se instala una aplicación, tiene
implicancias directas sobre la seguridad.
Segmentación de red
DMZ’s, VLANS
Firewalls de borde
Dirección de establecimiento de conexiones
Entrantes / Salientes
Funciones separadas en hosts separados
Database server / Application server / Web Server
Esquema Back-end / Front-end
¿Cómo desarrollar aplicaciones más seguras?
Implementación Segura
Aseguramiento del software de base
El sector de tecnología / operaciones debe encargarse de asegurar
correctamente el software de base antes del proceso de
implementación de la solución.
Recomendaciones:
Eliminar servicios y funcionalidades innecesarias.
Eliminar usuarios innecesarios.
Eliminar objetos de ejemplo y documentación.
Cambiar contraseñas e identificadores por default.
Configurar correctamente el nivel de logueo y mensajes de error.
¿Cómo desarrollar aplicaciones más seguras?
Implementación Segura
Proceso de implementación segura
Asumir que el usuario no tiene conocimientos sobre seguridad.
Los valores seteados por default en la instalación, deben ser lo
más seguros que la funcionalidad permita.
Si una funcionalidad es peligrosa, debe instalarse deshabilitada o
no instalarse por default.
Si se emplean contraseñas por default, forzar al usuario a
cambiarlas.
¿Cómo desarrollar aplicaciones más seguras?
Conclusiones
Debemos conocer nuestro nivel de madurez y el nivel
de madurez de la Compañía para determinar como y de
que forma podemos incluir la seguridad en el SDLC.
Comenzar de a poco, mantener bajo perfil e ir ganando
terreno mostrando resultados concretos.
Ponerle más foco al “arte” que a la “ciencia”.
Gracias por asistir a esta sesión…
Para mayor información:
Julio César Ardita
CTO CYBSEC
[email protected]
Marcelo Stock
Jefe de Seguridad Informática
Banco Columbia
[email protected]
Los invitamos a sumarse al grupo “Segurinfo” en
Descargar