Loginoplysningsproxy — teknisk

Sådan fungerer proxyen.

Hvad den beskytter imod. Hvad den ikke beskytter imod.

Denne side er til sikkerhedsanmeldere, penetrationstestere og ingeniører, der evaluerer proxyens trusselsmodel. Den beskriver, hvad proxyen gør på protokolniveau, hvor loginoplysninger findes i hukommelsen, og hvilke angrebsflader der forbliver.

Arkitektur

Proxyen er en CONNECT-baseret HTTPS MITM-proxy. En AI-agent sætter HTTPS_PROXY til at pege på den. Når agenten foretager en HTTPS-anmodning, aflytter proxyen TLS-forbindelsen, inspicerer anmodningsheadere for referencer til loginoplysninger, løser dem mod Clavitor-boksen og videresender anmodningen med indsatte loginoplysninger til den opstrøms API.

Proxyen lytter som standard på 127.0.0.1:1983 — sidecar-mønsteret, hvor proxyen og agenten deler en vært. For delte implementeringer (én proxy, der betjener flere agenter på et privat netværk, container sidecar til flere arbejdsbelastninger, dedikeret proxy-vært), kan lytteinterfacet konfigureres via CLAVITOR_PROXY_LISTEN.

illustration: unknown name=proxy-sequence

Proxyen er en selvstændig Go-binærfil. Ingen CGO. Alle Clavitor protokol kryptografi ruter gennem en kanonisk Rust-implementering kompileret til WebAssembly og indlæst via wazero ved opstart.

TLS-håndtering

Proxyen genererer en selvsigneret ECDSA P-256 rod-CA ved første kørsel, gemt i binærfilens mappe med tilstand 0600. For hver opstrøms vært udstedes et bladcertifikat on-demand, signeret af denne CA og cachet i hukommelsen med begrænset udskiftning (1.000 værter). Bladcertifikater er gyldige i 24 timer og regenereres transparent ved 23-timers mærket for at forhindre udløb midt i en session.

Agenten skal stole på proxyens CA-certifikat. Eksporter det med clavitor-proxy ca.

Opstrømsforbindelser bruger minimum TLS 1.3 med ALPN-forhandling for HTTP/2 og HTTP/1.1. Systemets certifikatpulje bruges til opstrømsverifikation. Ingen certifikatfastgørelse — proxyen stoler på, hvad operativsystemet stoler på.

Credential lifecycle

Loginoplysninger caches aldrig, skrives aldrig til disk og opbevares aldrig længere end én HTTP-anmodning.

FaseHvor loginoplysningen findesVarighed
I hvile i boksAES-GCM chiffertekst i boksdatabasenIndtil slettet
Under transport til proxyTLS-krypteret JSON-respons fra boks-APIÉn HTTP-rundtur
Dekrypteret i proxyProceshukommelse (Go-streng på heap)Én HTTP-anmodning
Indsat i opstrømsanmodningTLS-krypterede bytes på nettet til opstrømsÉn HTTP-anmodning

Proxyen holder agentens loginoplysningsdekrypteringsnøgle (16 bytes) i hukommelsen i hele dens køretid. Den indlæses fra den krypterede sidecar-konfiguration (CLV1-format) ved opstart og slettes ved kontrolleret nedlukning. Nøglen forlader aldrig processen.

Sidecar-konfigurationen er krypteret med AES-128-GCM og HMAC-SHA256 ved hjælp af deterministiske nøgler afledt af et statisk seed. Dette er obfuskering, ikke fortrolighed — sikkerhedsgrænsen er filtilladelser (0600) og besiddelse af filen. CLV1-formatet deles mellem proxyen, CLI'en og browserudvidelsen.

Opløsningstilstande

Tilstand 1 — eksplicit pladsholder

Agenten inkluderer en clavitor://Entry/field reference i en anmodningsheader. Proxyen søger i boksen efter posten efter navn, henter den, dekrypterer det navngivne felt og erstatter pladsholderen med den faktiske værdi.

Hvis søgningen returnerer nul eller mere end ét resultat, returnerer proxyen 502 med en stabil fejlkode. Pladsholderen fjernes aldrig og videresendes som den er.

Tilstand 2 — URL-match

Når ingen pladsholder er til stede, beder proxyen boksen om poster, hvis URL-felt matcher den opstrøms vært. Hvis præcis ét match eksisterer med en genkendt feltform, indsætter proxyen automatisk loginoplysninger.

Nul matches → passthrough (ingen forventning om loginoplysninger). Flere matches → 502 med vejledning til tvetydighed. Ukendt feltform → 502.

Beslutningstræet er deterministisk: pladsholder til stede → løs eller fejle. Ingen pladsholder → URL-match eller passthrough. Der er ingen stille fallback-sti, hvor en mislykket opløsning resulterer i, at en anmodning sendes opstrøms uden loginoplysninger.

Agent identity

Som standard ser boksen proxyens egen agent-ID på hver anmodning. Ratebegrænsninger, omfangskontroller og auditposter tilskrives proxyen.

Når flere agenter deler én proxy-instans, kan pladsholderen inkludere et agent-ID: clavitor://agentid@Entry/field. Proxyen sender dette agent-ID til boksen, som anvender den agents omfang og ratebegrænsninger og logger adgangen mod den. Agent-ID'et er den 32-tegns hex-værdi, der vises på agentdetaljesiden i boksens UI.

# Without agent ID — attributed to the proxy
Authorization: Bearer clavitor://OpenAI/key

# With agent ID — attributed to agent 0102030405060708090a0b0c0d0e0f10
Authorization: Bearer clavitor://0102030405060708090a0b0c0d0e0f10@OpenAI/key
ImplementeringIdentitetsmodelIsolation
Én proxy pr. agentProxy-ID = agent-ID (standard)Fuld — separat binærfil, konfiguration, omfang, ratebegrænsninger
Delt proxy, intet agent-ID i URLAlle agenter deler proxyens IDDelt omfang og ratebegrænsninger
Delt proxy + agentid@ i URLPer-agent identitetPer-agent omfang, ratebegrænsninger og audit

Agent-ID'et i URL'en er ikke en autentificeringsmekanisme — proxyens CVT-token autentificerer forbindelsen. Agent-ID'et bestemmer tilskrivning: hvis omfang gælder, hvis ratebegrænsninger tæller, hvis auditspor registrerer adgangen. Boksen afviser ukendte agent-ID'er med en højlydt fejl.

Netværkssikkerhed

SSRF-beskyttelse

Som standard blokerer proxyen opstrømsforbindelser til private netværk (RFC 1918), cloud-instansmetadata (169.254.169.254), loopback, link-local og carrier-grade NAT-områder. DNS opløses først; alle returnerede IP'er valideres, før TCP-forbindelsen oprettes, hvilket lukker DNS-genbindingsvinduet TOCTOU.

Overskriv med CLAVITOR_PROXY_ALLOW_PRIVATE=true for agenter, der legitimt når private API'er.

Målfastgørelse

CONNECT-målhosten fanges ved tunneloprettelse og bruges til hele tunnelens levetid. Efterfølgende anmodninger inden for tunnelen kan ikke omdirigeres til en anden vært ved at manipulere Host-headeren. Et mismatch resulterer i 502.

Dette forhindrer en agent i at etablere en tunnel til api.openai.com og derefter sende anmodninger til internal-service.corp.

Header-håndtering

Hop-til-hop-headere fjernes fra både anmodninger og svar pr. RFC 7230 §6.1: Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, Proxy-Connection, TE, Trailers, Transfer-Encoding, Upgrade.

Set-Cookie fjernes fra opstrømssvar for at forhindre opstrøms i at plante cookies i agentens HTTP-klient.

Anmodnings- og svarlegemer strømmer igennem uden buffering. Anmodningslegemer er begrænset til 64 MB som standard (CLAVITOR_PROXY_MAX_BODY_MB). Svarslegemer strømmer uden en hård grænse; en logadvarsel udsendes, når Content-Length overstiger 100 MB.

Field-to-header mapping

I URL-match-tilstand mapper proxyen boksfeltetiketter til HTTP-headere:

FeltetiketIndsat header
key, apikey, api_key, token, secret, bearer, access_tokenAuthorization: Bearer <value>
x-api-key, api-keyX-API-Key: <value>
username + password (parret)Authorization: Basic base64(user:pass)
Alt andetAfvist — ERR-PROXY-052

I pladsholdertilstand styrer agenten, hvilket felt der løses, og hvor det går hen. Kortlægningen ovenfor gælder kun for URL-match-tilstand.

Error codes

Hver fejl producerer en stabil ERR-PROXY-NNN kode. Disse koder er en del af proxyens offentlige grænseflade — agenter og operatører kan matche dem til alarmering og fejlfinding.

RækkeviddeKategori
001–019Opsætning (konfiguration, init, CA-generering, WASM)
020–029Daemon livscyklus
030–049Pladsholderopløsning (clavitor:// URI'er)
050–069URL-match indsættelse
070–089Opstrøms / TLS

Identitetsfelter er uopnåelige

Boksoptegnelser understøtter tre krypteringstrin. Bokskrypterede felter er klartekst-metadata. Loginoplysnings-krypterede felter dekrypteres med agentens nøgle. Identitetskrypterede felter er krypteret med en nøgle, som serveren og proxyen aldrig har set. Kun boksejeren kan dekryptere dem via deres hardwarenøgle.

Hvis en pladsholder refererer til et identitets-krypteret felt, returnerer proxyen ERR-PROXY-035. Ingen fallback, intet delvist resultat. Feltet er arkitektonisk uopnåeligt fra proxyen.

Hvad proxyen ikke beskytter imod

Proxyens trusselsmodel er en kompromitteret skill eller prompt injection, der får en autentificeret agent til at høste loginoplysninger. Boksens per-agent ratebegrænsninger, unikke postkvoter og to-strikes-lås er de primære forsvar. Proxyen tilføjer et netværkslagshåndhævelsespunkt, hvor loginoplysninger løses pr. anmodning og aldrig opbevares af agenten.

En kompromitteret vært

Proxyen kører på samme maskine som agenten. En angriber med root-adgang kan læse proceshukommelse, vedhæfte en debugger eller aflytte loopback-trafik. Proxyen er et loginoplysningsindsættelseslag, ikke en hardware-sikkerhedsgrænse.

Loginoplysningsekstraktion via API-svaret

Hvis den opstrøms API gentager loginoplysningen i sit svar (f.eks. en "whoami"-endpoint), ser agenten den. Proxyen indsætter loginoplysninger i anmodninger, ikke svar. Den filtrerer ikke, hvad der kommer tilbage.

Logning

Proxyen logger én linje pr. accepteret CONNECT og udsender fejlmeddelelser for fejl. Den logger aldrig:

  • Dekrypterede loginoplysningsværdier
  • Fuldstændige anmodnings-URL'er (forespørgselsstrenge kan indeholde hemmeligheder — kun skema + vært + sti logges)
  • Anmodnings- eller svarslegemer
  • Loginoplysningsdekrypteringsnøglen eller sidecar-konfigurationens indhold

Når proxyen registrerer, at et 400-svar fra opstrøms indeholder autorisationsrelaterede nøgleord (unauthorized, invalid token osv.), logger den et diagnostisk hint, der antyder, at den indsatte loginoplysning kan være forældet. Svaret videresendes uændret.

Kryptografi

Al Clavitor protokol kryptografi — AES-GCM feltdekryptering, HKDF nøgleafledning, base62-kodning, CVT token-udstedelse, CLV1 konfigurationspakke/udpakkning — udføres inde i et enkelt WebAssembly-modul (clavis_crypto.wasm) indlæst via wazero, en ren Go WASM-runtime. Ingen CGO. Ingen Go-genimplementering af Clavitor-primitiver.

WASM-modulet er kompileret fra den samme Rust crate (clavis-crypto), som bruges af browseren, CLI'en og browserudvidelserne. Én sandhedskilde, én binærfil, én auditflade.

Proxyen bruger Go's crypto/tls til TLS-forbindelsen og crypto/ecdsa til MITM-certifikatgenerering. Dette er transportbekymringer, ikke Clavitor protokoloperationer.

Configuration

Hemmeligheder (loginoplysningsdekrypteringsnøgle, agent-ID, enheds-ID, boks-URL) lever i den krypterede CLV1 sidecar-konfiguration, skrevet én gang under clavitor-proxy init. Operationelle knapper lever i miljøvariabler:

VariabelStandardFormål
CLAVITOR_PROXY_LISTEN127.0.0.1Lytteinterface. Indstillet til 0.0.0.0 for delte implementeringer eller til en specifik interface-IP.
CLAVITOR_PROXY_PORT1983Lytteport
CLAVITOR_PROXY_ALLOW_PRIVATEfalseTillad forbindelser til RFC-1918 / private netværk
CLAVITOR_PROXY_MAX_BODY_MB64Anmodningskropsstørrelsesgrænse
CLAVITOR_PROXY_WRITE_TIMEOUT300Svarskrivningstidout i sekunder
CLAVITOR_CONFIG(exe-mappe)Overskriv sti til sidecar-konfiguration

Operationelle knapper er ikke hemmeligheder. De hører ikke hjemme i den krypterede konfiguration. De hører hjemme, hvor implementeringsværktøjer allerede administrerer dem — miljøet.

Gennemgå dette selv.

Kryptografien er en enkelt auditerbar WASM-artefakt. Trusselsmodellen er dokumenteret. Hvis du finder noget, vi har overset, vil vi gerne høre om det.