volvervolver
Inteligencia artificial en Ciberseguridad

POR:
Mariano E Quintana
(Cybersecurity Researcher & Trainer)

COMPARTIR

DevSecOps Checklist

No siempre es evidente “Qué se debe hacer”, y “Cuáles son los beneficios” de una seguridad bien implementada. Estos beneficios se manifiestan como la ausencia de “eventos negativos” en vez del agregado de eventos positivos, por lo que a veces es difícil tener una visión clara de “Qué hace falta” cuando abordamos alguna tecnología nueva. Quizás es responsabilidad de estos sesgos cognitivos o la comodidad del usuario relacionada con la “no salida de su zona de confort”. Este es un claro ejemplo de la falacia que existe a la hora de pensar una nueva solución que resuelve los problemas antes de que sucedan y ahí los equipos caen en el cuestionamiento relacionado con que ninguna persona resalta las virtudes de un sistema que resuelve problemas antes de que pasen. Es así, nadie se sorprende. Estamos acostumbrados a resolver de una forma más reactiva que preventiva y por supuesto celebrar este tipo de soluciones.

Como todo lo que se resuelva sin generar alarma no tiene el debido reconocimiento hay una tendencia en el usuario a la desatención de este tipo de soluciones. DevSecOps es una práctica que alinea mejor la seguridad, la ingeniería y las operaciones e infunde seguridad a lo largo del ciclo de vida de DevOps. Durante esta breve lectura, enfocaremos en que puntos importantes y simples pueden enfocar, para quizás destrabar estos mecanismos de cambio.

Sobre el desarrollo

 • Lograr que la seguridad sea parte del proceso completo de desarrollo:
Introducir la seguridad de forma temprana en el desarrollo y a lo largo de todo el ciclo. Le permite al analista de seguridad dar a sus requisitos el mismo peso que a los requisitos funcionales. Esto implica agregar controles y procesos de seguridad, y por supuesto la respectiva automatización de estas tareas que son fundamentales en el flujo de trabajo. Esto le permite a los desarrolladores abordar las vulnerabilidades conocidas desde el principio, proporcionando así un software seguro y resistente.


 • Realizar test de seguridad a lo largo del ciclo de desarrollo:
Debemos lograr que las pruebas de seguridad sean un proceso continuo y una parte integral de todo el ciclo de desarrollo de la aplicación. Apuntando a todo tipo de aplicaciones, APIs, contenedores, datos, procesos y microservicios.
Cuanto antes podamos identificar las fallas, mucho más fácil será corregirlas, pero ser capaz de identificar fallas en todas partes, desde el desarrollo hasta la producción, asegurará que puedas mantener la conciencia respecto de las vulnerabilidades, sin importar dónde surjan.

 • Monitorea los procesos, infraestructura y aplicaciones:
Existen varios datos que nos interesan a la hora de monitorear, no solo recolectamos logs para analizar la salud de nuestros activos, sino que existen varios enfoques a la hora de pensar que observar y sobre qué punto de nuestra información poner la lupa. Entre las cuestiones a revisar encontramos:

 • Recopilar inteligencia en tiempo real, te permite tomar decisiones más acertadas y aplicar un cumplimiento preciso.
 • Recolectar y analizar métricas relevantes, registros de eventos y datos de máquinas para obtener información en tiempo real a lo largo del ciclo de vida de la aplicación.
 • Monitorear las aplicaciones en producción para asegurarnos de detectar nuevas vulnerabilidades y eventos de seguridad.

Todas estas cuestiones sirven para aprovechar la oportunidad de resolver problemas de manera temprana, rápida y con un costo mínimo.

 • Generar alertas accionables cuando haya problemas:
Esto consiste en implantar una herramienta que notifique al equipo cuando haya un problema en todas las áreas clave de enfoque, incluida la seguridad. Esta debe tener la capacidad de enviar alertas accionables a las personas relevantes. Pero antes estas alertas de las que hablamos deben estar correctamente depuradas, para evitar una potencial ceguera en el equipo de monitoreo. Más alertas no significa más monitoreo.


Sobre los ambientes

 • Asegura y monitorea todo tu entorno físico y virtual:
Para poder asegurar en primer lugar debemos enumerar cuáles son nuestros entornos más críticos. La seguridad debe estar integrada en todos estos entornos. Debemos tomar medidas para asegurar la infraestructura, incluyendo entornos locales y en la nube, redes, canal de CI/CD, código, datos, sistemas operativos, aplicaciones y software.

 • Recopilar métricas para medir el éxito:
La seguridad es un viaje que nunca termina, así que tenemos que concentrarnos en resolver e ir mejorando continuamente para mejorar todas nuestras brechas de conocimiento. Recopilar y actuar en función de la información de seguridad y cumplimiento de entornos locales y en la nube. Recopilando las métricas de alto valor para obtener información y determinar la efectividad de tus procesos de seguridad y así generando una iteración siempre que las cosas mejoren.

 • Asegurar y reforzar los containers:
Seguir las mejores prácticas de seguridad para containers. Asegura la autenticación y la autorización. Inspeccionar, escanear y proporcionar seguridad a los archivos asociados a las imágenes que extraemos de lugares confiables para aplicar la debida sanidad. Utilizando registros privados como Google container registry o Quay de la empresa Red Hat. Pudiendo crear una arquitectura a partir de contenedores confiables y verificados.

 • Aislar la infraestructura de Dockers y Kubernetes:
Asegurar y aislar tus contenedores de manera temprana, frecuente y continua. Una forma correcta de hacerlo es segmentar los contenedores utilizando herramientas como Apparmor,Seccomp y SELinux. Estas herramientas nos permiten crear capas de aislamiento entre aplicaciones diferentes y entre aplicaciones y hosts. Esto reduce la superficie del host, restringiendo así el acceso y protegiéndolo, al igual que los contenedores ubicados en él.


 • Realizar ejercicios de modelado de amenazas:
Un ejercicio de modelado de amenazas identifica los defectos de diseño y los componentes que tienen un mayor riesgo, y debería brindar al equipo de seguridad la oportunidad de priorizar y abordar los defectos según su impacto. En particular, el modelado de amenazas ayuda a los equipos a comprender el tipo de activos que están protegiendo, los niveles de sensibilidad, las amenazas potenciales y su impacto.

 • Reforzar los despliegues en la nube:
Los entornos en la nube pueden proporcionar una infraestructura segura si se implementan correctamente. Entregar la posibilidad de realizar un deploy por fuera del flujo de pasaje a producción es hoy en día uno de los principales peligros ya que generan una falsa sensación de independencia del área de sistemas. Por lo que revisar los equipos y los roles y permisos individuales que hemos asignado suele ser una gran oportunidad para un cambio.
Debemos conceder acceso solo a lo que cada individuo o equipo necesita para desempeñar sus funciones. Imponiendo medidas tales como la autenticación multifactor para todos los roles críticos.


Sobre la cultura y los comportamientos

 • Desarrollar una sólida cultura de seguridad
Una sólida cultura de seguridad entre los desarrolladores, operaciones y el equipo de seguridad es esencial. Fomentar la apertura de las vías de comunicación para así tener una retroalimentación sólida entre áreas. Logrando esto cambiamos la imagen de nuestra área de seguridad, en nuestro post Design Thinking aplicado a la ciberseguridad encontramos como podemos lograr que nuestra área de seguridad sea más empática a la hora de proponer cambios entendiendo las necesidades de los usuarios.

Además de esto poder trasladar la responsabilidad de la seguridad a todos estos equipos, en contraposición al enfoque tradicional en el que era exclusivamente responsabilidad del departamento de seguridad, suma más manos al esfuerzo de generar un ecosistema mucho más seguro. Si logramos que la seguridad provenga de un lugar de "sí, averigüemos cómo hacer esto de manera segura" en lugar de "no, no puedes hacerlo por razones de seguridad", la seguridad pasará de ser un obstáculo a ser un habilitador.


 • Desarrolla una cultura de Seguridad como Código:
Introducir una mentalidad de seguridad en primer lugar sin afectar las prácticas ágiles en las que los desarrolladores confían para crear aplicaciones. Animando a tus desarrolladores a agregar seguridad al código a medida que construyen las aplicaciones, haciendo que las acciones seguras sean las acciones más fáciles siempre que sea posible.

 • Proporciona formación y herramientas a los desarrolladores:
Debemos asegurarnos de que los desarrolladores tengan la información, el apoyo y las herramientas necesarias para realizar sus tareas de manera eficiente. También fomentar el intercambio de conocimientos y crear un proceso de toma de decisiones entre los diferentes departamentos para promover la autonomía del equipo.

Sobre las APIs

 • Asegurar tus APIs
Las APIs permiten la interacción y el intercambio de datos entre aplicaciones y, por lo tanto, están más expuestas y propensas a riesgos de seguridad. Asegurar todas las APIs que la empresa consume, así como las que expone al público. Utilizar correctamente el cifrado para proteger la información de las solicitudes en tránsito, al tiempo que exista una limitación en la cantidad de información asociados a los mensajes de error de la API.

 • Autenticar y autorizar a los usuarios de la API
Utiliza identificadores y claves de API para identificar y autenticar a los usuarios, dispositivos o aplicaciones. Utilizar un marco de control de acceso como OAuth o SAMLv2 para controlar las API a las que los usuarios autenticados o claves de API específicas pueden acceder.

En uno de nuestros Post detallamos con más especificaciones todas las potenciales recomendaciones en lo que respecta al mundo de las APIs.

Sobre la codificación

 • Seguridad en el código en tus aplicaciones
Crear código seguro desde el inicio del desarrollo hasta la implementación de la aplicación puede ser una tarea muy difícil sin la ayuda de los que saben. Asegurémonos de que la seguridad esté integrada en el código en lugar de añadirla como una reflexión posterior, esto se puede lograr fácilmente involucrando a los analistas de seguridad desde el momento cero. También debemos mantener el código y las implementaciones lo más simples posible para así evitar complejidades que podrían comprometer la seguridad. Implementando procesos y mejores prácticas que faciliten a los desarrolladores tomar decisiones seguras de manera fácil y directa.

 • Revisa continuamente el código en cada etapa
Revisar el código y los estándares en cada etapa para asegurarnos de que cumplan con las mejores prácticas de seguridad. Utiliza SAST y DAST para analizar el código, y otras herramientas automáticas para rastrear dependencias y escanear todo el código de terceros y de código abierto. Realizar verificaciones en los distintos tiempos asociados a la construcción de código, tiempo de pre-compromiso, tiempo de compromiso, tiempo de construcción, tiempo de prueba y tiempo de implementación en nuestro canal de integración continua y deployment (CICD).


 • Introducir el caos en la zona de confort
Utilizar la ingeniería del caos para probar cuán preparados están tus sistemas para responder a amenazas de seguridad en entornos operativos no familiares. Ejecutar scripts para apagar instancias de servidor de manera aleatoria, derribar contenedores de manera aleatoria, interrumpir algunos servicios o crear interrupciones inesperadas en las aplicaciones e infraestructura. Esto ayuda a los equipos a proporcionar una defensa en movimiento que protege tus sistemas en una amplia gama de condiciones y asegura que algo inesperado no haga que todo se desmorone.

Un modelo de éxito relacionado con esta metodología es el modelo Chaos Monkey que aplica Netflix en su arquitectura de seguridad.


 • Mantén un inventario de tus aplicaciones y componentes
Crear y mantener un inventario actualizado de los activos de tus aplicaciones. Obteniendo visibilidad sobre lo que se está implementando y lo que tu organización tiene en uso. Mantener un inventario actualizado te ayudará a descubrir nuevos conocimientos en seguridad y evitará que te tomen desprevenido cuando se implemente algo inseguro o se descubran vulnerabilidades de seguridad en algo antiguo y olvidado.

 • Escanear y asegurar tus componentes de código abierto y de terceros
Mantenete al tanto de tus dependencias de código abierto y de terceros. Asegurate de que siempre estén actualizadas y verifica regularmente que no sean vulnerables.

 • Inicia un programa de análisis de seguridad en tu código
Utiliza la modelización de amenazas, pentesting y pruebas de vulnerabilidades para confirmar que tu código es seguro. Determinando así la cantidad de vulnerabilidades graves y cuánto tiempo persisten antes de que tu equipo las resuelva. Analiza la frecuencia y alcance de las pruebas automatizadas, así como la cantidad y tipo de ataques a tus aplicaciones.

Sobre la protección

 • Utilizar las mejores prácticas y herramientas de seguridad
Observar las mejores prácticas estándar de seguridad. Reducir tu superficie de ataque (fortalece la infraestructura y los servicios), cifrar tus datos y canales de comunicación, filtrar y bloquear el tráfico malicioso. Realizar las auditorías regulares y celebrar cada vez que pasen porque vienen a enseñarnos nuevas formas, pero principalmente nos recuerdan sobre qué puntos poner atención.

 • Automatizar la gestión de políticas de datos
Utilizar una aplicación automatizada de políticas para gestionar el ciclo de vida y el flujo de los datos. Creando registros de auditoría antes y después de cualquier problema de seguridad.

 • Utiliza herramientas existentes de DevOps para automatizar algunas funciones de seguridad. Por ejemplo:
 • Chef: Para automatizar pruebas de seguridad
 • Puppet: Para evaluar el cumplimiento y aplicar políticas de seguridad
 • Ansible: Para definir y automatizar mejores prácticas de seguridad, como aplicar políticas personalizadas, configurar reglas de firewall, bloquear ciertos usuarios, etc.
 • SaltStack: Para automatizar prácticas de seguridad

Combinar herramientas comunes con una plataforma de monitoreo continuo de seguridad y variar esta solución en función de nuestra disponibilidad respecto de los distintos tipos de herramientas existentes.

 • Complementar las pruebas automáticas con pruebas manuales creativas
Los scripts de pruebas automáticas pueden no ser capaces de reconocer o identificar problemas visuales que el ojo humano podría percibir. Además, un tester humano interactuará con el software y descubrirá si hay problemas de usabilidad o interfaz.
Otro desafío es cuando los scripts de pruebas automáticas contienen errores o fallos que generan resultados falsos negativos o positivos, es ahí donde el chequeo manual debe interactuar lo antes posible para evitar un arrastre de error futuro.

 • Seguir las mejores prácticas de protección en postproducción:
Automatizar el escaneo y recopilar métricas a nivel de aplicación al implementar la misma. Podemos en este caso utilizar una herramienta como Chef para automatizar la gestión de la configuración, así como la aprovisionamiento del entorno en tiempo de ejecución.

 • Reducir la superficie de ataque
Integrar medidas de protección y detección en la arquitectura para limitar tu superficie de ataque y reducir la exposición a amenazas internas y externas. Concentrándonos en áreas de alto riesgo, como formularios web, código expuesto a internet, control de acceso, códigos de gestión de sesiones, datos de fuentes externas y otros puntos de entrada que interfieren con redes externas. Básicamente nuestras joyas de la corona.

 • Mantener al día las herramientas de seguridad:
Las soluciones de seguridad que implementen deben mantenerse al ritmo de los cambios en los entornos de aplicaciones e infraestructura, así como con tu propio crecimiento. Estas deberían tener la capacidad de proteger tu sistema en tiempo real y enviar alertas automáticamente cuando surgen problemas de seguridad. Si las mismas no se actualizan los resultados no serán perfectos nunca.

Conclusión

Considerando todos los puntos sobre los que se conversaron, podemos destacar que lo más importante es amigarse con el proceso referido a la metodología DevSecOps, para poder ver su viabilidad. Muchas veces creemos que estamos lejos, cuando en realidad nunca nos paramos a analizar cuánto nos faltaría para poder implementar este tipo de metodología en nuestra empresa. Compartan en los comentarios si les sirvieron estos consejos.