0Pricing
AI Engineering Academy · Lektion

Sicherheit und Authentifizierung in MCP

Fügen Sie Ihrem MCP-Server mithilfe von OAuth-2.0-Tokens eine Authentifizierung hinzu, implementieren Sie eine Eingabevalidierung zum Schutz vor Injection-Angriffen und wenden Sie das Prinzip der geringsten Berechtigungen auf Tool-Berechtigungen an.

Sicherheit und Authentifizierung in MCP ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum MCP-Sicherheit wichtig ist

Ein MCP-Server ist ein Zugang zu Ihren Systemen. Ohne geeignete Sicherheitsmaßnahmen könnte ein kompromittierter KI-Client oder ein bösartiger Prompt sensible Daten lesen, zerstörerische Operationen auslösen oder Informationen über den Tool-Aufruf-Kanal exfiltrieren. Die Sicherheit von MCP-Servern muss auf mehreren Schutzebenen beruhen: Authentifizierung auf der Transportschicht, Autorisierung auf Tool-Ebene und Eingabevalidierung bei jedem Aufruf.

Sicherheit lokaler und entfernter Server

Der von Claude Desktop verwendete stdio-Transport bietet inhärente Sicherheit: Der Server läuft als lokaler Prozess und ist nur für den Benutzer zugänglich, der ihn gestartet hat. Netzwerkseitig erreichbare MCP-Server, die HTTP/SSE verwenden, sind der gesamten Bandbreite von Web-Sicherheitsbedrohungen ausgesetzt: Umgehung der Authentifizierung, Injection-Angriffe und unbefugter Zugriff. Die Sicherheitsanforderungen unterscheiden sich je nach Bereitstellungsmodus erheblich.

  • Lokales stdio: Dem lokalen Benutzer vertrauen; Schwerpunkt auf Eingabevalidierung
  • Entferntes HTTP/SSE: Vollständige Authentifizierung, TLS, Ratenbegrenzung und Eingabebereinigung

API-Key-Authentifizierung für entfernte Server

Die einfachste Authentifizierung für entfernte MCP-Server ist die Validierung eines API-Schlüssels über einen HTTP-Header. Prüfen Sie bei jeder eingehenden Anfrage den Header Authorization: Bearer <token> und weisen Sie nicht authentifizierte Anfragen mit HTTP 401 zurück. Speichern Sie gültige API-Schlüssel zusammen mit Benutzermetadaten in einer Datenbank, damit Sie einzelne Schlüssel widerrufen können.

# For HTTP/SSE MCP servers using FastAPI or similar:
from fastapi import FastAPI, HTTPException, Depends, Header
from typing import Optional
import secrets

app_http = FastAPI()

# In production: store in database with user_id, created_at, last_used
VALID_KEYS = {'sk-mcp-abc123': {'user': 'alice', 'scopes': ['read']},
              'sk-mcp-def456': {'user': 'bob', 'scopes': ['read', 'write']}}

async def verify_api_key(authorization: Optional[str] = Header(None)) -> dict:
    if not authorization or not authorization.startswith('Bearer '):
        raise HTTPException(status_code=401, detail='Missing API key')
    key = authorization.removeprefix('Bearer ')
    if key not in VALID_KEYS:
        raise HTTPException(status_code=401, detail='Invalid API key')
    return VALID_KEYS[key]  # Returns user context

# Use in route handlers:
# @app_http.get('/sse')
# async def sse_endpoint(user=Depends(verify_api_key)):

OAuth 2.0 für MCP-Server in Unternehmen

Verwenden Sie für Unternehmensbereitstellungen OAuth 2.0, damit sich Benutzer bei ihrem Unternehmens-Identity-Provider (Okta, Azure AD, Google Workspace) authentifizieren. Der MCP-Client ruft ein OAuth-Access-Token ab und fügt es den Tool-Aufruf-Anfragen hinzu. Ihr Server validiert die Signatur des Tokens anhand der öffentlichen Schlüssel des Identity-Providers mit python-jose oder authlib.

from jose import jwt, JWTError
import httpx

AUTH_DOMAIN = 'your-tenant.auth0.com'
AUDIENCE = 'https://api.your-mcp-server.com'

async def get_jwks():
    async with httpx.AsyncClient() as client:
        resp = await client.get(f'https://{AUTH_DOMAIN}/.well-known/jwks.json')
        return resp.json()

async def verify_oauth_token(token: str) -> dict:
    jwks = await get_jwks()
    try:
        payload = jwt.decode(
            token,
            jwks,
            algorithms=['RS256'],
            audience=AUDIENCE,
            issuer=f'https://{AUTH_DOMAIN}/'
        )
        return payload  # Contains sub (user ID), scope, exp, etc.
    except JWTError as e:
        raise ValueError(f'Invalid token: {e}')

Autorisierung auf Grundlage von Scopes

Nicht alle MCP-Tools sollten allen Benutzern zur Verfügung stehen. Verwenden Sie OAuth-Scopes oder Rollen-Claims im JWT-Token, um zu bestimmen, welche Tools der authentifizierte Benutzer aufrufen darf. Prüfen Sie die Berechtigung zu Beginn jeder Tool-Ausführung, bevor ein Datenbank- oder API-Aufruf erfolgt.

TOOL_REQUIRED_SCOPES = {
    'list_products': ['read:products'],
    'search_products': ['read:products'],
    'create_order': ['write:orders'],
    'delete_order': ['admin:orders']
}

def check_authorization(tool_name: str, token_payload: dict):
    '''Raise ValueError if user lacks required scope for the tool.'''
    required = TOOL_REQUIRED_SCOPES.get(tool_name, [])
    if not required:
        return  # No scope required

    user_scopes = set(token_payload.get('scope', '').split())
    missing = [s for s in required if s not in user_scopes]
    if missing:
        raise ValueError(
            f'Access denied. Tool "{tool_name}" requires scopes: {missing}. '
            f'Your token has: {list(user_scopes)}'
        )

# In call_tool handler:
# check_authorization(name, current_user_token)
# ... then execute the tool

Eingabevalidierung und Verhinderung von Injection-Angriffen

Alle Tool-Eingaben sind letztlich Zeichenfolgen, die von einem LLM erzeugt werden – behandeln Sie sie als nicht vertrauenswürdig. Validieren Sie jede Eingabe vor der Verwendung anhand der erwarteten Typen und Muster. Schützen Sie sich insbesondere vor: SQL-Injection (verwenden Sie parametrisierte Abfragen, niemals SQL mit String-Interpolation), Command Injection (übergeben Sie niemals Benutzereingaben an Shell-Befehle) und Path Traversal (normalisieren und validieren Sie Dateipfade).

import re
from pathlib import Path

BASE_DATA_DIR = Path('/data/mcp-files')

def safe_file_path(user_input: str) -> Path:
    '''Validate and normalize a file path to prevent traversal attacks.'''
    # Remove any path traversal sequences
    clean = re.sub(r'\.\./', '', user_input)
    clean = re.sub(r'\.\.\\\\', '', clean)
    path = (BASE_DATA_DIR / clean).resolve()

    # Ensure the resolved path is still within the allowed base directory
    if not str(path).startswith(str(BASE_DATA_DIR)):
        raise ValueError(f'Path traversal detected: {user_input}')

    return path

def safe_identifier(value: str) -> str:
    '''Validate a database identifier (table/column name).'''
    if not re.match(r'^[a-z_][a-z0-9_]{0,63}$', value, re.IGNORECASE):
        raise ValueError(f'Invalid identifier: {value}')
    return value

Aufrufe von Tools begrenzen

Ein LLM-Agent in einer Schleife könnte teure Tools mehrere hundert Mal pro Minute aufrufen und dadurch Ihre Datenbankverbindungen, Kontingente für APIs von Drittanbietern oder Ihr Rechenbudget erschöpfen. Implementieren Sie benutzerbezogene Ratenbegrenzungen mit einem Token-Bucket-Algorithmus in Redis. Lehnen Sie Tool-Aufrufe, die das Limit überschreiten, mit einer aussagekräftigen Fehlermeldung ab, damit der Agent weiß, dass er warten muss.

import redis
import time

r = redis.Redis.from_url('redis://localhost:6379')

def check_rate_limit(user_id: str, tool_name: str, limit: int = 60, window: int = 60) -> None:
    '''Allow at most `limit` calls per `window` seconds per user per tool.'''
    key = f'rate:{user_id}:{tool_name}'
    pipe = r.pipeline()
    pipe.incr(key)
    pipe.expire(key, window)
    count, _ = pipe.execute()

    if count > limit:
        retry_after = r.ttl(key)
        raise ValueError(
            f'Rate limit exceeded for {tool_name}. '
            f'Limit: {limit} calls/{window}s. '
            f'Retry after {retry_after} seconds.'
        )

Prinzip der geringsten Privilegien

Wenden Sie das Prinzip der geringsten Privilegien auf jeder Ebene Ihres MCP-Servers an. Der Datenbankbenutzer sollte für die vom Server benötigten Tabellen nur SELECT-Rechte haben. Der Serverprozess sollte unter einem Nicht-Root-Betriebssystembenutzer laufen. Tools sollten nur die Berechtigungen anfordern, die sie benötigen. API-Schlüssel sollten für ihren Zweck den kleinstmöglichen Gültigkeitsbereich haben. Jede Berechtigung, die Sie entziehen, verhindert einen möglichen Angriff.

-- PostgreSQL: Create a dedicated read-only database user for your MCP server
CREATE ROLE mcp_reader LOGIN PASSWORD 'strong_random_password';

-- Grant SELECT on only the tables the server needs
GRANT SELECT ON products, categories, public_content TO mcp_reader;

-- Explicitly deny access to sensitive tables
REVOKE ALL ON users, api_keys, payment_methods FROM mcp_reader;

-- Never grant: INSERT, UPDATE, DELETE, TRUNCATE, or DDL permissions

TLS und Transportsicherheit

Entfernte MCP-Server müssen TLS verwenden, um Daten während der Übertragung zu schützen. Konfigurieren Sie Ihren Server so, dass er nur HTTPS-Verbindungen akzeptiert. Verwenden Sie in der Produktion einen Reverse Proxy (nginx, Caddy), der die TLS-Terminierung übernimmt und Zertifikate durch automatische Erneuerung aktuell hält (Let's Encrypt über Certbot oder die integrierte ACME-Unterstützung von Caddy).

# Example Caddyfile for TLS-terminating MCP server at a subdomain:
#
# mcp.yourcompany.com {
#     reverse_proxy localhost:8080
#     encode gzip
#     tls internal  # Use Let's Encrypt in production
#     header {
#         Strict-Transport-Security 'max-age=31536000; includeSubDomains'
#         X-Content-Type-Options nosniff
#         X-Frame-Options DENY
#     }
# }

Prompt Injection über MCP-Ressourcen

Ein subtiler Angriffsvektor: Wenn Ihr MCP-Server Inhalte aus externen Quellen (Webseiten, von Benutzern hochgeladene Dateien, nicht vertrauenswürdige Datenbanken) liest und als Tool-Ergebnis zurückgibt, kann ein Angreifer in diesen Inhalten manipulierte Anweisungen einbetten. Das Modell könnte Anweisungen befolgen, die in abgerufenen Daten verborgen sind – dies nennt man indirekte Prompt Injection. Bereinigen Sie abgerufene Inhalte und geben Sie niemals unverarbeiteten, nicht vertrauenswürdigen Text direkt als Tool-Ausgabe zurück.

import re

def sanitize_for_mcp_output(text: str) -> str:
    '''Remove patterns that look like instructions to the LLM.'''
    # Remove common injection patterns
    dangerous_patterns = [
        r'ignore previous instructions',
        r'ignore all prior instructions',
        r'system:',
        r'<\|.*?\|>',  # Special tokens
        r'\[INST\]',
        r'<s>',
    ]
    for pattern in dangerous_patterns:
        text = re.sub(pattern, '[FILTERED]', text, flags=re.IGNORECASE)
    return text[:10000]  # Also cap length to prevent context stuffing

Sicherheitsüberprüfung und -überwachung

Protokollieren Sie alle sicherheitsrelevanten Ereignisse: erfolgreiche und fehlgeschlagene Authentifizierungen, Verstöße gegen Ratenbegrenzungen, verweigerte Autorisierungen, Validierungsfehler und ungewöhnliche Zugriffsmuster. Richten Sie Warnmeldungen ein für: mehrere fehlgeschlagene Authentifizierungsversuche (Brute-Force-Angriff), einen einzelnen Benutzer, der in kurzer Zeit destruktive Tools aufruft, sowie jeden Tool-Aufruf mit extrem großen Eingaben. Überprüfen Sie Audit-Protokolle regelmäßig und automatisieren Sie die Erkennung von Anomalien.

Kurzer Wissenstest

Testen Sie Ihr Verständnis der Sicherheits- und Authentifizierungskonzepte von MCP.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Entfernte MCP-Server erfordern bei jeder Anfrage eine Authentifizierung mit OAuth 2.0 oder einem API-Schlüssel, die Autorisierung auf Grundlage von Berechtigungsumfängen legt fest, welche Tools die einzelnen authentifizierten Benutzer aufrufen dürfen und alle Tool-Eingaben müssen validiert werden, um Injection-Angriffe und Path Traversal zu verhindern. Damit ist das MCP-Modul abgeschlossen – als Nächstes untersuchen wir fortgeschrittene Chunking-Strategien für hochpräzise RAG-Abfragen.

Häufig gestellte Fragen

Ist die Lektion „Sicherheit und Authentifizierung in MCP“ kostenlos?

Ja — der vollständige Text von „Sicherheit und Authentifizierung in MCP“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Sicherheit und Authentifizierung in MCP“?

Fügen Sie Ihrem MCP-Server mithilfe von OAuth-2.0-Tokens eine Authentifizierung hinzu, implementieren Sie eine Eingabevalidierung zum Schutz vor Injection-Angriffen und wenden Sie das Prinzip der ger… Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Engineering Academy zu starten?

Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Sicherheit und Authentifizierung in MCP“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?

Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was ist MCP und warum ist es wichtig?
  2. Ihren ersten MCP-Server entwickeln
  3. Datenbankressourcen über MCP bereitstellen
  4. Sicherheit und Authentifizierung in MCP
← Zurück zu AI Engineering Academy