Uwierzytelnianie to strażnik, który określa, czy potężne możliwości serwera MCP są dostępne dla uprawnionych użytkowników, czy dla atakujących. Jeśli zrobisz to źle, każda inna kontrola bezpieczeństwa staje się nieistotna — nieuwierzytelniony lub słabo uwierzytelniony serwer MCP z dostępem do poczty e-mail, plików i baz danych jest krytyczną podatnością, niezależnie od tego, jak dobrze zabezpieczyłeś wszystko inne.
Przewodnik projektu OWASP GenAI Security Project identyfikuje uwierzytelnianie i autoryzację jako jedną z ośmiu podstawowych domen bezpieczeństwa dla serwerów MCP, ze szczegółowymi wymaganiami, które wykraczają poza to, co większość programistów implementuje domyślnie. Ten post wyjaśnia, dlaczego te wymagania istnieją i jak je poprawnie wdrożyć.
Wyzwanie uwierzytelniania w MCP
Serwery MCP stają przed bardziej złożonym krajobrazem uwierzytelniania niż tradycyjne usługi, ponieważ pośredniczą między wieloma podmiotami:
- Użytkownik, którego instrukcje kierują asystentem AI
- Model AI, który interpretuje instrukcje i wywołuje narzędzia
- Klient MCP (aplikacja hostująca AI)
- Serwer MCP, który wykonuje wywołania narzędzi
- Usługi podrzędne, które serwer MCP wywołuje w imieniu użytkownika
Każda z tych relacji wymaga własnych kontroli uwierzytelniania i autoryzacji. Słabość w którymkolwiek ogniwie może zostać wykorzystana do ominięcia pozostałych.
Obowiązkowe: OAuth 2.1 i OIDC dla serwerów zdalnych
Dla zdalnych serwerów MCP — tych dostępnych przez sieć, a nie przez lokalne STDIO lub gniazda Unix — przewodnik OWASP GenAI jest jednoznaczny: OAuth 2.1 z OIDC jest obowiązkowy, nie opcjonalny.
To wymaganie istnieje, ponieważ:
OAuth 2.1 zapewnia jawną kontrolę zakresu. Każdy token dostępu deklaruje dokładnie, które zasoby i działania autoryzuje. Serwer MCP może zweryfikować w czasie wywołania narzędzia, że przedstawiony token ma określony zakres potrzebny do tego działania — nie tylko, że użytkownik jest uwierzytelniony, ale że jest autoryzowany do tej konkretnej operacji.
OIDC zapewnia kryptograficzną tożsamość. OpenID Connect dodaje asercje tożsamości (token ID), które serwer MCP może zweryfikować bez komunikacji zwrotnej z dostawcą tożsamości. Serwer waliduje iss (wystawca), aud (odbiorcy), exp (wygaśnięcie) i podpis przy każdym żądaniu.
Tokeny OAuth 2.1 są z założenia krótkotrwałe. Nowoczesna specyfikacja OAuth (która konsoliduje i zastępuje najlepsze praktyki OAuth 2.0) kładzie nacisk na krótkotrwałe tokeny dostępu, które muszą być regularnie odświeżane. To ogranicza okno szkód, jeśli token zostanie skompromitowany.
Co walidować przy każdym żądaniu
Nie waliduj tokenów tylko przy ustanawianiu sesji. Waliduj przy każdym wywołaniu narzędzia:
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
Nigdy nie buforuj wyników walidacji między żądaniami. Token, który był ważny na początku sesji, może zostać cofnięty w trakcie sesji.
Dynamiczne środowiska klienckie
W środowiskach, gdzie klienci MCP zmieniają się często (np. różni asystenci AI łączący się z tym samym serwerem), statyczne klucze API lub wstępnie udostępnione sekrety są niewystarczające. Użyj dynamicznej rejestracji klienta z OAuth 2.1 lub OIDC, aby zweryfikować tożsamość klienta w czasie połączenia. Listy dozwolonych, zakodowane na stałe zasady połączeń lub wzajemny TLS (mTLS) są odpowiednie dla znanych statycznych relacji między określonymi klientami a serwerami.
Gotowy na rozwój swojej firmy?
Rozpocznij bezpłatny okres próbny już dziś i zobacz rezultaty w ciągu kilku dni.
Problem pomylonego zastępcy
Zrozumienie ataku
Pomylony zastępca to klasyczna podatność autoryzacji o szczególnie niebezpiecznym przejawie w architekturach MCP. Atak wykorzystuje niejednoznaczność tego, czyim autorytetem działa serwer MCP.
Rozważmy ten scenariusz:
- Użytkownik Alicja jest uwierzytelniona na serwerze MCP z ograniczonymi uprawnieniami — może czytać własne pliki, ale nie innych
- Serwer MCP ma szerokie uprawnienia konta usługi do odczytu wszystkich plików w organizacji
- Serwer MCP używa przekazywania tokenów: przekazuje token Alicji do usług podrzędnych
Gdy Alicja prosi asystenta AI o “podsumowanie mojego folderu projektu”, serwer używa tokenu Alicji do dostępu do jej plików — poprawne zachowanie. Ale jeśli atakujący nakłoni serwer do wykonania żądania przy użyciu własnych poświadczeń usługi (być może przez atak zatruwania narzędzi lub pośrednią iniekcję promptu), podwyższone uprawnienia serwera są używane do dostępu do plików, do których Alicja nie jest autoryzowana.
Serwer jest “pomylonym zastępcą” — został nakłoniony do użycia swojego autorytetu w imieniu kogoś, kto nie ma tego autorytetu, działając jako pośrednik dla eskalacji uprawnień.
Dlaczego przekazywanie tokenów tworzy tę podatność
Wiele implementacji MCP przekazuje token klienta do podrzędnych API dla uproszczenia. Wydaje się to intuicyjne — token użytkownika reprezentuje uprawnienia użytkownika, więc używanie go do wszystkich wywołań podrzędnych utrzymuje poprawną kontrolę dostępu.
Problem: podrzędne API, które rozpoznają serwer MCP jako zaufanego pośrednika, mogą przyznawać żądania przy użyciu poziomu tożsamości serwera, a nie poziomu przekazanego tokenu użytkownika. A jeśli serwer MCP kiedykolwiek działa z własnej inicjatywy — poprzez podejmowanie decyzji AI, o które użytkownik nie prosił jawnie — może użyć własnych poświadczeń zamiast tokenu użytkownika.
Przekazywanie tokenów użytkowników również:
- Przerywa ścieżki audytu (logi podrzędne pokazują tożsamość użytkownika, a nie tożsamość serwera, zasłaniając warstwę MCP)
- Daje atakującemu, który skompromituje serwer MCP, dostęp do wszystkich przekazanych tokenów użytkowników
- Tworzy problemy zgodności, jeśli tokeny dla różnych użytkowników mogą zostać pomylone lub odtworzone
Rozwiązanie: jawna delegacja tokenów z przepływami On-Behalf-Of
Zamiast przekazywać tokeny klientów, serwer MCP powinien uzyskać własne tokeny dla dostępu do usług podrzędnych przy użyciu przepływu On-Behalf-Of (OBO) OAuth:
Użytkownik uwierzytelnia się na kliencie MCP → klient otrzymuje token dostępu użytkownika
Klient MCP przedstawia token użytkownika serwerowi MCP
Serwer MCP wymienia token użytkownika na token serwera przez przepływ OBO:
POST /token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=<user_access_token>
scope=<minimum_required_scope>
Serwer MCP używa własnego tokenu OBO do wywołań podrzędnych
Token OBO:
- Jest jawnie ograniczony do minimalnych uprawnień potrzebnych do konkretnego wywołania narzędzia
- Identyfikuje serwer MCP jako stronę wywołującą (z użytkownikiem jako podmiotem)
- Jest powiązany ze zdarzeniem uwierzytelniania użytkownika (może zostać cofnięty, gdy sesja użytkownika się kończy)
- Nie ujawnia pełnego tokenu użytkownika usługom podrzędnym
Krótkotrwałe, ograniczone tokeny
Przewodnik OWASP GenAI zawiera konkretne zalecenie: wystawiaj tokeny dostępu z czasem życia mierzonym w minutach, a nie godzinach. Dotyczy to zarówno tokenów, które serwer MCP akceptuje od klientów, jak i tokenów, które uzyskuje dla dostępu do usług podrzędnych.
Dlaczego krótki czas życia ma znaczenie
Skradziony token dostępu jest ważny przez cały czas życia, niezależnie od tego, czy uprawniony użytkownik się wylogował, zmienił hasło czy cofnął swoją sesję. Token 24-godzinny skradziony na początku sesji daje atakującemu 24 godziny trwałego dostępu. Token 5-minutowy skradziony w połowie sesji daje maksymalnie 5 minut.
Krótkotrwałe tokeny wymuszają również regularne zdarzenia ponownego uwierzytelniania, które zapewniają możliwości do:
- Ponownego sprawdzenia, czy konto użytkownika zostało zawieszone lub jego uprawnienia zostały zmienione
- Wykrycia anomalnych wzorców uwierzytelniania (nietypowe czasy, lokalizacje lub częstotliwość)
- Zastosowania uwierzytelniania wzmocnionego dla wrażliwych operacji
Minimalizacja zakresu tokenu
Każdy token powinien zawierać tylko zakresy potrzebne do konkretnej wykonywanej operacji. Nie wystawiaj tokenu z zakresem read:files write:files delete:files, gdy bieżące wywołanie narzędzia potrzebuje tylko read:files. To ogranicza szkody, jeśli token zostanie przechwycony lub model zostanie zmanipulowany do nieoczekiwanych wywołań narzędzi.
def get_tool_token(user_id: str, tool_name: str) -> str:
# Mapuj narzędzie na minimalne wymagane zakresy
required_scopes = TOOL_SCOPE_MAP[tool_name]
return oauth_client.get_token(
subject=user_id,
scopes=required_scopes,
lifetime_seconds=300 # 5-minutowy czas życia
)
Dołącz do naszego newslettera
Otrzymuj najnowsze wskazówki, trendy i oferty za darmo.
Traktowanie sesji jako stanu, a nie tożsamości
Powszechnym błędem jest używanie identyfikatorów sesji jako pośredników autoryzacji: jeśli żądanie niesie ważny identyfikator sesji, serwer zakłada, że jest autoryzowane. To łączy zarządzanie stanem z weryfikacją tożsamości.
Prawidłowy model: identyfikatory sesji zarządzają stanem konwersacji. Autoryzacja jest weryfikowana niezależnie przy każdym żądaniu przez walidację roszczeń tokenu OAuth. Nawet żądanie niosące ważny identyfikator sesji musi przedstawić ważny, niewygasły, odpowiednio ograniczony token OAuth, zanim jakiekolwiek wywołanie narzędzia zostanie dozwolone.
To ma znaczenie, ponieważ identyfikatory sesji mogą zostać skradzione, odgadnięte lub odtworzone w sposób, w jaki tokeny OAuth — które niosą kryptograficzne gwarancje integralności — nie mogą.
Scentralizowane egzekwowanie zasad
Zamiast implementować kontrole autoryzacji rozproszone w poszczególnych procedurach obsługi narzędzi, przewodnik OWASP GenAI zaleca scentralizowaną bramę zasad, która:
- Przechwytuje wszystkie żądania wywołania narzędzi, zanim dotrą do kodu specyficznego dla narzędzia
- Waliduje uwierzytelnianie (podpis tokenu, wystawca, odbiorcy, wygaśnięcie)
- Egzekwuje autoryzację (wymagany zakres dla tego konkretnego narzędzia)
- Stosuje weryfikację zgody (czy użytkownik jawnie autoryzował ten typ działania?)
- Implementuje filtrowanie narzędzi (czy to narzędzie jest dozwolone w tym kontekście wdrożenia?)
- Rejestruje wszystkie decyzje z pełnym kontekstem dla audytu
Centralizacja zapewnia, że zasady są konsekwentnie stosowane we wszystkich narzędziach i agentach. Kontrola autoryzacji specyficzna dla narzędzia może zostać zapomniana lub ominięta podczas rozwoju; kontrola bramy nie może.
Podsumowanie: lista kontrolna uwierzytelniania
Dla zdalnych serwerów MCP minimalny poziom bezpieczeństwa uwierzytelniania to:
Powiązane zasoby