Authenticatie is de poortwachter die bepaalt of de krachtige mogelijkheden van een MCP-server beschikbaar zijn voor legitieme gebruikers of voor aanvallers. Als u het verkeerd doet, wordt elke andere beveiligingscontrole irrelevant — een niet-geauthenticeerde of slecht geauthenticeerde MCP-server met toegang tot e-mail, bestanden en databases is een kritieke kwetsbaarheid, ongeacht hoe goed u al het andere hebt verhard.
De gids van het OWASP GenAI Security Project identificeert authenticatie en autorisatie als een van de acht kernbeveiligingsdomeinen voor MCP-servers, met specifieke vereisten die verder gaan dan wat de meeste ontwikkelaars standaard implementeren. Dit artikel legt uit waarom die vereisten bestaan en hoe u ze correct implementeert.
De Authenticatie-uitdaging in MCP
MCP-servers worden geconfronteerd met een complexer authenticatielandschap dan traditionele diensten omdat ze bemiddelen tussen meerdere principals:
- De gebruiker wiens instructies de AI-assistent aansturen
- Het AI-model dat instructies interpreteert en tools aanroept
- De MCP-client (de applicatie die de AI host)
- De MCP-server die tool-aanroepen uitvoert
- Downstream services die de MCP-server namens de gebruiker aanroept
Elk van deze relaties vereist zijn eigen authenticatie- en autorisatiecontroles. Een zwakte in een willekeurige schakel kan worden uitgebuit om de anderen te omzeilen.
Verplicht: OAuth 2.1 en OIDC voor Externe Servers
Voor externe MCP-servers — die via een netwerk worden benaderd in plaats van via lokale STDIO of Unix-sockets — is de OWASP GenAI-gids ondubbelzinnig: OAuth 2.1 met OIDC is verplicht, niet optioneel.
Deze vereiste bestaat omdat:
OAuth 2.1 biedt expliciete scope-controle. Elk toegangstoken declareert precies welke bronnen en acties het autoriseert. Een MCP-server kan op het moment van tool-aanroep verifiëren dat het gepresenteerde token de specifieke scope heeft die nodig is voor die actie — niet alleen dat de gebruiker is geauthenticeerd, maar dat ze geautoriseerd zijn voor deze specifieke operatie.
OIDC biedt cryptografische identiteit. OpenID Connect voegt identiteitsbeweringen toe (het ID-token) die de MCP-server kan verifiëren zonder round-trip naar de identiteitsprovider. De server valideert de iss (issuer), aud (audience), exp (expiry) en handtekening bij elk verzoek.
OAuth 2.1 tokens zijn van nature kortlevend. De moderne OAuth-specificatie (die OAuth 2.0 best practices consolideert en vervangt) benadrukt kortlevende toegangstokens die regelmatig moeten worden vernieuwd. Dit beperkt het schadelijke venster als een token wordt gecompromitteerd.
Wat te Valideren bij Elk Verzoek
Valideer tokens niet alleen bij het opzetten van de sessie. Valideer bij elke tool-aanroep:
def validate_token(token: str, required_scope: str) -> TokenClaims:
claims = jwt.decode(
token,
key=get_public_key(claims_preview['kid']),
algorithms=["RS256", "ES256"]
)
assert claims['iss'] == EXPECTED_ISSUER
assert EXPECTED_AUDIENCE in claims['aud']
assert claims['exp'] > time.time()
assert required_scope in claims['scope'].split()
return claims
Cache validatieresultaten nooit over verzoeken heen. Een token dat geldig was bij het starten van de sessie kan halverwege de sessie worden ingetrokken.
Dynamische Client Omgevingen
In omgevingen waar MCP-clients frequent veranderen (bijv. verschillende AI-assistenten die verbinding maken met dezelfde server), zijn statische API-sleutels of vooraf gedeelde geheimen onvoldoende. Gebruik dynamische clientregistratie met OAuth 2.1 of OIDC om de client-identiteit te verifiëren op het moment van verbinding. Allowlists, hardcoded verbindingsbeleid of wederzijdse TLS (mTLS) zijn geschikt voor bekende statische relaties tussen specifieke clients en servers.
Klaar om uw bedrijf te laten groeien?
Start vandaag uw gratis proefperiode en zie binnen enkele dagen resultaten.
Het Confused Deputy Probleem
De Aanval Begrijpen
De Confused Deputy is een klassieke autorisatiekwetsbaarheid met een bijzonder gevaarlijke manifestatie in MCP-architecturen. De aanval exploiteert de dubbelzinnigheid van wiens autoriteit een MCP-server gebruikt.
Beschouw dit scenario:
- Gebruiker Alice is geauthenticeerd bij een MCP-server met beperkte rechten — ze kan haar eigen bestanden lezen maar niet die van anderen
- De MCP-server heeft brede serviceaccount-rechten om alle bestanden in de organisatie te lezen
- De MCP-server gebruikt token passthrough: het stuurt Alice’s token door naar downstream services
Wanneer Alice de AI-assistent vraagt om “mijn projectmap samen te vatten,” gebruikt de server Alice’s token om toegang te krijgen tot haar bestanden — correct gedrag. Maar als een aanvaller de server misleidt om een verzoek te doen met zijn eigen servicecredentials (misschien via een tool poisoning-aanval of indirecte prompt injection), worden de verhoogde rechten van de server gebruikt om toegang te krijgen tot bestanden waarvoor Alice niet geautoriseerd is.
De server is de “confused deputy” — hij is misleid om zijn autoriteit te gebruiken namens iemand die die autoriteit niet heeft, en fungeert als proxy voor privilege escalatie.
Waarom Token Passthrough Deze Kwetsbaarheid Creëert
Veel MCP-implementaties sturen het token van de client door naar downstream API’s voor de eenvoud. Dit lijkt intuïtief — het token van de gebruiker vertegenwoordigt de rechten van de gebruiker, dus het gebruik ervan voor alle downstream aanroepen handhaaft correcte toegangscontrole.
Het probleem: downstream API’s die de MCP-server herkennen als een vertrouwde tussenpersoon kunnen verzoeken goedkeuren op basis van het identiteitsniveau van de server, niet op het niveau van het doorgestuurde gebruikerstoken. En als de MCP-server ooit op eigen initiatief handelt — door AI-besluitvorming die de gebruiker niet expliciet heeft aangevraagd — kan het zijn eigen credentials gebruiken in plaats van het token van de gebruiker.
Het doorsturen van gebruikerstokens:
- Doorbreekt audittrails (downstream logs tonen gebruikersidentiteit, niet serveridentiteit, waardoor de MCP-laag wordt verduisterd)
- Geeft een aanvaller die de MCP-server compromitteert toegang tot alle doorgestuurde gebruikerstokens
- Creëert complianceproblemen als tokens voor verschillende gebruikers kunnen worden verward of opnieuw afgespeeld
De Oplossing: Expliciete Token Delegatie met On-Behalf-Of Flows
In plaats van clienttokens door te sturen, moet de MCP-server zijn eigen tokens verkrijgen voor downstream service-toegang met behulp van OAuth’s On-Behalf-Of (OBO) flow:
Gebruiker authenticeert bij MCP-client → client krijgt gebruikerstoegangstoken
MCP-client presenteert gebruikerstoken aan MCP-server
MCP-server wisselt gebruikerstoken in voor een servertoken via OBO flow:
POST /token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=<user_access_token>
scope=<minimum_required_scope>
MCP-server gebruikt zijn eigen OBO-token voor downstream aanroepen
Het OBO-token:
- Is expliciet beperkt tot de minimale rechten die nodig zijn voor de specifieke tool-aanroep
- Identificeert de MCP-server als de aanroepende partij (met de gebruiker als onderwerp)
- Is gekoppeld aan de authenticatiegebeurtenis van de gebruiker (kan worden ingetrokken wanneer de sessie van de gebruiker eindigt)
- Stelt het volledige token van de gebruiker niet bloot aan downstream services
Kortlevende, Scoped Tokens
De OWASP GenAI-gids doet een specifieke aanbeveling: geef toegangstokens uit met levensduren gemeten in minuten, niet uren. Dit geldt zowel voor de tokens die de MCP-server accepteert van clients als voor de tokens die het verkrijgt voor downstream service-toegang.
Waarom Korte Levensduren Belangrijk Zijn
Een gestolen toegangstoken is geldig voor zijn volledige levensduur, ongeacht of de legitieme gebruiker is uitgelogd, zijn wachtwoord heeft gewijzigd of zijn sessie heeft ingetrokken. Een 24-uurs token dat aan het begin van een sessie wordt gestolen, geeft een aanvaller 24 uur persistente toegang. Een 5-minuten token dat halverwege de sessie wordt gestolen, geeft maximaal 5 minuten.
Kortlevende tokens dwingen ook regelmatige herauthenticatiegebeurtenissen af, die mogelijkheden bieden om:
- Opnieuw te controleren of het account van de gebruiker is opgeschort of hun rechten zijn gewijzigd
- Afwijkende authenticatiepatronen te detecteren (ongebruikelijke tijden, locaties of frequentie)
- Step-up authenticatie toe te passen voor gevoelige operaties
Token Scope Minimalisatie
Elk token moet alleen de scopes bevatten die nodig zijn voor de specifieke operatie die wordt uitgevoerd. Geef geen token uit met read:files write:files delete:files scope wanneer de huidige tool-aanroep alleen read:files nodig heeft. Dit beperkt de schade als het token wordt onderschept of het model wordt gemanipuleerd tot onverwachte tool-aanroepen.
def get_tool_token(user_id: str, tool_name: str) -> str:
# Map tool naar minimaal vereiste scopes
required_scopes = TOOL_SCOPE_MAP[tool_name]
return oauth_client.get_token(
subject=user_id,
scopes=required_scopes,
lifetime_seconds=300 # 5 minuten levensduur
)
Schrijf u in voor onze nieuwsbrief
Ontvang gratis de nieuwste tips, trends en aanbiedingen.
Sessies Behandelen als Status, Niet Identiteit
Een veelgemaakte fout is het gebruik van sessie-ID’s als autorisatieproxies: als een verzoek een geldige sessie-ID bevat, gaat de server ervan uit dat het geautoriseerd is. Dit vermengt statusbeheer met identiteitsverificatie.
Het juiste model: sessie-ID’s beheren conversatiestatus. Autorisatie wordt onafhankelijk geverifieerd bij elk verzoek door de claims van het OAuth-token te valideren. Zelfs een verzoek met een geldige sessie-ID moet een geldig, niet-verlopen, correct gescoped OAuth-token presenteren voordat een tool-aanroep is toegestaan.
Dit is belangrijk omdat sessie-ID’s kunnen worden gestolen, geraden of opnieuw afgespeeld op manieren waarop OAuth-tokens — die cryptografische integriteitsgaranties bevatten — dat niet kunnen.
Gecentraliseerde Beleidshandhaving
In plaats van autorisatiecontroles verspreid over individuele tool-handlers te implementeren, beveelt de OWASP GenAI-gids een gecentraliseerde beleidsgateway aan die:
- Alle tool-aanroepverzoeken onderschept voordat ze tool-specifieke code bereiken
- Authenticatie valideert (token handtekening, issuer, audience, expiry)
- Autorisatie handhaaft (vereiste scope voor deze specifieke tool)
- Toestemmingsverificatie toepast (heeft de gebruiker dit type actie expliciet geautoriseerd?)
- Tool-filtering implementeert (is deze tool toegestaan in deze deployment-context?)
- Alle beslissingen logt met volledige context voor audit
Centralisatie zorgt ervoor dat beleid consistent wordt toegepast over alle tools en agents. Een tool-specifieke autorisatiecontrole kan tijdens ontwikkeling worden vergeten of omzeild; een gateway-controle niet.
Samenvatting: De Authenticatie Checklist
Voor externe MCP-servers is de minimale authenticatiebeveiligingsdrempel:
Gerelateerde Bronnen