La clave que se subió por error
Un secreto en el código es una clave o una contraseña escrita dentro de un programa o de un archivo de configuración. Pasa más de lo que parece: alguien la escribe para probar y se olvida de quitarla.
Hoy aprenderás a encontrar esas claves antes que un atacante, y a guardarlas en un sitio donde no se filtren.
Al terminar esta lección
Nota
Puedo encontrar una clave olvidada en un texto de código.
La regla de este laboratorio
Importante
Busca solo en tu copia del laboratorio y solo con permiso. Si encuentras una clave real en el código de otra persona, no la uses: avísala. Las claves de esta práctica son falsas a propósito.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Secreto | un dato que solo debe conocer quien tiene permiso |
| Clave de API | una contraseña que usa un programa para hablar con un servicio |
| Variable de entorno | un valor que el sistema da al programa desde fuera del código |
| Repositorio | la carpeta donde se guarda un proyecto con todas sus versiones |
| Historial | la lista de todos los cambios que tuvo un proyecto |
| Rotar una clave | cambiar una clave por otra nueva y anular la vieja |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dónde acaban los secretos por error
Un secreto se escapa por lugares muy normales. Se escribe en el código para probar. Se deja en un archivo de configuración que se sube al repositorio. Se pega en un mensaje de ayuda.
Una vez publicado, cualquiera que vea el repositorio puede copiarlo. Hay programas que buscan claves así todo el día.
Cinco lugares donde se escapa una clave
| Lugar | Ejemplo | Por qué es peligroso |
|---|---|---|
| El código | password = "abc123" | Lo lee quien vea el proyecto |
| Un archivo de configuración | config.txt con la clave de la base de datos | Se sube sin darse cuenta |
| El código de una página | Una clave en un script de la web | Cualquier visitante puede verlo |
| El historial del repositorio | Una clave borrada hace meses | Sigue guardada en las versiones viejas |
| Un mensaje o captura | Una foto del código con la clave | Circula fuera de tu control |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Antes de empezar
Nota
Pulsa Iniciar el laboratorio y espera a que diga que está en marcha. Abre el terminal que hay junto al laboratorio. Los Runs de esta lección escriben solo un archivo de ejemplo en la carpeta temporal.
Escribe un archivo de ejemplo con claves falsas
printf 'nombre = "tienda"\npassword = "abc123"\napi_key = "k-12345"\n' > /tmp/ejemplo.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Busca las líneas con password o api_key
grep -n -i -E "password|api_key" /tmp/ejemplo.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cómo buscar claves con grep
grep busca texto dentro de un archivo. La opción -n escribe el número de cada línea, -i ignora las mayúsculas y -E deja separar palabras con una barra.
El segundo Run escribe dos líneas: 2:password = "abc123" y 3:api_key = "k-12345". La línea 1 no sale porque no tiene ninguna de las dos palabras.
Un secreto tiene formas que se reconocen
Muchas claves se delatan por la palabra que las acompaña: password, secret, token o api_key, seguida de un signo igual y un valor.
Otras tienen una cabecera propia, como una clave privada que empieza por -----BEGIN PRIVATE KEY-----. Un buscador mira estas formas línea a línea.
Ejemplo: qué línea es un secreto
| Línea | ¿Secreto? | Por qué |
|---|---|---|
| precio = 5 | No | No tiene ninguna palabra de clave |
| token = "x9f3kd8" | Sí | Palabra de clave y un valor escrito |
| password = os.environ["PASSWORD"] | No | La clave se lee de fuera del código |
| api_key = "" | No | El valor está vacío |
| -----BEGIN PRIVATE KEY----- | Sí | Es el principio de una clave privada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dónde guardar una clave de forma segura
El programa debe leer la clave desde fuera: de una variable de entorno o de un gestor de secretos. En el repositorio solo queda el nombre de la variable, nunca su valor.
Si una clave se filtró, no basta con borrarla. Hay que rotarla: crear una nueva, usar la nueva y anular la vieja.
Dale un valor al programa desde fuera
MI_CLAVE=abc123 sh -c 'echo "valor: $MI_CLAVE"'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué enseña el Run de la variable
El Run escribe valor: abc123. La clave llegó al programa desde fuera de su código. Si miras el texto del programa, la clave no está escrita.
Al terminar la orden, la variable desaparece de ese terminal. Así no queda guardada en ningún archivo.
Un error frecuente
Advertencia
Mucha gente cree que borrar la clave del archivo la hace desaparecer. En un repositorio, las versiones viejas siguen guardadas en el historial. Si una clave se filtró, rótala siempre, aunque la hayas borrado.
Para ir más lejos: el laboratorio WrongSecrets
Después de esta lección, el laboratorio abre una aplicación que esconde claves falsas en su código, en sus páginas y en su configuración. Cada reto se marca en verde al dar la clave correcta.
Antes de entrar, apunta tres sitios donde buscarías según la tabla de lugares. Al acabar, anota dónde estaba cada clave y dónde debía haberse guardado.