Authentifizierung ist der Torwächter, der bestimmt, ob die leistungsstarken Funktionen eines MCP-Servers legitimen Benutzern oder Angreifern zur Verfügung stehen. Wenn Sie es falsch machen, wird jede andere Sicherheitskontrolle irrelevant – ein nicht authentifizierter oder schlecht authentifizierter MCP-Server mit Zugriff auf E-Mails, Dateien und Datenbanken ist eine kritische Schwachstelle, unabhängig davon, wie gut Sie alles andere gehärtet haben.
Der Leitfaden des OWASP GenAI Security Project identifiziert Authentifizierung und Autorisierung als eine der acht zentralen Sicherheitsdomänen für MCP-Server, mit spezifischen Anforderungen, die über das hinausgehen, was die meisten Entwickler standardmäßig implementieren. Dieser Beitrag erklärt, warum diese Anforderungen existieren und wie man sie korrekt implementiert.
Die Authentifizierungsherausforderung in MCP
MCP-Server stehen vor einer komplexeren Authentifizierungslandschaft als traditionelle Dienste, da sie zwischen mehreren Hauptakteuren vermitteln:
- Der Benutzer, dessen Anweisungen den KI-Assistenten steuern
- Das KI-Modell, das Anweisungen interpretiert und Tools aufruft
- Der MCP-Client (die Anwendung, die die KI hostet)
- Der MCP-Server, der Tool-Aufrufe ausführt
- Nachgelagerte Dienste, die der MCP-Server im Namen des Benutzers aufruft
Jede dieser Beziehungen erfordert eigene Authentifizierungs- und Autorisierungskontrollen. Eine Schwäche in einem Glied kann ausgenutzt werden, um die anderen zu umgehen.
Obligatorisch: OAuth 2.1 und OIDC für entfernte Server
Für entfernte MCP-Server – solche, auf die über ein Netzwerk zugegriffen wird und nicht über lokale STDIO- oder Unix-Sockets – ist der OWASP GenAI-Leitfaden eindeutig: OAuth 2.1 mit OIDC ist obligatorisch, nicht optional.
Diese Anforderung besteht, weil:
OAuth 2.1 bietet explizite Scope-Kontrolle. Jedes Zugriffstoken deklariert genau, welche Ressourcen und Aktionen es autorisiert. Ein MCP-Server kann zum Zeitpunkt des Tool-Aufrufs überprüfen, ob das präsentierte Token den spezifischen Scope hat, der für diese Aktion benötigt wird – nicht nur, dass der Benutzer authentifiziert ist, sondern dass er für diese spezifische Operation autorisiert ist.
OIDC bietet kryptografische Identität. OpenID Connect fügt Identitätsbestätigungen (das ID-Token) hinzu, die der MCP-Server überprüfen kann, ohne zum Identitätsanbieter zurückzukehren. Der Server validiert den iss (Aussteller), aud (Zielgruppe), exp (Ablauf) und die Signatur bei jeder Anfrage.
OAuth 2.1-Tokens sind von Natur aus kurzlebig. Die moderne OAuth-Spezifikation (die OAuth 2.0 Best Practices konsolidiert und ersetzt) betont kurzlebige Zugriffstokens, die regelmäßig erneuert werden müssen. Dies begrenzt das Schadensfenster, wenn ein Token kompromittiert wird.
Was bei jeder Anfrage zu validieren ist
Validieren Sie Tokens nicht nur bei der Sitzungseinrichtung. Validieren Sie bei jedem Tool-Aufruf:
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
Cachen Sie niemals Validierungsergebnisse über Anfragen hinweg. Ein Token, das zu Beginn der Sitzung gültig war, kann während der Sitzung widerrufen werden.
Dynamische Client-Umgebungen
In Umgebungen, in denen sich MCP-Clients häufig ändern (z. B. verschiedene KI-Assistenten, die sich mit demselben Server verbinden), sind statische API-Schlüssel oder vorab geteilte Geheimnisse unzureichend. Verwenden Sie dynamische Client-Registrierung mit OAuth 2.1 oder OIDC, um die Client-Identität zum Zeitpunkt der Verbindung zu überprüfen. Allowlists, fest codierte Verbindungsrichtlinien oder gegenseitiges TLS (mTLS) sind für bekannte statische Beziehungen zwischen bestimmten Clients und Servern geeignet.
Bereit, Ihr Geschäft zu erweitern?
Starten Sie heute Ihre kostenlose Testversion und sehen Sie innerhalb weniger Tage Ergebnisse.
Das Confused-Deputy-Problem
Den Angriff verstehen
Der Confused Deputy ist eine klassische Autorisierungsschwachstelle mit einer besonders gefährlichen Manifestation in MCP-Architekturen. Der Angriff nutzt die Mehrdeutigkeit aus, mit wessen Autorität ein MCP-Server handelt.
Betrachten Sie dieses Szenario:
- Benutzerin Alice ist bei einem MCP-Server mit eingeschränkten Berechtigungen authentifiziert – sie kann ihre eigenen Dateien lesen, aber nicht die anderer
- Der MCP-Server hat umfassende Dienstkonto-Berechtigungen, um alle Dateien in der Organisation zu lesen
- Der MCP-Server verwendet Token-Passthrough: Er leitet Alices Token an nachgelagerte Dienste weiter
Wenn Alice den KI-Assistenten bittet, “meinen Projektordner zusammenzufassen”, verwendet der Server Alices Token, um auf ihre Dateien zuzugreifen – korrektes Verhalten. Aber wenn ein Angreifer den Server dazu verleitet, eine Anfrage mit seinen eigenen Dienstanmeldeinformationen zu stellen (vielleicht durch einen Tool-Poisoning-Angriff oder indirekte Prompt-Injection), werden die erhöhten Berechtigungen des Servers verwendet, um auf Dateien zuzugreifen, für die Alice nicht autorisiert ist.
Der Server ist der “confused deputy” – er wurde dazu verleitet, seine Autorität im Namen von jemandem zu verwenden, der diese Autorität nicht hat, und fungiert als Proxy für Privilege Escalation.
Warum Token-Passthrough diese Schwachstelle erzeugt
Viele MCP-Implementierungen leiten das Token des Clients aus Gründen der Einfachheit an nachgelagerte APIs weiter. Dies erscheint intuitiv – das Token des Benutzers repräsentiert die Berechtigungen des Benutzers, also gewährleistet seine Verwendung für alle nachgelagerten Aufrufe die korrekte Zugriffskontrolle.
Das Problem: Nachgelagerte APIs, die den MCP-Server als vertrauenswürdigen Vermittler erkennen, können Anfragen auf der Identitätsebene des Servers gewähren, nicht auf der Ebene des weitergeleiteten Benutzer-Tokens. Und wenn der MCP-Server jemals auf eigene Initiative handelt – durch KI-Entscheidungsfindung, die der Benutzer nicht explizit angefordert hat – kann er seine eigenen Anmeldeinformationen anstelle des Benutzer-Tokens verwenden.
Das Weiterleiten von Benutzer-Tokens führt auch zu:
- Unterbrechung von Audit-Trails (nachgelagerte Protokolle zeigen Benutzeridentität, nicht Serveridentität, was die MCP-Ebene verschleiert)
- Gibt einem Angreifer, der den MCP-Server kompromittiert, Zugriff auf alle weitergeleiteten Benutzer-Tokens
- Erzeugt Compliance-Probleme, wenn Tokens für verschiedene Benutzer verwechselt oder wiedergegeben werden können
Die Lösung: Explizite Token-Delegation mit On-Behalf-Of-Flows
Anstatt Client-Tokens weiterzuleiten, sollte der MCP-Server seine eigenen Tokens für den Zugriff auf nachgelagerte Dienste über den OAuth-On-Behalf-Of (OBO)-Flow erhalten:
Benutzer authentifiziert sich beim MCP-Client → Client erhält Benutzerzugriffstoken
MCP-Client präsentiert Benutzer-Token dem MCP-Server
MCP-Server tauscht Benutzer-Token gegen ein Server-Token über OBO-Flow aus:
POST /token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=<user_access_token>
scope=<minimum_required_scope>
MCP-Server verwendet sein eigenes OBO-Token für nachgelagerte Aufrufe
Das OBO-Token:
- Ist explizit auf die Mindestberechtigungen beschränkt, die für den spezifischen Tool-Aufruf erforderlich sind
- Identifiziert den MCP-Server als aufrufende Partei (mit dem Benutzer als Subjekt)
- Ist an das Authentifizierungsereignis des Benutzers gebunden (kann widerrufen werden, wenn die Sitzung des Benutzers endet)
- Exponiert das vollständige Token des Benutzers nicht gegenüber nachgelagerten Diensten
Kurzlebige, bereichsbeschränkte Tokens
Der OWASP GenAI-Leitfaden gibt eine spezifische Empfehlung: Stellen Sie Zugriffstokens mit Lebensdauern aus, die in Minuten gemessen werden, nicht in Stunden. Dies gilt sowohl für die Tokens, die der MCP-Server von Clients akzeptiert, als auch für die Tokens, die er für den Zugriff auf nachgelagerte Dienste erhält.
Warum kurze Lebensdauern wichtig sind
Ein gestohlenes Zugriffstoken ist für seine gesamte Lebensdauer gültig, unabhängig davon, ob sich der legitime Benutzer abgemeldet, sein Passwort geändert oder seine Sitzung widerrufen hat. Ein 24-Stunden-Token, das zu Beginn einer Sitzung gestohlen wird, gibt einem Angreifer 24 Stunden dauerhaften Zugriff. Ein 5-Minuten-Token, das während der Sitzung gestohlen wird, gibt maximal 5 Minuten.
Kurzlebige Tokens erzwingen auch regelmäßige Neuauthentifizierungsereignisse, die Gelegenheiten bieten:
- Erneut zu überprüfen, ob das Konto des Benutzers gesperrt wurde oder sich seine Berechtigungen geändert haben
- Anomale Authentifizierungsmuster zu erkennen (ungewöhnliche Zeiten, Orte oder Häufigkeit)
- Step-up-Authentifizierung für sensible Operationen anzuwenden
Token-Scope-Minimierung
Jedes Token sollte nur die Scopes enthalten, die für die spezifische Operation erforderlich sind. Stellen Sie kein Token mit read:files write:files delete:files Scope aus, wenn der aktuelle Tool-Aufruf nur read:files benötigt. Dies begrenzt den Schaden, wenn das Token abgefangen wird oder das Modell zu unerwarteten Tool-Aufrufen manipuliert wird.
def get_tool_token(user_id: str, tool_name: str) -> str:
# Tool auf minimale erforderliche Scopes abbilden
required_scopes = TOOL_SCOPE_MAP[tool_name]
return oauth_client.get_token(
subject=user_id,
scopes=required_scopes,
lifetime_seconds=300 # 5 Minuten Lebensdauer
)
Abonnieren Sie unseren Newsletter
Erhalten Sie die neuesten Tipps, Trends und Angebote kostenlos.
Sitzungen als Zustand behandeln, nicht als Identität
Ein häufiger Fehler ist die Verwendung von Sitzungs-IDs als Autorisierungs-Proxys: Wenn eine Anfrage eine gültige Sitzungs-ID trägt, nimmt der Server an, dass sie autorisiert ist. Dies vermischt Zustandsverwaltung mit Identitätsüberprüfung.
Das korrekte Modell: Sitzungs-IDs verwalten den Konversationszustand. Die Autorisierung wird bei jeder Anfrage unabhängig überprüft, indem die Claims des OAuth-Tokens validiert werden. Selbst eine Anfrage mit einer gültigen Sitzungs-ID muss ein gültiges, nicht abgelaufenes, ordnungsgemäß begrenztes OAuth-Token präsentieren, bevor ein Tool-Aufruf erlaubt wird.
Dies ist wichtig, weil Sitzungs-IDs auf Arten gestohlen, erraten oder wiedergegeben werden können, die bei OAuth-Tokens – die kryptografische Integritätsgarantien tragen – nicht möglich sind.
Zentralisierte Richtliniendurchsetzung
Anstatt Autorisierungsprüfungen zu implementieren, die über einzelne Tool-Handler verstreut sind, empfiehlt der OWASP GenAI-Leitfaden ein zentralisiertes Richtlinien-Gateway, das:
- Alle Tool-Aufruf-Anfragen abfängt, bevor sie toolspezifischen Code erreichen
- Authentifizierung validiert (Token-Signatur, Aussteller, Zielgruppe, Ablauf)
- Autorisierung durchsetzt (erforderlicher Scope für dieses spezifische Tool)
- Zustimmungsüberprüfung anwendet (hat der Benutzer diese Art von Aktion explizit autorisiert?)
- Tool-Filterung implementiert (ist dieses Tool in diesem Bereitstellungskontext erlaubt?)
- Alle Entscheidungen mit vollem Kontext für Audits protokolliert
Zentralisierung stellt sicher, dass Richtlinien konsistent über alle Tools und Agenten hinweg angewendet werden. Eine toolspezifische Autorisierungsprüfung kann während der Entwicklung vergessen oder umgangen werden; eine Gateway-Prüfung nicht.
Zusammenfassung: Die Authentifizierungs-Checkliste
Für entfernte MCP-Server ist die minimale Sicherheitsschwelle für Authentifizierung:
Verwandte Ressourcen