Dit is het model waartegen we ontwerpen en testen. Het gaat net zoveel over wat Penweir niet dekt als over wat het wel dekt.
Wat wordt beschermd
- Gevoelige waarden in verzoeken (identifiers, credentials, klantdata), zodat ze geen LLM-providers bereiken die het beleid niet toestaat.
- Inhoud van verzoeken en antwoorden in rust, die nergens mag bestaan.
- Provider-credentials en de master key.
- Controle over de configuratie van de gateway: wie mag wijzigen wat er doorgelaten wordt.
- Het auditspoor: wie welk model gebruikte en wanneer.
Tegen wie het beschermt
| Actor | Kan | Het antwoord van Penweir |
|---|---|---|
| LLM-provider | Ziet alles wat een verzoek meestuurt. | Weglakken en blokkeren vóór de aanroep, plus routering beperkt tot toegestane providers. Tests tegen een nepprovider bewijzen dat de waarden nooit weggingen. |
| Applicatie met een geldige key | Stuurt alles. | Haar pipeline geldt en ze kan geen andere kiezen. Onbekende velden worden geweigerd en de verzoekgrootte is begrensd. |
| Iedereen die de gatewaypoort bereikt | Raadt keys en stuurt rommel. | Keys zijn 43 willekeurige tekens, opgeslagen als digests en in constante tijd vergeleken. Niet-geauthenticeerde verzoeken worden niet verwerkt of geaudit. |
| Iedereen die de adminpoort bereikt | Raadt wachtwoorden, CSRF, XSS. | argon2id, accountvergrendeling, een rate limit per adres, optionele TOTP, __Host--cookies met HttpOnly en SameSite=Strict, CSRF-tokens met origin-controle, een strikte CSP en geen assets van derden. Houd de poort intern. |
| Iemand met een kopie van de database of een back-up | Leest die. | Er is geen payload opgeslagen. Secrets zijn versleuteld met een master key die niet in de database staat. Keys en sessietokens zijn als digest opgeslagen. |
| Iemand met de logs | Leest ze. | Logs zijn per constructie vrij van inhoud en getest met canaries. |
| Een beheerder die een config schrijft | Wijst een provider naar een interne dienst (SSRF). | Link-local- en metadata-adressen worden geweigerd tenzij toegestaan. Credentials in URL’s worden geweigerd en redirects worden niet gevolgd. |
| De supply chain | Levert kwaadaardige code. | Elke dependency is gepind met hashes en onderbouwd. Image-bases zijn gepind op digest, CI-actions op commit en npm-pakketten op integriteitshash. Kwetsbaarheidsscans draaien in CI en bij elke release hoort een CycloneDX-SBOM. Het dashboard is statisch, zonder Node in productie. |
Wat buiten scope valt
- Een gecompromitteerde host of container runtime: die kan procesgeheugen lezen.
- Modelgedrag: wat een provider doet met wat hij legitiem ontvangt.
- Detectie van ongestructureerde persoonsgegevens zoals namen (zie wat Penweir garandeert).
- Beschikbaarheidsaanvallen buiten limieten op verzoekgrootte en timeouts. Limieten op aantal verzoeken, tokens en gelijktijdigheid tellen in het geheugen van één proces, dus zet een proxy met limieten ervoor als de poort bereikbaar is voor onbetrouwbare clients.
Opvallende ontwerpkeuzes
- Verzoekscope alleen in het geheugen. De token vault kan niet worden gepickled, gekopieerd of geprint en wordt gewist bij succes, fout en annulering.
- Dichtvallen bij twijfel. Een pipeline die een onbekende detector noemt, of een provider zonder key, maakt de gateway not ready in plaats van te draaien zonder die stap. Een ongeldige licentie of master key stopt het opstarten.
- Aparte poorten. De admin-API en het dashboard kunnen los van de gateway worden afgeschermd.
- Synchroon loggen naar stdout. Als niets stdout leegt, blokkeert de gateway. Container runtimes legen het altijd.
- SSRF-controle achter een proxy. Zonder proxy gaat de verbinding naar het adres dat is gecontroleerd. Via
proxy_urllost de proxy de naam opnieuw op. Gebruik netwerk-egressregels als harde grens.