Una clave que se quedó en el repositorio
Un becario sube a un repositorio público el código de la web de una empresa. En un archivo de configuración queda la clave de la nube de la empresa.
Borra el archivo al día siguiente. Pero el historial lo conserva, y los robots que rastrean repositorios ya la habían copiado.
La regla única
Advertencia
Este laboratorio es una aplicación insegura a propósito. Ataca solo tu copia privada, que no tiene salida a internet. Atacar un sistema que no es tuyo, o que no tienes permiso para probar, es delito en casi todos los países.
Al final de esta lección
Nota
Puedo encontrar un secreto en un sitio equivocado y decir dónde debe guardarse.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Secreto | dato que solo debe conocer quien lo necesita | una clave de acceso |
| Variable de entorno | valor que el sistema da a un programa al arrancarlo | |
| Gestor de secretos | servicio que guarda claves y las entrega a quien tiene permiso | |
| Rotar | cambiar un secreto por otro nuevo | |
| Historial | registro de todos los cambios de un repositorio | |
| Ofuscar | revolver un texto para que cueste leerlo, sin cifrarlo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un secreto tiene su sitio
Un secreto puede acabar en muchos sitios. Por ejemplo: el código, un archivo de configuración, una imagen de contenedor, un script del navegador o un registro.
En todos ellos lo ve más gente de la prevista. El sitio correcto es un gestor de secretos, o una variable de entorno que el sistema entrega al programa al arrancarlo.
Ejemplo resuelto: dónde va cada secreto
| Dónde estaba | Por qué es un problema | Dónde debe ir |
|---|---|---|
| En el código fuente | Lo ve todo el que lee el repositorio | En una variable de entorno |
| En una imagen de contenedor | Va dentro de cada copia de la imagen | En el gestor de secretos |
| En un script del navegador | Lo recibe cualquier visitante | Solo en el servidor |
| En un registro de errores | Lo leen quienes revisan los registros | Fuera de los registros |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira la aplicación de tu laboratorio
Tu laboratorio ejecuta WrongSecrets. Arráncalo y ejecuta estos tres comandos. Solo miran. El primero pregunta si la aplicación está sana. El segundo pregunta qué páginas de gestión ofrece a cualquiera. El tercero muestra los primeros caracteres de un script que envía a todos los visitantes.
¿Está sana la aplicación?
curl -s -w "\n" http://wrongsecrets:8080/actuator/healthSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Qué páginas de gestión ofrece?
curl -s http://wrongsecrets:8080/actuator | grep -o 'actuator/[a-z]*' | sort -uSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El principio del script de los visitantes
curl -s http://wrongsecrets:8080/js/index.js | head -n 1 | cut -c 1-120Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué te dicen las tres respuestas
El primero imprime una línea corta que termina en "status":"UP". El segundo imprime tres nombres: auditevents, health e info. Pregúntate cuál de ellos no debería leer un desconocido.
El tercero imprime un código de aspecto revuelto. Está revuelto, no cerrado con llave. El navegador debe leerlo entero para ejecutarlo, y tú también.
Un error frecuente
Advertencia
Mucha gente cree que borrar un secreto de un archivo lo elimina. No es así. El historial conserva cada versión, y quien clonó el repositorio ya tiene una copia. Si un secreto se expuso, rótalo: crea uno nuevo y anula el viejo.
Los secretos tienen formas reconocibles
Muchos secretos se parecen entre sí. Una clave de nube empieza con un prefijo fijo y tiene una longitud conocida. Una contraseña suele ir tras un nombre como password o clave. Una clave privada empieza con una línea de cabecera.
Por eso se pueden buscar con un programa antes de subir el código.
Buscar una forma en un texto
# Líneas inventadas. Ninguna clave es real.
lines = ["host = db.local", "password = \"abc123\"", "debug = true"]
# Cambia la palabra que se busca y pulsa Run.
number = 0
for line in lines:
number = number + 1
if "password" in line:
print("línea", number, "parece una contraseña")
Ejemplo resuelto: tres formas
| Forma | Ejemplo inventado | Qué es |
|---|---|---|
| Prefijo fijo y 16 caracteres | AKIA y 16 mayúsculas o dígitos | Clave de acceso a la nube |
| Nombre, signo = y valor | clave = "valor-largo" | Contraseña escrita en un archivo |
| Línea de cabecera | -----BEGIN PRIVATE KEY----- | Clave privada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más allá: un buscador menos ingenuo
El buscador de show-scan solo mira la palabra password y avisaría también de password = os.environ["DB_PASS"], que no es un secreto.
Amplíalo para que busque también clave y secret, y para que no avise cuando el valor tras el = empieza por $ o lleva os.environ. Añade tres líneas de prueba, una de cada caso, y comprueba el resultado.