SkillGridAprende informática practicando

Secretos: claves, almacenamiento y rotacion

Por que una clave en git es una clave que ya no controlas, de que protegen de verdad las variables de entorno, como funciona la rotacion antes y despues de una fuga y el balance honesto de donde empiezan las brechas.

15 min · 50 XP

La leccion anterior termino en una contrasena. Las contrasenas son los secretos que escribe una persona; esta leccion trata de los secretos que usa un programa cuando nadie mira: claves de API, contrasenas de base de datos, claves de firma, tokens para otros servicios. Fallan de forma distinta a las contrasenas humanas. Nadie reutiliza la contrasena de una base por pereza, nadie la olvida y nadie elige una debil porque sea mas facil de teclear. Fallan porque se copian a sitios que nunca debieron guardarlas y porque viven para siempre.

Un secreto confirmado en un repositorio no es un archivo que puedas borrar. Git guarda instantaneas, y cada instantanea que contuvo la clave la sigue conteniendo. Quitar la linea en un commit nuevo la quita del estado actual y no cambia nada de la historia. Incluso un force-push que reescribe la rama deja los objetos antiguos accesibles por el reflog, por cualquier fork, por cualquier clon ya hecho y durante un tiempo por el almacenamiento del propio proveedor. Eso no es un defecto de Git; es exactamente para lo que sirve una historia direccionada por contenido. La conclusion practica es la que mas tiempo cuesta aceptar a los equipos: para cuando lo notas, hay que tratar la credencial como publica. Encontrar una clave filtrada en la historia y confirmar que sigue siendo alcanzable. La busqueda es la parte facil.

$ git log --all -S 'AKIA' --oneline
9f2c1ab  remove keys from config
4d7e0f3  add deployment config

$ git show 4d7e0f3:config/prod.env | grep -c AKIA
1

$ git rev-list --all --count
8421

# the commit is still reachable: history is append-onlyEncontrar una clave filtrada en la historia y confirmar que sigue siendo alcanzable. La busqueda es la parte facil.

Las variables de entorno son el consejo habitual, y son una mejora, pero se venden de mas. Lo que aportan de verdad: el secreto no esta en el repositorio, no esta en la imagen del contenedor y difiere entre preproduccion y produccion sin tocar el codigo. Lo que no aportan: ninguna clase de aislamiento. En Linux el entorno de un proceso en ejecucion se lee desde /proc, asi que cualquier proceso que corra con el mismo usuario puede leer la clave. Acaba en los volcados de fallo y en los procesos hijos que lanzas, y asi es como una clave del servicio de pagos aparece en un log de una tarea que no tiene nada que ver. Y en muchas plataformas es visible en la pantalla de configuracion del panel, es decir, visible para cualquiera con permiso de despliegue. Las variables de entorno mueven un secreto de un sitio malo a uno mejor. No son una caja fuerte. Una variable de entorno la puede leer todo lo que ya pueda ejecutarse como ese usuario. No es nada, pero no es secreto. La derivacion de claves es el puente del secreto humano a la clave criptografica. Una contrasena no se usa directamente como clave AES, porque las contrasenas son cortas y de baja entropia y las claves deben ser uniformemente aleatorias. Una funcion de derivacion toma la contrasena, un salt y un parametro de coste deliberadamente caro, y produce una clave de la longitud correcta. La misma idea aparece en tres sitios a la vez, y merece la pena ver que es la misma idea: derivar una clave de una frase de paso, derivar un hash de contrasena resistente a pruebas y derivar una clave por registro a partir de una clave maestra para que una clave de registro filtrada no exponga el resto. El parametro de coste es lo que hace que cada una resista a un atacante que ya tiene el material almacenado. El cifrado de disco tiene un modo de fallo concreto que conviene nombrar. Si la clave que abre el disco esta en la misma maquina, o se obtiene automaticamente al arrancar desde un archivo de configuracion, entonces tiene los datos cualquiera que pueda arrancar esa maquina o leer ese archivo. Por eso el cifrado de disco completo protege un portatil robado y no aporta casi nada en un servidor en marcha al que un atacante ya llego.

in transit     TLS between client and service      a key you never see
at rest        disk encryption, KMS envelope      server holds the key
tokenized      provider keeps the card number    your database holds a token

PCI DSS 4.0 requires cardholder data encrypted in transit and at rest

None of the three protects against a valid account using the API.Tres capas que se quieren decir cuando se afirma que los datos estan cifrados. Protegen de cosas distintas y ninguna protege de una peticion valida.
AppVaultDatabaseauthenticate as service, ask for db passwordpolicy allows this service, lease 1hshort-lived credentialconnect with that credentialnothing long-lived sits in a file or envlease expires, reconnect with a fresh one

Práctica

  1. Descubres que una clave de API de produccion se confirmo hace tres meses y se elimino en el commit siguiente. La clave sigue activa. Cual es la primera reaccion correcta?

    Pistas
    • Preguntar si el archivo sigue en el directorio de trabajo es la pregunta equivocada: un commit guarda su propia copia de cada archivo que toco alguna vez.
    • Antes de reescribir nada, decide si la credencial sigue siendo valida. Si lo es, la limpieza no es la parte urgente.
  2. Ordena la respuesta a una credencial filtrada, de la primera accion a la ultima.

    1. 1emitir un reemplazo y desplegarlo en todos los consumidores de la clave antigua
    2. 2reescribir la historia o aceptar conscientemente que se queda, y anadir escaneo al canal para que la siguiente se detecte antes de la fusion
    3. 3buscar en los registros todos los usos de la credencial antigua, hasta el momento del commit
    4. 4dejar por escrito que paso y que lo habria detectado antes, mientras los detalles estan frescos
    5. 5revocar la credencial en el proveedor, para que deje de funcionar de inmediato
    Pistas
    • Mientras la credencial filtrada siga siendo valida, todo lo demas es decoracion. Revocar va primero, no ultimo.
    • Limpiar el repositorio solo sirve cuando la credencial ya no se puede usar, porque reescribir la historia es lento y disruptive.
  3. Relaciona cada sitio donde puede vivir un secreto con aquello de lo que realmente protege.

    Pistas
    • Para cada opcion de almacenamiento pregunta quien puede leerla: el propio proceso, cualquiera que pueda leer el sistema de archivos, o solo algo que se haya autenticado.
    • Las variables de entorno mantienen los secretos fuera del repositorio, y eso es valor real. No ocultan un secreto de nada que corra en la misma maquina.

Preguntas sobre esta lección

¿Es gratis?

Sí. El primer nivel de cada materia es gratis y no necesita cuenta. Los niveles más profundos y los grados superiores son de pago: eso es lo que mantiene vivo el proyecto.

¿Para qué edad es?

Está escrito para adolescentes curiosos a partir de unos 12 años y para adultos que empiezan de cero. No se supone experiencia previa en programación; las lecciones de redes y física no necesitan matemáticas más allá del colegio.

¿Necesito saber programar ya?

No. Las rutas de lógica, física y redes empiezan desde cero. El código lo escribes en la sección de lenguajes, que también arranca desde el principio.

¿Hay que instalar algo?

No. Todo funciona en el navegador: teoría, práctica y las simulaciones interactivas. No hay nada que descargar ni que configurar.

¿Cuánto se tarda en una materia?

Una lección dura entre 10 y 15 minutos. Un grado junior son unas 12 a 20 lecciones, así que son unas semanas de práctica constante, no una tarde.

¿Hay que seguir el orden?

Dentro de un grado los niveles se abren uno tras otro, porque cada uno se apoya en el anterior. Entre materias eres libre: empieza por lógica, física o redes.