Skip to main content

¿Quieres evitar una filtración de datos? Detecta secretos

Escrito por

16 de septiembre de 2024

0 minutos de lectura

Como desarrollador de software, garantizar la seguridad de tus aplicaciones es fundamental. Una parte clave de esta tarea consiste en gestionar los secretos y usar una herramienta para detectarlos. En este contexto, los secretos son datos confidenciales, como claves de API, credenciales de bases de datos, claves de cifrado y otra información privada. El acceso no autorizado a estos datos o su exposición puede tener consecuencias catastróficas, como filtraciones de datos y graves pérdidas para el negocio.

Los secretos codificados directamente en el código son habituales durante el desarrollo. Ofrecen una forma rápida y sencilla de autenticarse con servicios externos, bases de datos u otros componentes que requieren control de acceso. Por ejemplo, es bastante común encontrar claves de API o credenciales de bases de datos codificadas directamente en las aplicaciones, sobre todo en las primeras etapas del desarrollo.

# Example of hardcoded database credentials
host = 'localhost'
database = 'my_database'
user = 'my_user'
password = 'my_password'

Este enfoque puede parecer una forma de ahorrar tiempo, pero introduce numerosos riesgos de seguridad que se pueden evitar fácilmente mediante la detección de secretos.

Pero ¿y si pudieras detener una filtración de datos al detectar secretos desde las primeras etapas del desarrollo? Aquí tienes una captura de pantalla de la extensión de Snyk para el IDE IntelliJ, que detecta secretos codificados directamente en el código y otras credenciales de bases de datos en una aplicación JavaScript:

Snyk Code detecta secretos codificados de forma fija y credenciales de bases de datos en una aplicación JavaScript con la extensión de Snyk para IntelliJ IDE instalada

Los desarrolladores, los equipos de DevOps y el personal de seguridad se esfuerzan continuamente por garantizar que los secretos estén protegidos, controlados y monitoreados adecuadamente durante todo su ciclo de vida. Sin embargo, a medida que las arquitecturas de las aplicaciones se vuelven más complejas y distribuidas, gestionar los secretos de forma segura y eficiente se convierte en un desafío importante.

¿Qué son los secretos en el desarrollo de software?

En el ámbito del desarrollo de software, el término «secretos» se refiere a datos confidenciales que, si quedan expuestos, pueden permitir el acceso no autorizado y el uso indebido de sistemas y datos. Entre estos secretos se incluyen:

  • Contraseñas: frases secretas o cadenas de caracteres que se usan para autenticar usuarios, comprobar su identidad o permitirles acceder a un recurso.

  • Claves de API: identificadores únicos que se usan para autenticar a un usuario, desarrollador o programa que realiza llamadas a una API.

  • Tokens: un token es un fragmento de datos que crea el servidor y que puede contener información para identificar a un usuario, indicar la validez del token y registrar la hora de emisión. Un buen ejemplo son los JSON Web Tokens (JWT).

Errores comunes que cometen los desarrolladores con los secretos

Los desarrolladores suelen cometer ciertos errores al trabajar con secretos. Estos son algunos de los más comunes:

  1. Codificar secretos directamente en el código: Los desarrolladores suelen incluir secretos directamente en el código fuente de la aplicación. Esta práctica es muy insegura, ya que cualquier persona con acceso a la base de código podría obtener esos secretos.

  2. Almacenar los secretos de forma inadecuada: Guardar secretos en archivos de texto sin formato, archivos de configuración o bases de datos sin ningún tipo de cifrado es otro error común.

  3. No rotar los secretos con suficiente frecuencia: Cambiar o rotar los secretos con regularidad es una buena práctica de seguridad. Sin embargo, muchos desarrolladores lo pasan por alto y dejan los mismos secretos en uso durante períodos prolongados.

# An example of hardcoding secrets in Python
password = "mySuperSecretPassword"
api_key = "myAPIKey1234"

Consecuencias de una gestión deficiente de secretos

Las consecuencias de una gestión deficiente de secretos son graves y de largo alcance. Esto pone de relieve la importancia de usar mecanismos de detección de secretos durante todo el ciclo de vida del desarrollo de software.

Filtraciones de datos: La consecuencia más inmediata y peligrosa de una gestión deficiente de secretos es la posibilidad de que se produzca una filtración de datos. Si un atacante obtiene acceso a secretos expuestos, puede infiltrarse fácilmente en tus sistemas, acceder a datos confidenciales e incluso tomar el control de tu infraestructura. Por ejemplo, puede usar claves de API para suplantar a tu aplicación, credenciales de bases de datos para robar o manipular datos, o certificados para vulnerar el cifrado que tienes implementado. Las filtraciones de datos pueden provocar importantes pérdidas económicas, daños a la reputación y consecuencias legales.

Incumplimiento normativo: En una época en la que las regulaciones de privacidad y seguridad de datos son cada vez más estrictas, una gestión deficiente de secretos puede generar problemas de incumplimiento. Las infracciones de normativas como GDPR, CCPA y HIPAA pueden dar lugar a multas cuantiosas y sanciones legales.

Pérdida de competitividad empresarial: Los secretos suelen permitir el acceso a algoritmos propios, lógica de negocio y datos estratégicos. Su exposición puede provocar la pérdida de ventajas competitivas y el robo de propiedad intelectual.

Este es un ejemplo de lo fácil que es exponer un secreto en un repositorio de Git:

# Initial commit with a secret
echo "SECRET = 'my_super_secret_key'" > config.py
git add config.py
git commit -m "Initial commit"

# Realize the mistake and remove the secret
echo "SECRET = 'REMOVED'" > config.py
git commit -am "Remove secret"

Aunque el secreto se eliminó en el segundo commit, sigue presente en el historial del repositorio y cualquier persona con acceso a este puede recuperarlo.

Para evitar estas consecuencias y mejorar la postura de seguridad de tus aplicaciones, es fundamental usar soluciones de detección y gestión de secretos. Herramientas como Snyk pueden ayudarte a identificar secretos expuestos en tu base de código desde las primeras etapas del desarrollo, cuando los desarrolladores instalan la extensión de Snyk para el IDE, o durante el pipeline de CI/CD, cuando integras las funciones de detección de secretos de Snyk.

Cómo funciona la detección de secretos

La detección de secretos es el proceso de identificar información confidencial o «secretos», como claves de API, contraseñas y tokens, que podrían quedar expuestos en tu base de código. La exposición o el uso indebido de estos secretos podría permitir el acceso no autorizado o provocar filtraciones de datos.

La detección de secretos es fundamental para prevenir filtraciones de datos, ya que permite identificar y marcar posibles secretos expuestos antes de que alguien pueda aprovecharlos. Por ejemplo, si un secreto se envía por error a un repositorio público, se puede detectar y eliminar antes de que lo descubran actores maliciosos. Para detectar secretos de forma eficaz, es clave usar herramientas de análisis automatizado que recorran tu base de código para encontrar y marcar posibles secretos. Una forma de hacerlo es usar expresiones regulares (regex) y patrones conocidos para identificar posibles secretos.

Por ejemplo, una clave de API se podría detectar con un patrón como este:

import re

# This is a very simplified example
API_KEY_REGEX = r'[A-Za-z0-9]{32}'

def detect_secrets(text):
    return re.findall(API_KEY_REGEX, text)

Este es un ejemplo simplificado, pero el concepto es el mismo: al buscar patrones conocidos, es posible identificar posibles secretos en el código. En situaciones reales, las herramientas de detección de secretos como Snyk usan técnicas mucho más sofisticadas para detectarlos.

Terminal que muestra a Snyk Code detectando un secreto de alta gravedad codificado de forma fija en settings.py durante el análisis estático de código.

Integrar la detección de secretos en el pipeline de CI/CD

Para aprovechar al máximo las ventajas de la detección de secretos, debes integrarla en tu pipeline de integración continua y entrega continua (CI/CD). Así podrás detectar posibles secretos desde las primeras etapas del proceso de desarrollo.

Por ejemplo, puedes configurar tu pipeline de CI/CD para que ejecute un análisis de detección de secretos cada vez que se envíe un commit nuevo. Si se detecta algún secreto, puedes configurar el pipeline para que falle y avise al equipo del problema.

# This is a simplified example of a CI/CD pipeline configuration steps:
  - name: Run Secrets Detection
    run: snyk code test
  - name: Build
    run: make build
  - name: Deploy
    run: make deploy

En este ejemplo, el comando snyk code test ejecuta un análisis de detección de secretos como primer paso del pipeline. Si se detecta algún secreto, el pipeline fallará y no se ejecutarán los pasos de compilación ni de despliegue.

Implementar la detección de secretos con Snyk

Las filtraciones de datos pueden ser desastrosas: perjudican tu reputación y la confianza de tus clientes, y pueden dar lugar a sanciones económicas. Si quedan expuestos, los secretos como claves de API, tokens y contraseñas pueden facilitarles a los actores maliciosos el acceso a tu sistema. Una forma eficaz de protegerte es implementar la detección de secretos en tu pipeline de desarrollo. En este capítulo, te explicamos cómo usar SAST de Snyk para evitar que se envíen secretos al repositorio y prevenir posibles filtraciones de datos.

Introducción a las funciones de detección de secretos de Snyk

Snyk ofrece una sólida función de detección de secretos como parte de su oferta integral de seguridad de aplicaciones. Puede analizar tus repositorios de código en busca de posibles secretos y avisarte de forma segura cuando los encuentre. Esta función está integrada en el producto Snyk Code, que ofrece comentarios y sugerencias en tiempo real mientras escribes código.

La función de detección de secretos de Snyk usa patrones y heurísticas sofisticados, diseñados para encontrar posibles secretos en tu código que los atacantes podrían aprovechar.

Configurar extensiones de Snyk para el IDE y detectar secretos en tiempo real

Para empezar a usar las funciones de detección de secretos de Snyk, debes configurar la extensión de Snyk para el IDE. Esta extensión integra directamente las funciones de Snyk en tu entorno de desarrollo y te ofrece comentarios y sugerencias en tiempo real mientras escribes código.

Para configurar la extensión para el IDE:

  1. Ve a la sección Extensiones de tu IDE (Visual Studio Code, IntelliJ, etc.).

  2. Busca «Snyk».

  3. Instala la extensión de Snyk.

  4. Inicia el complemento o reinicia tu IDE.

Una vez instalada la extensión de Snyk, empezará a analizar automáticamente tu código para detectar posibles secretos mientras desarrollas.

# Example of a Snyk scan output
Detected secrets:
- AWS Access Key ID: AKIAIOSFODNN7EXAMPLE
- AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Prácticas recomendadas para usar Snyk y evitar enviar secretos al repositorio

Al usar Snyk para detectar secretos, es importante seguir algunas prácticas recomendadas.

  • Nunca envíes secretos a tus repositorios de código. Aunque uses repositorios privados, siempre existe el riesgo de que los secretos queden expuestos. Si Snyk detecta un secreto, asegúrate de eliminarlo del código y, si es posible, invalidarlo.

  • Usa variables de entorno para almacenar secretos. En lugar de codificar secretos directamente en tu código, usa variables de entorno. Así será más fácil gestionar los secretos y se reducirá el riesgo de que se envíen a tu repositorio de código.

  • Analiza periódicamente tus repositorios de código con Snyk. Los análisis periódicos ayudan a garantizar que no se pase por alto ningún secreto. Puedes configurar análisis automatizados con Snyk para facilitar este proceso.

  • Instruye a tu equipo sobre la importancia de gestionar los secretos. Todas las personas de tu equipo deben comprender los riesgos de enviar secretos a los repositorios y la importancia de usar las funciones de detección de secretos de Snyk.

Seguir estas prácticas recomendadas y usar Snyk puede reducir significativamente el riesgo de que se expongan secretos y se produzcan filtraciones de datos. Recuerda que la seguridad no es una tarea que se hace una sola vez, sino un proceso continuo. Empieza a mejorar tu seguridad registrándote en Snyk aquí.

Visita los recursos de aprendizaje de Snyk para obtener más información sobre la gestión de secretos, las herramientas y las prácticas recomendadas.

Estrategias avanzadas para gestionar secretos

En el ámbito de la seguridad de aplicaciones y el desarrollo de software, gestionar secretos como claves de API, contraseñas y certificados es una tarea importante. Una gestión eficaz de secretos facilita el cumplimiento normativo y previene filtraciones de datos. A continuación, exploramos algunas estrategias avanzadas que pueden mejorar tus prácticas de gestión de secretos.

Usar variables de entorno para gestionar secretos

Una forma segura de gestionar secretos es usar variables de entorno. Se pueden utilizar en muchos lenguajes de programación y permiten separar los secretos de la base de código. Esto es fundamental para evitar que los secretos queden expuestos por error, sobre todo en proyectos de código abierto.

Este es un ejemplo en Python:

import os
SECRET_KEY = os.environ.get('SECRET_KEY')

En este ejemplo, SECRET_KEY es una variable de entorno que almacena la clave secreta. La función os.environ.get() obtiene el valor de la variable de entorno. Si no encuentra la variable, devuelve None.

Usar herramientas y servicios de gestión de secretos

Usar herramientas y servicios de gestión de secretos puede mejorar significativamente su seguridad. Herramientas como HashiCorp Vault y servicios en la nube como AWS Secrets Manager o Azure Key Vault permiten almacenar secretos de forma segura y controlar estrictamente el acceso a ellos.

Este es un ejemplo de cómo recuperar un secreto de AWS Secrets Manager con AWS SDK for Python:

import boto3
secretsmanager = boto3.client('secretsmanager')
response = secretsmanager.get_secret_value(SecretId='my_secret')

En este ejemplo, my_secret es el nombre del secreto almacenado en AWS Secrets Manager. La función get_secret_value() recupera el secreto.

Automatizar la rotación de secretos

Automatizar la rotación de secretos es un aspecto fundamental de su administración. Cambiarlos con regularidad puede impedir que un atacante potencial use un secreto antiguo para obtener acceso no autorizado.

Esto se puede hacer con servicios de administración de secretos como AWS Secrets Manager, que permite rotar automáticamente los secretos de Amazon RDS, Amazon DocumentDB y Amazon Redshift.

Este es un ejemplo de cómo configurar la rotación automática de secretos en AWS Secrets Manager:

import boto3
secretsmanager = boto3.client('secretsmanager')
response = secretsmanager.rotate_secret(
  SecretId='my_secret',
  RotationLambdaARN='my_lambda_function',
  RotationRules={
    'AutomaticallyAfterDays': 30
  }
)

En este ejemplo, my_secret es el nombre del secreto que se rotará, my_lambda_function es la función de AWS Lambda que realiza la rotación y AutomaticallyAfterDays es la frecuencia de rotación en días.

Para mejorar la seguridad de tus aplicaciones, considera usar un producto de seguridad como Snyk. Snyk ofrece una función de detección de secretos que puede identificar secretos en tu base de código y evitar que queden expuestos. Puedes registrarte en Snyk aquí.

Las estrategias que se analizan aquí son algunas de las muchas que pueden mejorar la administración de secretos. Combinarlas con otras medidas de seguridad proactivas puede reforzar considerablemente las defensas de tu aplicación contra las amenazas y garantizar que tus esfuerzos de desarrollo de software y cumplimiento sean seguros y eficaces.

Filtraciones de datos históricas debido a secretos expuestos

Las filtraciones de datos han sido un problema persistente en el ámbito de la seguridad de las aplicaciones y el desarrollo de software. Los secretos o credenciales expuestos son una causa frecuente y pueden dar lugar a accesos no autorizados y filtraciones de datos. En esta sección, analizaremos algunas filtraciones de datos históricas causadas por secretos expuestos y hablaremos de las lecciones aprendidas y la importancia de detectar secretos.

Filtración de datos de Uber: las consecuencias de las credenciales expuestas

En 2016, Uber sufrió una importante filtración de datos que expuso la información de 57 millones de clientes y conductores. ¿La causa? Credenciales de AWS expuestas en un repositorio privado de GitHub que usaban sus desarrolladores. Los atacantes obtuvieron acceso a estas credenciales y luego accedieron a la cuenta de AWS de Uber para descargar una gran cantidad de datos confidenciales.

Este incidente destaca la importancia de almacenar las credenciales de forma segura y los riesgos de guardar secretos de este tipo en repositorios de código, incluso si son privados.

Cloudflare: el impacto del robo de un token de autenticación de Okta

En 2019, Cloudflare fue víctima de una importante filtración de datos. La filtración se produjo cuando robaron en GitHub un token de autenticación de Okta de un empleado de Cloudflare. El atacante usó este token para acceder a los sistemas internos de Cloudflare y expuso datos confidenciales de clientes.

Este incidente ilustra los posibles riesgos de guardar claves secretas, como los tokens de autenticación, en repositorios de código, aunque se consideren seguros.

Codecov: cómo los secretos codificados de forma fija provocaron una filtración masiva

En 2021, Codecov, una plataforma que los desarrolladores usan para generar informes de cobertura de código, sufrió una importante filtración de datos en la que los atacantes aprovecharon un error en el proceso de creación de imágenes de Docker. Este error provocó la exposición de secretos codificados de forma fija. Los atacantes usaron estos secretos para modificar el script Bash Uploader de Codecov y así exportar datos confidenciales de los entornos de los usuarios.

¿La lección de este incidente? Los secretos codificados de forma fija representan un riesgo importante. Para mitigarlo, lo mejor es usar herramientas como Snyk para detectar y administrar secretos.

Sumo Logic: lecciones aprendidas

En 2023, Sumo Logic, una empresa de administración de registros basada en la nube, anunció una filtración de seguridad que implicó el compromiso de su cuenta de AWS, detectado el 3 de noviembre de 2023. A pesar del acceso no autorizado mediante una credencial comprometida, la empresa confirmó que sus redes y sistemas no se vieron afectados y que los datos de los clientes estaban cifrados de forma segura. Como respuesta, Sumo Logic protegió la infraestructura afectada y actualizó las credenciales que podrían haberse expuesto.

GitHub: el caso de una clave SSH privada expuesta 

En uno de los incidentes más irónicos, GitHub, una plataforma muy utilizada para alojar código, sufrió una filtración de datos debido a la exposición de una clave SSH privada. La clave se incluyó por accidente en un repositorio público y un usuario no autorizado la usó para acceder a los sistemas internos de GitHub.

Este incidente, al igual que muchos de los mencionados anteriormente, destaca la importancia de administrar y detectar los secretos de forma adecuada para prevenir filtraciones de datos.