Alle artikelen

2 min lezen

Crypto-agility in drie pull requests

Wat ik leerde van het omzetten van post-quantum scanbevindingen in wijzigingen die maintainers van overheidscode echt kunnen mergen.

  • Post-quantum
  • Security
  • Open source

Een bevinding is geen fix

Bij PQNavigator zie ik veel scanresultaten. "Hier wordt RSA gebruikt", "daar ECDSA". Het klopt allemaal, en bijna niets ervan is op zichzelf bruikbaar. Een maintainer die een lijst met vijftig quantum-kwetsbare plekken krijgt, sluit het tabblad.

Dus koos ik drie bevindingen in open-source projecten van de Nederlandse overheid en probeerde ik van elk een pull request te maken die vandaag veilig te mergen is. Elk leerde me een ander patroon.

1. Stop met het algoritme hardcoden

In een proxy van het ministerie van VWS was het JWT-algoritme een klasseconstante. Dat is het tegenovergestelde van crypto-agility: aanpassen betekent een codewijziging, een review en een release.

python minvws/nl-mgo-dvp-proxy#8
class ClientAssertionJwtIssuer:-    JWT_ALG: str = "RS256"+    KEY_STORE_FALLBACK_PRIVATE_KEY_ID: str = (+        "client_assertion_jwt_fallback_private_key"+    )

De fix leest het algoritme uit de config, kiest standaard ML-DSA-65 en valt terug op RS256 als er geen post-quantum sleutel is. In productie verandert niets tot iemand de nieuwe sleutel toevoegt.

python
try:    self.__private_key = self.__jwk_repository.get_first_key_from_store(        self.KEY_STORE_PRIVATE_KEY_ID    )except KeyError:    self.__using_fallback_alg = True    self.__private_key = self.__jwk_repository.get_first_key_from_store(        self.KEY_STORE_FALLBACK_PRIVATE_KEY_ID    )

2. Kun je niet overstappen, verklein dan het venster

De Kubernetes-operator van Fundament maakt een RSA-4096-CA die tien jaar geldig is. Eerlijk antwoord: overstappen op ML-DSA kan nog niet, want cert-manager ondersteunt alleen RSA, ECDSA en Ed25519.

Het risico kun je wel verkleinen. De ongelijkheid van Mosca zegt dat je een probleem hebt als de tijd dat data veilig moet blijven (X) plus de migratietijd (Y) langer is dan de tijd tot er een quantumcomputer is (Z). Een CA van tien jaar maakt X enorm. Drie jaar, met vernieuwing 90 dagen voor het verlopen, maakt X klein en dwingt een nieuw beslismoment af voordat iemand zich opnieuw aan RSA vastlegt.

go fundament-oss/fundament#424
"privateKey":  map[string]any{"algorithm": "RSA", "size": int64(4096)},"duration":    "26280h", // 3 years"renewBefore": "2160h",  // 90 days

3. Bescherm wat aanvallers vandaag opnemen

De gemeente Amsterdam draait een proxy naar de Basisregistratie Personen. Burgerservicenummers blijven een leven lang gevoelig en zijn daarmee het schoolvoorbeeld van "harvest now, decrypt later".

De wijziging voegt hybride post-quantum TLS (X25519MLKEM768) toe op de uitgaande verbinding, achter een vlag, en controleert of de gekoppelde OpenSSL nieuw genoeg is. Zo niet, dan logt hij een waarschuwing en gebruikt hij klassieke TLS in plaats van te falen.

python Amsterdam/brp-amsterdam-api#195
if ssl.OPENSSL_VERSION_INFO[:2] < _MIN_OPENSSL_FOR_PQC:    logger.warning(        "PQC TLS requested (BRP_ENABLE_PQC_TLS) but linked OpenSSL %s is older "        "than 3.5 and does not support the ML-KEM hybrid TLS 1.3 group - "        "falling back to classical TLS.",

Wat ze gemeen hebben

  • Elke wijziging is optioneel of heeft een terugval. Mergen verandert niets tot het team besluit.
  • Elke wijziging legt zichzelf uit in de code, met een verwijzing naar de onderbouwing, zodat de volgende developer hem niet terugdraait.
  • Elke wijziging is echt getest. De TLS-wijziging heeft een loopback-handshaketest, niet alleen een configcheck.

De post-quantum migratie gaat jaren duren. Niet in één big-bang project, maar in honderden kleine wijzigingen zoals deze. Hoe eerder die saai worden, hoe beter.

joey.oosenbrug@gmail.com