Zabezpečenie vášho Model Context Protocol (MCP) servera je rovnako dôležité ako zamknutie vchodových dverí vášho domu. Necháte váš MCP server otvorený, vystavujete svoje nástroje a dáta neoprávnenému prístupu, čo môže viesť k bezpečnostným incidentom. Microsoft Entra ID poskytuje spoľahlivé cloudové riešenie na správu identity a prístupu, ktoré zabezpečuje, že iba autorizovaní používatelia a aplikácie môžu komunikovať s vaším MCP serverom. V tejto časti sa naučíte, ako chrániť svoje AI pracovné toky pomocou overovania Entra ID.
Na konci tejto časti budete schopní:
- Pochopiť význam zabezpečenia MCP serverov.
- Vysvetliť základy Microsoft Entra ID a overovania OAuth 2.0.
- Rozlíšiť medzi verejnými a dôverným klientmi.
- Implementovať overovanie Entra ID v lokálnych (verejný klient) aj vzdialených (dôverné klient) scenároch MCP serverov.
- Použiť osvedčené bezpečnostné postupy pri vývoji AI pracovných tokov.
Rovnako ako by ste nenechali vchodové dvere svojho domu odomknuté, nemali by ste nechať MCP server otvorený pre kohokoľvek. Zabezpečenie vašich AI pracovných tokov je kľúčové pre vytváranie robustných, dôveryhodných a bezpečných aplikácií. Táto kapitola vám predstaví použitie Microsoft Entra ID na zabezpečenie MCP serverov, aby s vašimi nástrojmi a dátami mohli pracovať iba autorizovaní používatelia a aplikácie.
Predstavte si, že váš MCP server má nástroj, ktorý dokáže posielať e-maily alebo pristupovať k databáze zákazníkov. Nezabezpečený server by znamenal, že ktokoľvek by mohol tento nástroj použiť, čo by mohlo viesť k neoprávnenému prístupu k dátam, spamu alebo iným škodlivým aktivitám.
Implementáciou overovania zabezpečíte, že každá požiadavka na server je overená a potvrdzuje identitu používateľa alebo aplikácie, ktorá požiadavku posiela. Toto je prvý a najdôležitejší krok k zabezpečeniu vašich AI pracovných tokov.
Microsoft Entra ID je cloudová služba na správu identity a prístupu. Predstavte si ju ako univerzálneho bezpečnostného strážcu pre vaše aplikácie. Zabezpečuje zložitý proces overovania identity používateľov (autentifikácia) a určuje, čo môžu robiť (autorizácia).
Použitím Entra ID môžete:
- Umožniť bezpečné prihlásenie používateľov.
- Chrániť API a služby.
- Spravovať prístupové politiky z centrálneho miesta.
Pre MCP servery poskytuje Entra ID spoľahlivé a široko dôveryhodné riešenie na správu prístupu k funkciám servera.
Entra ID používa otvorené štandardy ako OAuth 2.0 na spracovanie overovania. Hoci detaily môžu byť zložité, základný koncept je jednoduchý a dá sa vysvetliť pomocou analógie.
Predstavte si OAuth 2.0 ako službu valet parkovania pre vaše auto. Keď prídete do reštaurácie, nedáte valetovi svoj hlavný kľúč. Namiesto toho mu odovzdáte valet kľúč, ktorý má obmedzené oprávnenia – môže naštartovať auto a zamknúť dvere, ale nemôže otvoriť kufor alebo rukavíc.
V tejto analógii:
- Vy ste Používateľ.
- Vaše auto je MCP server s jeho cennými nástrojmi a dátami.
- Valet je Microsoft Entra ID.
- Parkovací pracovník je MCP klient (aplikácia, ktorá sa snaží pristupovať k serveru).
- Valet kľúč je Access Token.
Access token je bezpečný textový reťazec, ktorý MCP klient získa od Entra ID po vašom prihlásení. Klient potom tento token predkladá MCP serveru pri každej požiadavke. Server môže overiť token, aby sa uistil, že požiadavka je legitímna a klient má potrebné oprávnenia, a to bez toho, aby musel pracovať s vašimi skutočnými prihlasovacími údajmi (napríklad heslom).
Takto proces funguje v praxi:
sequenceDiagram
actor User as 👤 User
participant Client as 🖥️ MCP Client
participant Entra as 🔐 Microsoft Entra ID
participant Server as 🔧 MCP Server
Client->>+User: Please sign in to continue.
User->>+Entra: Enters credentials (username/password).
Entra-->>Client: Here is your access token.
User-->>-Client: (Returns to the application)
Client->>+Server: I need to use a tool. Here is my access token.
Server->>+Entra: Is this access token valid?
Entra-->>-Server: Yes, it is.
Server-->>-Client: Token is valid. Here is the result of the tool.
Predtým, než sa pustíme do kódu, je dôležité predstaviť kľúčovú súčasť, ktorú uvidíte v príkladoch: Microsoft Authentication Library (MSAL).
MSAL je knižnica vyvinutá spoločnosťou Microsoft, ktorá vývojárom výrazne uľahčuje spracovanie overovania. Namiesto toho, aby ste museli písať zložitý kód na spracovanie bezpečnostných tokenov, správu prihlásení a obnovovanie relácií, MSAL sa o to postará za vás.
Použitie knižnice ako MSAL je veľmi odporúčané, pretože:
- Je bezpečná: Implementuje štandardné protokoly a osvedčené bezpečnostné postupy, čím znižuje riziko zraniteľností vo vašom kóde.
- Zjednodušuje vývoj: Abstrahuje zložitosť protokolov OAuth 2.0 a OpenID Connect, takže môžete do svojej aplikácie pridať robustné overovanie len niekoľkými riadkami kódu.
- Je udržiavaná: Microsoft ju aktívne aktualizuje, aby riešila nové bezpečnostné hrozby a zmeny platforiem.
MSAL podporuje širokú škálu jazykov a aplikačných rámcov, vrátane .NET, JavaScript/TypeScript, Python, Java, Go a mobilných platforiem ako iOS a Android. To znamená, že môžete používať rovnaké overovacie vzory naprieč celým technologickým stackom.
Viac o MSAL sa dozviete v oficiálnej dokumentácii prehľadu MSAL.
Teraz si prejdeme, ako zabezpečiť lokálny MCP server (ktorý komunikuje cez stdio) pomocou Entra ID. Tento príklad používa verejného klienta, ktorý je vhodný pre aplikácie bežiace na používateľovom počítači, ako je desktopová aplikácia alebo lokálny vývojový server.
V tomto scenári sa pozrieme na MCP server, ktorý beží lokálne, komunikuje cez stdio a používa Entra ID na overenie používateľa pred povolením prístupu k jeho nástrojom. Server bude mať jeden nástroj, ktorý načíta profilové informácie používateľa z Microsoft Graph API.
Pred písaním kódu musíte zaregistrovať svoju aplikáciu v Microsoft Entra ID. Tým oznámite Entra ID, že vaša aplikácia existuje a získate povolenie používať overovaciu službu.
- Prejdite na Microsoft Entra portál.
- Choďte do App registrations a kliknite na New registration.
- Pomenujte svoju aplikáciu (napr. „My Local MCP Server“).
- Pre Supported account types vyberte Accounts in this organizational directory only.
- Pre tento príklad môžete nechať Redirect URI prázdne.
- Kliknite na Register.
Po registrácii si zapíšte Application (client) ID a Directory (tenant) ID. Budete ich potrebovať v kóde.
Pozrime sa na kľúčové časti kódu, ktoré riešia overovanie. Kompletný kód tohto príkladu nájdete v priečinku Entra ID - Local - WAM v repozitári mcp-auth-servers GitHub.
AuthenticationService.cs
Táto trieda je zodpovedná za komunikáciu s Entra ID.
CreateAsync: InicializujePublicClientApplicationz MSAL. Je nakonfigurovaná sclientIdatenantIdvašej aplikácie.WithBroker: Umožňuje použitie brokera (napr. Windows Web Account Manager), ktorý poskytuje bezpečnejší a plynulejší zážitok z jednotného prihlásenia.AcquireTokenAsync: Hlavná metóda. Najskôr sa pokúsi získať token ticho (bez interakcie používateľa, ak už má platnú reláciu). Ak to nie je možné, vyzve používateľa na interaktívne prihlásenie.
// Simplified for clarity
public static async Task<AuthenticationService> CreateAsync(ILogger<AuthenticationService> logger)
{
var msalClient = PublicClientApplicationBuilder
.Create(_clientId) // Your Application (client) ID
.WithAuthority(AadAuthorityAudience.AzureAdMyOrg)
.WithTenantId(_tenantId) // Your Directory (tenant) ID
.WithBroker(new BrokerOptions(BrokerOptions.OperatingSystems.Windows))
.Build();
// ... cache registration ...
return new AuthenticationService(logger, msalClient);
}
public async Task<string> AcquireTokenAsync()
{
try
{
// Try silent authentication first
var accounts = await _msalClient.GetAccountsAsync();
var account = accounts.FirstOrDefault();
AuthenticationResult? result = null;
if (account != null)
{
result = await _msalClient.AcquireTokenSilent(_scopes, account).ExecuteAsync();
}
else
{
// If no account, or silent fails, go interactive
result = await _msalClient.AcquireTokenInteractive(_scopes).ExecuteAsync();
}
return result.AccessToken;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred while acquiring the token.");
throw; // Optionally rethrow the exception for higher-level handling
}
}Program.cs
Tu sa nastavuje MCP server a integruje sa autentifikačná služba.
AddSingleton<AuthenticationService>: RegistrujeAuthenticationServicev kontajneri závislostí, aby ho mohli používať ďalšie časti aplikácie (napríklad náš nástroj).GetUserDetailsFromGraphnástroj: Tento nástroj vyžaduje inštanciuAuthenticationService. Pred vykonaním čohokoľvek zavoláauthService.AcquireTokenAsync(), aby získal platný access token. Ak je overenie úspešné, použije token na volanie Microsoft Graph API a načítanie používateľských údajov.
// Simplified for clarity
[McpServerTool(Name = "GetUserDetailsFromGraph")]
public static async Task<string> GetUserDetailsFromGraph(
AuthenticationService authService)
{
try
{
// This will trigger the authentication flow
var accessToken = await authService.AcquireTokenAsync();
// Use the token to create a GraphServiceClient
var graphClient = new GraphServiceClient(
new BaseBearerTokenAuthenticationProvider(new TokenProvider(authService)));
var user = await graphClient.Me.GetAsync();
return System.Text.Json.JsonSerializer.Serialize(user);
}
catch (Exception ex)
{
return $"Error: {ex.Message}";
}
}- Keď MCP klient chce použiť nástroj
GetUserDetailsFromGraph, nástroj najskôr zavoláAcquireTokenAsync. AcquireTokenAsyncspustí knižnicu MSAL, ktorá skontroluje platný token.- Ak token nie je k dispozícii, MSAL cez brokera vyzve používateľa na prihlásenie pomocou jeho Entra ID účtu.
- Po prihlásení Entra ID vydá access token.
- Nástroj dostane token a použije ho na bezpečné volanie Microsoft Graph API.
- Používateľské údaje sa vrátia MCP klientovi.
Tento proces zabezpečuje, že nástroj môžu používať iba autentifikovaní používatelia, čím efektívne chránite svoj lokálny MCP server.
Keď váš MCP server beží na vzdialenom stroji (napríklad cloudovom serveri) a komunikuje cez protokol ako HTTP Streaming, bezpečnostné požiadavky sú odlišné. V tomto prípade by ste mali použiť dôverného klienta a Authorization Code Flow. Toto je bezpečnejšia metóda, pretože tajomstvá aplikácie sa nikdy neodhalia v prehliadači.
Tento príklad používa MCP server založený na TypeScripte, ktorý používa Express.js na spracovanie HTTP požiadaviek.
Nastavenie v Entra ID je podobné ako pri verejnom klientovi, ale s jedným kľúčovým rozdielom: musíte vytvoriť client secret.
- Prejdite na Microsoft Entra portál.
- Vo vašej registrácii aplikácie choďte na záložku Certificates & secrets.
- Kliknite na New client secret, zadajte popis a kliknite na Add.
- Dôležité: Ihneď si skopírujte hodnotu tajomstva. Už ju nebudete môcť zobraziť znova.
- Tiež musíte nakonfigurovať Redirect URI. Choďte na záložku Authentication, kliknite na Add a platform, vyberte Web a zadajte redirect URI vašej aplikácie (napr.
http://localhost:3001/auth/callback).
⚠️ Dôležitá bezpečnostná poznámka: Pre produkčné aplikácie Microsoft dôrazne odporúča používať overovanie bez tajomstiev ako Managed Identity alebo Workload Identity Federation namiesto client secretov. Client secrety predstavujú bezpečnostné riziko, pretože môžu byť odhalené alebo kompromitované. Managed identity poskytujú bezpečnejší prístup tým, že odstraňujú potrebu uchovávať prihlasovacie údaje v kóde alebo konfigurácii.Viac informácií o managed identities a ich implementácii nájdete v prehľade Managed identities for Azure resources.
Tento príklad používa prístup založený na reláciách. Keď sa používateľ autentifikuje, server uloží access token a refresh token do relácie a poskytne používateľovi session token. Tento session token sa potom používa pri ďalších požiadavkách. Kompletný kód tohto príkladu nájdete v priečinku Entra ID - Confidential client v repozitári mcp-auth-servers GitHub.
Server.ts
Tento súbor nastavuje Express server a MCP transportnú vrstvu.
requireBearerAuth: Middleware, ktorý chráni endpointy/ssea/message. Kontroluje platný bearer token v hlavičkeAuthorizationpožiadavky.EntraIdServerAuthProvider: Vlastná trieda implementujúca rozhranieMcpServerAuthorizationProvider. Zodpovedá za spracovanie OAuth 2.0 toku./auth/callback: Endpoint, ktorý spracováva presmerovanie z Entra ID po autentifikácii používateľa. Vymieňa autorizačný kód za access token a refresh token.
// Simplified for clarity
const app = express();
const { server } = createServer();
const provider = new EntraIdServerAuthProvider();
// Protect the SSE endpoint
app.get("/sse", requireBearerAuth({
provider,
requiredScopes: ["User.Read"]
}), async (req, res) => {
// ... connect to the transport ...
});
// Protect the message endpoint
app.post("/message", requireBearerAuth({
provider,
requiredScopes: ["User.Read"]
}), async (req, res) => {
// ... handle the message ...
});
// Handle the OAuth 2.0 callback
app.get("/auth/callback", (req, res) => {
provider.handleCallback(req.query.code, req.query.state)
.then(result => {
// ... handle success or failure ...
});
});Tools.ts
Tento súbor definuje nástroje, ktoré MCP server poskytuje. Nástroj getUserDetails je podobný tomu z predchádzajúceho príkladu, ale access token získava z relácie.
// Simplified for clarity
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name } = request.params;
const context = request.params?.context as { token?: string } | undefined;
const sessionToken = context?.token;
if (name === ToolName.GET_USER_DETAILS) {
if (!sessionToken) {
throw new AuthenticationError("Authentication token is missing or invalid. Ensure the token is provided in the request context.");
}
// Get the Entra ID token from the session store
const tokenData = tokenStore.getToken(sessionToken);
const entraIdToken = tokenData.accessToken;
const graphClient = Client.init({
authProvider: (done) => {
done(null, entraIdToken);
}
});
const user = await graphClient.api('/me').get();
// ... return user details ...
}
});auth/EntraIdServerAuthProvider.ts
Táto trieda rieši:
- Presmerovanie používateľa na prihlasovaciu stránku Entra ID.
- Výmenu autorizačného kódu za access token.
- Ukladanie tokenov do
tokenStore. - Obnovovanie access tokenu po jeho vypršaní.
- Keď sa používateľ prvýkrát pokúsi pripojiť k MCP serveru, middleware
requireBearerAuthzistí, že nemá platnú reláciu, a presmeruje ho na prihlasovaciu stránku Entra ID. - Používateľ sa prihlási pomocou svojho Entra ID účtu.
- Entra ID presmeruje používateľa späť na endpoint
/auth/callbacks autorizačným kódom. - Server vymení kód za access token a refresh token, uloží ich a vytvorí session token, ktorý odošle klientovi.
- Klient teraz môže použiť tento session token v hlavičke
Authorizationpre všetky budúce požiadavky na MCP server. - Keď sa zavolá nástroj
getUserDetails, použije session token na vyhľadanie Entra ID access tokenu a následne ho použije na volanie Microsoft Graph API.
Tento tok je zložitejší ako tok pre verejného klienta, ale je potrebný pre internetovo prístupné koncové body. Keďže vzdialené MCP servery sú prístupné cez verejný internet, vyžadujú silnejšie bezpečnostné opatrenia na ochranu pred neoprávneným prístupom a potenciálnymi útokmi.
- Vždy používajte HTTPS: Šifrujte komunikáciu medzi klientom a serverom, aby ste ochránili tokeny pred zachytením.
- Implementujte riadenie prístupu na základe rolí (RBAC): Nekontrolujte len či je používateľ autentifikovaný, ale aj čo má oprávnenie robiť. Môžete definovať role v Entra ID a kontrolovať ich na vašom MCP serveri.
- Monitorujte a auditujte: Zaznamenávajte všetky autentifikačné udalosti, aby ste mohli odhaliť a reagovať na podozrivú aktivitu.
- Riešte obmedzovanie rýchlosti a throttling: Microsoft Graph a ďalšie API implementujú obmedzovanie rýchlosti, aby zabránili zneužitiu. Implementujte exponenciálne spätné odklady a logiku opakovaných pokusov vo vašom MCP serveri, aby ste elegantne zvládli odpovede HTTP 429 (Príliš veľa požiadaviek). Zvážte cacheovanie často používaných dát na zníženie počtu volaní API.
- Bezpečné ukladanie tokenov: Ukladajte access tokeny a refresh tokeny bezpečne. Pre lokálne aplikácie používajte systémové mechanizmy bezpečného ukladania. Pre serverové aplikácie zvážte použitie šifrovaného úložiska alebo bezpečných služieb na správu kľúčov, ako je Azure Key Vault.
- Riešenie vypršania platnosti tokenov: Access tokeny majú obmedzenú platnosť. Implementujte automatické obnovenie tokenov pomocou refresh tokenov, aby ste zabezpečili plynulý používateľský zážitok bez potreby opätovnej autentifikácie.
- Zvážte použitie Azure API Management: Hoci implementácia bezpečnosti priamo vo vašom MCP serveri vám poskytuje detailnú kontrolu, API brány ako Azure API Management môžu automaticky riešiť mnohé bezpečnostné aspekty vrátane autentifikácie, autorizácie, obmedzovania rýchlosti a monitorovania. Poskytujú centralizovanú bezpečnostnú vrstvu medzi vašimi klientmi a MCP servermi. Pre viac informácií o používaní API brán s MCP si pozrite náš Azure API Management Your Auth Gateway For MCP Servers.
- Zabezpečenie vášho MCP servera je kľúčové pre ochranu vašich dát a nástrojov.
- Microsoft Entra ID poskytuje robustné a škálovateľné riešenie pre autentifikáciu a autorizáciu.
- Pre lokálne aplikácie používajte verejného klienta a pre vzdialené servery dôverného klienta.
- Authorization Code Flow je najbezpečnejšia možnosť pre webové aplikácie.
- Zamyslite sa nad MCP serverom, ktorý by ste mohli vytvoriť. Bude to lokálny server alebo vzdialený server?
- Na základe vašej odpovede, použijete verejného alebo dôverného klienta?
- Aké oprávnenie by váš MCP server požadoval na vykonávanie akcií voči Microsoft Graph?
Prejdite do portálu Microsoft Entra.
Zaregistrujte novú aplikáciu pre váš MCP server.
Zaznamenajte si Application (client) ID a Directory (tenant) ID.
- Postupujte podľa príkladu kódu na integráciu MSAL (Microsoft Authentication Library) pre autentifikáciu používateľa.
- Otestujte autentifikačný tok zavolaním MCP nástroja, ktorý získava detaily používateľa z Microsoft Graph.
- Zaregistrujte dôverného klienta v Entra ID a vytvorte klientský tajný kľúč.
- Nakonfigurujte váš Express.js MCP server na použitie Authorization Code Flow.
- Otestujte chránené koncové body a potvrďte prístup na základe tokenu.
- Povoliť HTTPS pre váš lokálny alebo vzdialený server.
- Implementovať riadenie prístupu na základe rolí (RBAC) v logike servera.
- Pridať riešenie vypršania platnosti tokenov a bezpečné ukladanie tokenov.
-
MSAL Prehľad dokumentácie
Naučte sa, ako Microsoft Authentication Library (MSAL) umožňuje bezpečné získavanie tokenov naprieč platformami:
MSAL Overview on Microsoft Learn -
Azure-Samples/mcp-auth-servers GitHub repozitár
Referenčné implementácie MCP serverov demonštrujúce autentifikačné toky:
Azure-Samples/mcp-auth-servers on GitHub -
Prehľad Managed Identities pre Azure Resources
Pochopte, ako eliminovať tajomstvá použitím systémových alebo používateľom priradených spravovaných identít:
Managed Identities Overview on Microsoft Learn -
Azure API Management: Vaša autentifikačná brána pre MCP servery
Hlbší pohľad na použitie APIM ako bezpečnej OAuth2 brány pre MCP servery:
Azure API Management Your Auth Gateway For MCP Servers -
Referenčný zoznam oprávnení Microsoft Graph
Komplexný zoznam delegovaných a aplikačných oprávnení pre Microsoft Graph:
Microsoft Graph Permissions Reference
Po dokončení tejto časti budete schopní:
- Vysvetliť, prečo je autentifikácia kritická pre MCP servery a AI pracovné toky.
- Nastaviť a nakonfigurovať autentifikáciu Entra ID pre lokálne aj vzdialené MCP servery.
- Vybrať vhodný typ klienta (verejný alebo dôverný) podľa nasadenia servera.
- Implementovať bezpečné programovacie postupy vrátane ukladania tokenov a autorizácie na základe rolí.
- Sebavedome chrániť váš MCP server a jeho nástroje pred neoprávneným prístupom.
Vyhlásenie o zodpovednosti:
Tento dokument bol preložený pomocou AI prekladateľskej služby Co-op Translator. Hoci sa snažíme o presnosť, prosím, majte na pamäti, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Originálny dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.