Commits

Auditoria de seguretat, botó d'actualització de clients i el 502 que va explicar

Una auditoria amb ganxo bloquejador destapa fallades silencioses; neix el

Hi ha dies en què programes coses noves. I n'hi ha en què dediques a mirar de prop el que ja havies programat, amb una llanterna. L'1 d'octubre em va tocar el segon: una auditoria de seguretat completa del projecte, un botó nou que actualitza webs de clients soles, i un error 502 que em va ensenyar com funciona per dins la porta d'entrada d'un servidor.

La inspecció: trobar els forats abans que els altres

Una auditoria de seguretat és com la inspecció tècnica d'un edifici: vas sistema per sistema buscant esquerdes abans que algú les aprofiti. En aquest cas, la revisió la va fer un agent d'IA amb un ganxo especial (Mimosa) que directament bloqueja qualsevol commit —qualsevol entrega de codi al repositori— si detecta problemes seriosos sense resoldre.

I va trobar coses. La més llamativa: l'analítica de la web —el sistema que compta visites— feia temps que estava trencada, fallant a cada visita, i ningú s'hi havia fixat. Una falla d'aquestes és silenciosa perquè el que falla és el comptador, no la web. També hi havia les claus de la IA massa a la vista des del panell: l'equivalent a deixar el codi de l'alarma enganxat a la porta.

Arreglar-ho bé, no només apagar l'avís

El que importa d'una auditoria no és la llista de problemes, és tancar-los amb garanties. Així que cada reparació va portar la seva:

  • Validar el que ens arriba de fora: quan la IA baixa una imatge o analitza la web de la competència, ara es comprova que l'adreça és pública i legítima a cada salt. Sense això, una adreça maliciosa pot fer que el servidor parli amb els seus propis serveis interns (un atac anomenat SSRF, que és bàsicament colar algú de dins cap a la zona privada).
  • Feeds a prova de bombes: els feeds RSS externs es processen ara amb una llibreria que desactiva les trampes típiques del format XML (el que es coneix com atacs XXE).
  • Tests automàtics a cada canvi: la integració contínua —la CI, el robot que revisa el codi cada vegada que el toques— ara també prova l'API, no només construeix imatges.
  • Claus emmascarades: el panell ja no mostra les claus reals; les amaga darrere d'una màscara, com una contrasenya amb asteriscs.

Tot verificat amb 18 tests nous. I al final, la prova de foc: una release nova aplicada des del botó del panell a la web de client real, i l'analítica responent amb un 204 —el codi HTTP que diu "rebut i correcte"— en producció.

El botó que actualitza webs de clients

Aquí venia una asimetria molesta: el nucli del producte s'actualitza amb un botó des del panell, però la web pública de cada client s'actualitzava a mà, per SSH. La feina del dia la va tancar: ja existeix el botó "Actualitza web pública".

Per dins fa una cadena elegant: pregunta a GitHub quina és la imatge exacta de l'última versió (un digest, la seva empremta digital), la baixa, l'aixeca i, si alguna cosa falla, ho desfa. Sense entrar a cap servidor a mà. Dotze tests nous protegeixen tot el flux.

El 502: el conserge amb la llista antiga

I l'ensurt del dia. Després d'aplicar una actualització, el panell tornava un 502 —el codi de "porta trencada"—. Els contenidors estaven vius i responien per dins, però de fora no s'hi arribava.

La causa és de manual: la porta d'entrada del servidor (el gateway, un Nginx) manté una llista de "a quina adreça interna va cada servei". I resulta que aquesta llista només la consulta en arrencar. L'actualització havia recreat els contenidors amb adreces noves, però el conserge seguia apuntant a les velles. Com trucar a un telèfon que va canviar de número.

L'arranjament té dues capes: configurar el Nginx perquè torni a preguntar les adreces cada 10 segons (fent servir el DNS intern de Docker), i que l'actualitzador reiniciï el gateway després de cada actualització del nucli, per cobrir les instal·lacions que encara tenen la configuració vella.

El que s'emporta un

El dia va resumir el cicle complet que m'agrada en aquest projecte: auditar, arreglar amb tests, publicar firmat i verificar en producció amb un client real. A l'entrada anterior del diari es presentava la documentació pública del producte; aquest és el dia en què l'escarbem per dins. I l'entrada següent porta el primer rollback real i una migració amb misteri inclòs.

Altres entrades del diari