Mejores prácticas para almacenar claves API de forma segura

Foto por Jose Fontano

En el pasado, he visto a muchas personas usar repositorios de Git para almacenar información confidencial relacionada con sus proyectos.

Últimamente, he visto a algunas personas anunciar que están almacenando claves API en sus repositorios privados de GitHub. Estoy escribiendo este artículo porque la gente debería comprender los riesgos de almacenar claves API con su código.

Este artículo no pretende ser una solución permanente a los problemas que pueda tener con el almacenamiento de claves API. En cambio, es mi propio análisis del problema y mis sugerencias sobre cómo solucionarlo.

Entonces, ¿cuál es exactamente el problema con el almacenamiento de información confidencial cerca de su código en un repositorio Git?

¿Por qué no deberías almacenar claves API en repositorios Git?

Almacenar claves API, o cualquier otra información confidencial, en un repositorio git es algo que debe evitarse a toda costa. Incluso si el repositorio es privado, no debería verlo como un lugar seguro para almacenar información confidencial.

Comencemos por ver por qué es una mala idea almacenar claves API en repositorios públicos de git.

Por naturaleza, cualquier persona puede acceder a un repositorio público de git.

En otras palabras, cualquier persona con conexión a Internet puede acceder a los contenidos de un repositorio público de git. No solo eso, sino que también pueden explorar todo el código dentro del repositorio y posiblemente incluso ejecutarlo. Si almacena una clave API en un repositorio público, está publicando al aire libre para que cualquiera pueda verla.

Una búsqueda reciente de client_secret en GitHub reveló que hay más de 30,000 confirmaciones que potencialmente exponen una clave API y un secreto. En algunos casos, solo copia y pega el código para acceder inmediatamente a la API.

Este problema se está volviendo tan importante que algunas compañías invierten en recursos para asegurarse de que no se filtren claves ni secretos de API.

El año pasado, Slack comenzó a buscar tokens API expuestos e invalidarlos de manera proactiva. Esta acción evita el acceso malicioso a las cuentas de Slack, pero no puede encontrar todos los tokens filtrados.

Entonces, esto está sucediendo en repositorios públicos de Git. ¿Qué pasa con los privados? ¿Por qué es eso un problema?

Los repositorios privados de Git alojados en servicios como GitHub, GitLab y Bitbucket están expuestos a un tipo diferente de riesgo. Cuando integra una aplicación de terceros con uno de los servicios mencionados, puede estar abriendo sus repositorios privados a dichos terceros. Esas aplicaciones podrán acceder a sus repositorios privados y leer la información contenida en ellas.

Si bien eso solo no crea un riesgo, imagine si una de esas aplicaciones se vuelve vulnerable a los atacantes. Al obtener acceso no autorizado a una de esas aplicaciones de terceros, los atacantes pueden obtener acceso a sus datos confidenciales, incluidas las claves API y los secretos.

Entonces, ¿dónde deben almacenarse las claves API?

Hay muchas alternativas para almacenar de forma segura claves y secretos API. Algunos de ellos le permiten usar su repositorio Git y cifrar los datos confidenciales. Otras herramientas son más sofisticadas y descifran información confidencial como parte de un flujo de trabajo de implementación. Veamos algunas de las soluciones disponibles.

git-remote-gcrypt

La primera solución le permite cifrar un repositorio completo de Git. git-remote-gcrypt lo hace agregando funcionalidad a los asistentes remotos de Git para que esté disponible una nueva capa de transporte encriptada. Los usuarios solo tienen que configurar un nuevo control remoto cifrado e insertar código en él.

Siga leyendo si está buscando una solución más precisa que le permita cifrar archivos individuales.

git-secret

git-secret es una herramienta que funciona en su máquina local y encripta archivos específicos antes de enviarlos a su repositorio. Detrás de escena, git-secret es un script de shell que utiliza GNU Privacy Guard (GPG) para cifrar y descifrar archivos que pueden tener información confidencial.

cripta git

Otra solución es git-crypt. Es muy similar a git-secret en la forma en que funciona, pero tiene algunas diferencias interesantes.

Lo primero que debe notar sobre git-crypt es que es un ejecutable binario y no un script de shell, como lo es git-secret. Ser un ejecutable binario significa que para usarlo primero debe compilarlo, o necesita encontrar una distribución binaria para su máquina.

Si está utilizando una Mac, tiene suerte porque HomeBrew ofrece un paquete listo para instalar git-crypt. Todo lo que tiene que hacer es ejecutar brew install git-crypt en un terminal.

Caja negra

BlackBox es una herramienta creada por Stack Overflow. Esta es la compañía detrás de las comunidades populares de preguntas y respuestas, como Stack Overflow, Server Fault y Super User. BlackBox es una herramienta robusta ya que funciona con Git y con otros sistemas de control de versiones como Mercurial y Subversion.

También es compatible con el cifrado de cadenas pequeñas y no solo con archivos completos. Lo hace cuando trabaja con Puppet y usa Puppet’s Hiera, una herramienta de búsqueda de valores clave para los datos de configuración.

Tener la capacidad de cifrar y descifrar cadenas individuales hace que BlackBox sea una gran solución para proteger claves y secretos API.

Configuración de Heroku y Vars de configuración

Si está trabajando con Heroku, no debe almacenar ninguna información confidencial, como claves API y secretos, en sus repositorios Git. Heroku ofrece una solución que le permite establecer variables de configuración.

Su aplicación puede acceder al contenido de esas variables de configuración durante el tiempo de ejecución accediendo a las variables de entorno correspondientes. Aunque los valores no están encriptados, esta solución le permite evitar usar su repositorio Git para almacenar claves API.

Dokku, una solución de código abierto como Heroku, ofrece las mismas capacidades.

Docker secretos

Al final del espectro de posibles soluciones están los secretos de Docker. Docker introdujo esta solución en febrero de 2017. Desde entonces ha ganado popularidad.

Docker secrets le permite definir variables cifradas y las pone a disposición de servicios específicos durante el tiempo de ejecución. Los secretos se cifran tanto durante el tránsito como en reposo.

Este enfoque convierte a Docker Secrets en la solución perfecta para almacenar y utilizar claves y secretos API de forma segura y encriptada.

Resumen

A estas alturas ya debe ser consciente de los peligros de almacenar información confidencial, como claves API y secretos en repositorios Git públicos y privados.

Comprender las posibles formas en que sus repositorios pueden estar expuestos es clave para evaluar y mitigar los riesgos asociados con las filtraciones de información.

Este artículo también propone algunas soluciones diferentes que le permiten cifrar claves y secretos API para que pueda usar de forma segura sus repositorios de código.

Estoy seguro de que existen más soluciones que pueden ayudarlo a lograr los mismos resultados.