In this article
Tecnología DevSecOps
La tecnología permite que tu equipo ejecute correctamente los procesos de DevSecOps. Cuando la mayoría piensa en DevSecOps y CI/CD, suele tener las herramientas en mente. La capacidad de integrar y automatizar diversos procesos de desarrollo, seguridad y operaciones es fundamental para implementar DevSecOps con éxito. A continuación, encontrarás una colección de tecnologías que las organizaciones deben considerar al buscar implementar una metodología DevSecOps exitosa en toda la empresa.
Repositorio de código fuente
El repositorio de código fuente es fundamental en casi todos los entornos de desarrollo del mundo. Al implementar un enfoque DevSecOps, el repositorio es la tecnología clave con la que se integran la mayoría de las demás tecnologías del pipeline. Al evaluar si la organización está lista para adoptar el paradigma DevSecOps, se debe considerar la capacidad del repositorio para integrarse con otras tecnologías críticas.
A medida que se definen cada vez más aspectos del entorno de aplicaciones en código, la seguridad del repositorio se vuelve primordial. Se deben implementar prácticas recomendadas para el acceso de usuarios, las configuraciones del repositorio y otros aspectos. La exposición del repositorio a personas no autorizadas o innecesarias puede generar riesgos importantes.
Enfoque tecnológico: prácticas recomendadas para repositorios de Bitbucket
Bitbucket es uno de los repositorios más populares en las organizaciones DevSecOps. Su cómoda interfaz web y la integración con una amplia variedad de tecnologías lo convierten en una opción ideal para los requisitos de automatización y orquestación de DevSecOps. Sin embargo, esa popularidad también conlleva un aumento de las vulnerabilidades de seguridad, que suelen deberse a configuraciones o usos inseguros de los repositorios. Para ayudar a defenderse de estos problemas, se deben aplicar las siguientes prácticas recomendadas:
Nunca almacenes credenciales como código o configuración en Bitbucket
Siempre se deben seguir prácticas de administración de secretos en los repositorios almacenados en Bitbucket. Algunas de estas prácticas incluyen usar git-secrets, auditar secretos con regularidad y utilizar un administrador de secretos de confianza.Elimina los datos confidenciales
Si llegan a almacenarse datos confidenciales en un repositorio, invalida todos los tokens y contraseñas expuestos, elimina la información y borra el historial de Git. También evalúa el impacto de la filtración de información privada.Controla estrictamente el acceso
Las fallas de seguridad en los repositorios suelen deberse a errores humanos. Para ayudar a mitigar este riesgo, aplica una administración sólida de usuarios y utiliza técnicas de control de acceso.Agrega un archivo SECURITY.md
Debes incluir un archivo SECURITY.md que destaque información de seguridad relacionada con tu proyecto. El archivo debe incluir una política de divulgación, una política de actualización de seguridad, una configuración relacionada con la seguridad, brechas de seguridad conocidas y mejoras futuras.Valida las aplicaciones de Bitbucket
Se deben verificar los derechos de acceso, la credibilidad del autor o la organización y la postura general de seguridad de estas aplicaciones, desarrolladas por terceros.Recibe consejos de seguridad dentro del flujo de trabajo con Code Insights
Analiza todos los pull request abiertos con Bitbucket Code Insights. Esto ayudará a identificar nuevas vulnerabilidades que podría introducir el pull request.Agrega pruebas de seguridad a los pull requests
Usa los hooks de Bitbucket para comprobar que los pull requests no introduzcan nuevas vulnerabilidades.Agrega pruebas de seguridad a Bitbucket Pipelines
Agrega pipes de análisis de seguridad al flujo de CI/CD para garantizar que los pipelines automatizados no tengan regresiones de seguridad.Considera Bitbucket Server
Para reducir considerablemente la superficie de ataque de un repositorio, Bitbucket Server permite alojarlo de forma local.Rota las claves SSH y los tokens de acceso personal
El acceso a Bitbucket suele realizarse mediante claves SSH o tokens de usuario personales. Rotar estas claves periódicamente puede reducir el riesgo de que una clave filtrada exponga tu repositorio.
Para obtener más información, consulta nuestro blog y la hoja de referencia disponibles en https://snyk.io/blog/cheat-sheet-10-bitbucket-security-best-practices/
Administración de la configuración
Tradicionalmente, las tareas necesarias para definir y mantener configuraciones coherentes en la infraestructura, el software de sistemas e incluso las aplicaciones de soporte requieren muchos recursos. Para habilitar un verdadero modelo DevSecOps, esta administración de la configuración debe automatizarse e integrarse en todo el ciclo de vida del desarrollo. Esto se ha vuelto más sencillo gracias al aumento de los componentes definidos como código.
Integrar y automatizar la administración de la configuración ofrece varias ventajas clave. En primer lugar, permite visualizar y generar informes fácilmente sobre los cambios en el entorno. Aunque no sustituye las prácticas de administración de cambios, puede garantizar un seguimiento adecuado. Además, esta automatización proporciona un control de versiones detallado que permite vincular los cambios de infraestructura y del software de soporte con las versiones del código que respaldan. Esto ayuda a eliminar problemas en los que configuraciones incompatibles provocan fallas de software. Por último, al automatizar la administración de la configuración, las organizaciones también garantizan que la configuración sea coherente en todo el entorno. Esto también facilita la identificación de amenazas y la respuesta a incidentes de seguridad.
Cuando una organización se prepara para implementar la administración automatizada de la configuración, hay algunos elementos clave que debe considerar.
Orquestación
Una de las grandes ventajas de integrar la administración automatizada de la configuración con la infraestructura como código es la posibilidad de automatizar la implementación de infraestructura según sea necesario. Ya sea que el entorno utilice máquinas virtuales, la nube o contenedores, hay soluciones que orquestan la implementación de infraestructura de forma dinámica. Al adoptar un modelo DevSecOps, las organizaciones deben comprender el alcance de estas implementaciones y asegurarse de utilizar las herramientas adecuadas para sus aplicaciones.

Fortalecimiento de hosts
La práctica de fortalecer los hosts no es nueva, pero si se utilizara con más frecuencia, se expondrían innecesariamente al público menos servicios y aplicaciones. Con la llegada de una infraestructura orquestada y altamente dinámica, esta práctica cobra aún más importancia. Innumerables incidentes de seguridad se relacionan directamente con dejar una superficie de ataque genérica que permite que las herramientas de ataque automatizadas tengan éxito incluso en los ataques más básicos. Las prácticas recomendadas y metodologías de fortalecimiento para la mayoría de las tecnologías están lo suficientemente maduras como para incluirse fácilmente en la creación de plantillas, reducir la superficie de ataque y reforzar un modelo de confianza. Este último puede codificarse como metadatos para que el pipeline de CI los procese posteriormente y luego se utilice en otros procesos, como la aplicación de parches.
Enfoque tecnológico: cómo proteger imágenes de Docker
A medida que más organizaciones migran a entornos nativos de la nube, el uso de contenedores ha crecido de forma exponencial. Las imágenes de Docker se han vuelto comunes, al igual que las brechas de seguridad causadas por imágenes de contenedores inseguras. Para ayudar a garantizar la seguridad de las imágenes de Docker, sigue estas prácticas recomendadas:
Minimiza las imágenes de contenedores
Elige imágenes con menos bibliotecas y herramientas del sistema operativo para reducir la superficie de ataque general. Cuando sea posible, utiliza imágenes basadas en Alpine en lugar de imágenes completas del sistema operativo.Limita los privilegios de los usuarios
Crea un usuario y un grupo dedicados en la imagen, con los permisos mínimos necesarios para ejecutar la aplicación; usa ese mismo usuario para ejecutar el proceso.Firma y verifica las imágenes de contenedores
Firma digitalmente las imágenes al crearlas y verifica su confianza y autenticidad cuando las descargues de un editor.Supervisa periódicamente las imágenes para detectar vulnerabilidades de código abierto
Analiza las imágenes de Docker para detectar vulnerabilidades conocidas e integra esos análisis en el entorno de integración continua.Protege las imágenes contra la filtración de información
A menudo, quedan tokens, claves y otros secretos expuestos en las imágenes durante la compilación. Para protegerte, utiliza compilaciones de varias etapas y la función de secretos de Docker para montar archivos confidenciales sin almacenarlos en caché. Además, un archivo .dockerignore puede ayudar a evitar instrucciones COPY que incluyan archivos confidenciales del contexto de compilación.Usa etiquetas fijas para garantizar la inmutabilidad
Se pueden enviar nuevas versiones de imágenes con las mismas etiquetas, lo que puede provocar que las imágenes varíen durante las compilaciones. Para evitarlo, usa etiquetas descriptivas que incluyan la versión y el sistema operativo, o bien una etiqueta basada en un hash del contenido.Usa COPY en lugar de ADD
La instrucción ADD puede exponer múltiples vectores de ataque, incluidos los ataques de intermediario y Zip Slip. Siempre que sea posible, usa COPY en su lugar.Usa etiquetas para los metadatos
Incluir metadatos adicionales en las etiquetas de las imágenes puede proporcionar información útil a los usuarios. También se recomienda incluir en ellas información sobre la política de divulgación responsable.Usa compilaciones de varias etapas para reducir el tamaño de las imágenes
Usa compilaciones de varias etapas para generar imágenes más pequeñas y limpias, y así reducir la superficie de ataque de las dependencias incluidas en las imágenes de Docker.Usa un linter
Una herramienta de análisis estático de código puede aplicar las prácticas recomendadas para Dockerfile y detectar posibles problemas.
Para obtener más información, consulta nuestro blog y la hoja de referencia disponibles en https://snyk.io/blog/10-docker-image-security-best-practices/
Dado que estos metadatos se definen en código y suelen almacenarse en un repositorio junto con el resto del código de la aplicación, también se deben implementar herramientas automatizadas que identifiquen vulnerabilidades en las configuraciones o desviaciones de las prácticas recomendadas de fortalecimiento. Esto ayuda a garantizar que la seguridad no solo esté integrada en el diseño y la implementación de la infraestructura, sino que también lo haga de forma discreta, sin obstaculizar el desarrollo.
CI/CD para la aplicación de parches
Una vez asociados los metadatos a cada activo, la organización puede usar estos datos para implementar la aplicación de parches en el nivel de CI/CD. Los datos de inteligencia de amenazas y administración de vulnerabilidades se pueden comparar con la pila de software implementada para identificar coincidencias en las plantillas y ponerlas en cola para su implementación. Aplicar parches a los sistemas en vivo pasará a ser cosa del pasado, lo que limitará el impacto del tiempo de inactividad. Esto también permitirá conocer la exposición al riesgo casi en tiempo real.
Prácticas de codificación segura
Todos los estándares de codificación segura deben revisarse constantemente frente a las nuevas recomendaciones de seguridad. Es necesario verificar y probar todos los cambios en el código según estas recomendaciones; ningún cambio es demasiado pequeño como para omitir este proceso. No es una tarea sencilla, y no se deben subestimar los beneficios asociados con estas prácticas, ya que no se limitan a la cantidad de cambios que ocurren durante el ciclo de vida del desarrollo.
El OWASP Top 10 es un excelente punto de partida para esta revisión: incorpora los cambios de código a las pruebas de control de calidad y aprovecha las pruebas automatizadas para proporcionar comentarios oportunos a los equipos de desarrollo. Además, los 19 dominios de verificación de OWASP ASVS se adaptan muy bien al proceso de creación de software seguro.
Ante el ritmo cada vez mayor de las nuevas técnicas y frameworks de desarrollo de software, el desarrollo basado en ataques establece un proceso para que los desarrolladores aprendan en paralelo sobre herramientas, técnicas y procedimientos de desarrollo de software y seguridad de aplicaciones.
Evaluación a nivel de aplicación
La evaluación automatizada de las aplicaciones para detectar vulnerabilidades de seguridad es un aspecto fundamental de DevSecOps. Permite que las empresas comprendan plenamente su postura de riesgo y corrijan las vulnerabilidades antes de que los atacantes las aprovechen. Las siguientes soluciones pueden ayudar a mejorar la postura de seguridad de un entorno DevSecOps:
Análisis del código fuente
El análisis del código fuente debe realizarse con herramientas de pruebas de seguridad de aplicaciones estáticas (SAST). SAST se utiliza para analizar el repositorio de código fuente, generalmente la rama principal, identificar vulnerabilidades y realizar análisis de composición de software. Las herramientas SAST deben integrarse en los procesos posteriores a la confirmación de cambios para garantizar que el código nuevo se analice de forma proactiva en busca de vulnerabilidades. Integrar una herramienta SAST permite corregir las vulnerabilidades en una etapa más temprana del ciclo de vida del desarrollo de software, y reduce el riesgo y la exposición de las aplicaciones.
Herramienta de análisis dinámico de aplicaciones (DAST)
Las herramientas de análisis dinámico de aplicaciones están diseñadas para analizar los sitios web de prueba y producción mientras están en funcionamiento, y examinar campos de entrada, formularios y diversos aspectos de la aplicación web para detectar vulnerabilidades. Estas herramientas deben integrarse en el pipeline a medida que las versiones se implementan en los distintos entornos.
Integración de SAST en el IDE
La integración de complementos de análisis estático de código en el IDE permite que los desarrolladores reciban notificaciones casi en tiempo real sobre prácticas de programación inseguras dentro del entorno de desarrollo integrado. Esto ofrece una forma eficaz de optimizar el código y corregir vulnerabilidades de inmediato, sin tener que salir del entorno de desarrollo.
Análisis de binarios
Se deben analizar todos los binarios para detectar problemas de seguridad según la lista de verificación de codificación y, luego, firmarlos digitalmente. La firma digital se trata de la misma manera que los metadatos. Por ejemplo, en CI solo se pueden usar e implementar binarios firmados, lo que garantiza el nivel adecuado de aprobación de seguridad sin tener que esperar a que el equipo de seguridad tenga tiempo disponible.
Auditoría previa a la implementación
Usar una plantilla predefinida para crear recursos es fundamental para garantizar el nivel de seguridad deseado, aunque esto debe complementarse con análisis del host. La mayoría de los escáneres de seguridad actuales ofrecen un módulo de cumplimiento que permite importar la plantilla.
Auditoría posterior a la implementación
Una vez implementadas, estas plantillas predefinidas se pueden comparar con los análisis previos a la implementación para identificar diferencias que puedan introducir amenazas de seguridad. Para automatizar este proceso de manera sencilla, se debe usar la integración con API.
Gestión automatizada de vulnerabilidades
Las soluciones de gestión de vulnerabilidades deben integrarse mediante API con las plataformas de análisis de infraestructura y aplicaciones web. Esta integración garantiza que la organización haga seguimiento de todas las vulnerabilidades detectadas. Además, en los entornos DevSecOps más avanzados, puede correlacionar en tiempo real las amenazas activas con las vulnerabilidades identificadas. Esto ayuda a identificar lo siguiente:
Qué recursos están expuestos a exploits conocidos.
Las nuevas amenazas que podrían representar un riesgo inmediato para la empresa.
Los procesos de gestión de vulnerabilidades también deben integrarse con el sistema de seguimiento de errores de los desarrolladores. Así, se pueden abrir registros de errores en cuanto se detectan vulnerabilidades, lo que permite corregirlas más rápido.
Análisis automatizado de cumplimiento
El cumplimiento se puede lograr mediante evaluaciones automatizadas de la configuración de seguridad para reducir los riesgos y mantener el cumplimiento continuo. Esto ayuda a reducir los costos de cumplimiento al disminuir el esfuerzo y el tiempo necesarios para evaluar los sistemas. Además, permite compartir datos de cumplimiento con la herramienta de GRC de la empresa y las aplicaciones del servicio de asistencia para que el estado de cumplimiento sea visible.
Gestión de secretos
En un entorno de seguridad de la información, los «secretos» incluyen toda la información privada que un equipo necesita conocer, como los datos de una base de datos o una API de terceros. Para establecer una conexión confiable, se necesitan credenciales, un certificado o un token de API. Sin embargo, incluso con estas precauciones, gestionar secretos puede ser difícil y a menudo puede dar lugar a errores o incluso a una brecha de seguridad.
Algunas técnicas para facilitar la gestión de secretos consisten en incluir una constante en el código fuente o guardar los secretos en un archivo de configuración que no se registre en el control de versiones. Estas técnicas resuelven algunos problemas, pero también generan otros desafíos, en especial con la rotación de claves.
El enfoque ideal es usar un almacén de contraseñas sincronizado, cifrado y compartido, que cada miembro del equipo pueda descifrar por separado, sin usar una contraseña compartida. Hay dos herramientas disponibles para lograrlo: GPG (GNU Privacy Guard) y Pass. GPG permite implementar una infraestructura de clave pública y se suele usar para cifrar correos electrónicos. Sin embargo, GPG puede ser complejo de usar, y Pass —cuyos desarrolladores lo llaman «el administrador de contraseñas estándar de Unix»— ofrece una interfaz práctica para GPG. Pass permite cifrar información secreta con una o varias claves privadas y guarda toda la información cifrada como archivos de texto sin formato en un solo directorio, que se puede compartir mediante el control de versiones. Estas herramientas permiten crear un conjunto de información cifrada y compartible que sigue siendo seguro.
La gestión eficaz de secretos con herramientas como GPG y Pass es un elemento esencial de DevSecOps. Estas herramientas intervienen desde la solicitud hasta la creación y distribución, y garantizan la seguridad en cada etapa.