25 KiB
Zabezpečení AI pracovních postupů: Ověřování Entra ID pro servery Model Context Protocol
Úvod
Zabezpečení vašeho serveru Model Context Protocol (MCP) je stejně důležité jako zamčení vstupních dveří vašeho domu. Nechat váš server MCP otevřený vystavuje vaše nástroje a data neoprávněnému přístupu, což může vést k narušení bezpečnosti. Microsoft Entra ID poskytuje robustní cloudové řešení pro správu identity a přístupu, které pomáhá zajistit, že pouze autorizovaní uživatelé a aplikace mohou komunikovat s vaším serverem MCP. V této části se naučíte, jak chránit své AI pracovní postupy pomocí ověřování Entra ID.
Výukové cíle
Na konci této části budete schopni:
- Pochopit význam zabezpečení serverů MCP.
- Vysvětlit základy Microsoft Entra ID a ověřování OAuth 2.0.
- Rozpoznat rozdíl mezi veřejnými a důvěrnými klienty.
- Implementovat ověřování Entra ID v lokálních (veřejný klient) a vzdálených (důvěrný klient) scénářích serverů MCP.
- Používat osvědčené bezpečnostní postupy při vývoji AI pracovních postupů.
Bezpečnost a MCP
Stejně jako byste nenechali otevřené přední dveře svého domu, neměli byste nechat svůj server MCP otevřený pro kohokoli. Zabezpečení vašich AI pracovních postupů je nezbytné pro tvorbu robustních, důvěryhodných a bezpečných aplikací. Tato kapitola vám představí použití Microsoft Entra ID k zabezpečení vašich serverů MCP tak, aby mohli s vašimi nástroji a daty pracovat pouze autorizovaní uživatelé a aplikace.
Proč je bezpečnost důležitá pro servery MCP
Představte si, že váš server MCP má nástroj, který může odesílat e-maily nebo přistupovat k databázi zákazníků. Nezabezpečený server by znamenal, že kdokoli by mohl tento nástroj použít, což by vedlo k neoprávněnému přístupu k datům, spamu nebo dalším škodlivým aktivitám.
Implementací ověřování zajistíte, že každý požadavek na váš server je ověřen a potvrzuje totožnost uživatele nebo aplikace, která požadavek posílá. To je první a nejdůležitější krok k zabezpečení vašich AI pracovních postupů.
Úvod do Microsoft Entra ID
Microsoft Entra ID je cloudová služba pro správu identity a přístupu. Představte si ji jako univerzálního bezpečnostního hlídače pro vaše aplikace. Zpracovává složitý proces ověřování identity uživatelů a určení toho, co mohou dělat (autorizace).
Používáním Entra ID můžete:
- Umožnit bezpečné přihlašování uživatelům.
- Chránit API a služby.
- Spravovat přístupové politiky z jednoho centrálního místa.
Pro servery MCP poskytuje Entra ID robustní a široce důvěryhodné řešení pro správu přístupu k možnostem vašeho serveru.
Jak funguje kouzlo: Princip ověřování Entra ID
Entra ID využívá otevřené standardy, jako je OAuth 2.0, pro zpracování ověřování. Přestože detaily mohou být složité, základní koncept je jednoduchý a lze jej pochopit pomocí analogie.
Jemný úvod do OAuth 2.0: Klíč pro odvoz
Představte si OAuth 2.0 jako službu parkování vašeho auta. Když přijedete do restaurace, neodevzdáte parkovacímu svůj hlavní klíč. Místo toho mu dáte klíč pro odvoz, který má omezená oprávnění - může nastartovat auto a zamknout dveře, ale nemůže otevřít kufr nebo přihrádku.
V této analogii:
- Vy jste Uživatel.
- Vaše auto je server MCP s jeho cennými nástroji a daty.
- Parkovací služba je Microsoft Entra ID.
- Parkovací asistent je MCP klient (aplikace, která se pokouší přistoupit k serveru).
- Klíč pro odvoz je přístupový token.
Přístupový token je bezpečný řetězec textu, který MCP klient získá od Entra ID poté, co se přihlásíte. Klient pak tento token předkládá serveru MCP u každého požadavku. Server může token ověřit, aby zajistil, že požadavek je legitimní a že klient má potřebná oprávnění, to vše bez nutnosti zacházet s vašimi skutečnými přihlašovacími údaji (například heslem).
Průběh ověřování
Takto proces funguje v praxi:
sequenceDiagram
actor User as 👤 Uživatelský
participant Client as 🖥️ MCP Klient
participant Entra as 🔐 Microsoft Entra ID
participant Server as 🔧 MCP Server
Client->>+User: Prosím přihlaste se pro pokračování.
User->>+Entra: Zadává přihlašovací údaje (uživatelské jméno/heslo).
Entra-->>Client: Zde je váš přístupový token.
User-->>-Client: (Vrací se do aplikace)
Client->>+Server: Potřebuji použít nástroj. Zde je můj přístupový token.
Server->>+Entra: Je tento přístupový token platný?
Entra-->>-Server: Ano, je platný.
Server-->>-Client: Token je platný. Zde je výsledek nástroje.
Představení Microsoft Authentication Library (MSAL)
Než přejdeme ke kódu, je důležité představit klíčovou komponentu, kterou v příkladech uvidíte: Microsoft Authentication Library (MSAL).
MSAL je knihovna vyvinutá Microsoftem, která vývojářům výrazně usnadňuje zpracování ověřování. Místo toho, abyste museli psát veškerý složitý kód pro správu bezpečnostních tokenů, přihlašování a obnovování relací, se MSAL postará o veškerou náročnou práci.
Použití knihovny MSAL je velmi doporučeno, protože:
- Je bezpečná: Implementuje průmyslové standardy a osvědčené bezpečnostní postupy, čímž snižuje riziko zranitelností ve vašem kódu.
- Zjednodušuje vývoj: Abstrahuje složitost protokolů OAuth 2.0 a OpenID Connect, což vám umožní přidat robustní ověřování do vaší aplikace jen několika řádky kódu.
- Je udržovaná: Microsoft aktivně udržuje a aktualizuje MSAL, aby řešil nové bezpečnostní hrozby a změny platforem.
MSAL podporuje širokou škálu jazyků a aplikačních frameworků, včetně .NET, JavaScript/TypeScript, Python, Java, Go a mobilních platforem jako iOS a Android. To znamená, že můžete používat konzistentní ověřovací vzory v celém svém technologickém stacku.
Více o MSAL se dozvíte v oficiální MSAL přehledové dokumentaci.
Zabezpečení vašeho MCP serveru pomocí Entra ID: Krok za krokem
Nyní si projdeme, jak zabezpečit lokální server MCP (který komunikuje přes stdio) pomocí Entra ID. Tento příklad používá veřejného klienta, což je vhodné pro aplikace běžící na uživatelově počítači, jako je desktopová aplikace nebo lokální vývojový server.
Scénář 1: Zabezpečení lokálního serveru MCP (s veřejným klientem)
V tomto scénáři se podíváme na MCP server, který běží lokálně, komunikuje přes stdio a používá Entra ID k ověření uživatele před udělením přístupu k jeho nástrojům. Server bude mít jediný nástroj, který získá informace o uživatelském profilu z Microsoft Graph API.
1. Nastavení aplikace v Entra ID
Než začnete psát kód, musíte zaregistrovat svou aplikaci v Microsoft Entra ID. Tím dáte Entra ID vědět o vaší aplikaci a poskytnete jí oprávnění používat službu ověřování.
- Přejděte na Microsoft Entra portál.
- V sekci Registrace aplikací klikněte na Nová registrace.
- Pojmenujte svou aplikaci (např. „Můj lokální MCP server“).
- U Podporované typy účtů vyberte Účty pouze v této organizační složce.
- Pole Přesměrovací URI můžete pro tento příklad nechat prázdné.
- Klikněte na Registrovat.
Po registraci si poznamenejte ID aplikace (klienta) a ID adresáře (tenant). Budete je potřebovat v kódu.
2. Rozbor kódu
Podívejme se na klíčové části kódu, které zpracovávají ověřování. Kompletní kód tohoto příkladu je dostupný ve složce Entra ID - Local - WAM v repozitáři mcp-auth-servers na GitHubu.
AuthenticationService.cs
Tato třída zajišťuje komunikaci s Entra ID.
CreateAsync: Tento metod inicializujePublicClientApplicationz MSAL. Je nakonfigurován sclientIdatenantIdvaší aplikace.WithBroker: Umožňuje použití brokera (například Windows Web Account Manager), který poskytuje bezpečnější a plynulejší zážitek jednoho přihlášení.AcquireTokenAsync: Jde o hlavní metodu. Nejprve se snaží získat token potichu (uživatel se nemusí znovu přihlašovat, pokud již má platnou relaci). Pokud není možné získat token potichu, vyzve uživatele k interaktivnímu přihlášení.
// 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
Zde je nastaven server MCP a integrována služba ověřování.
AddSingleton<AuthenticationService>: RegistrujeAuthenticationServicedo kontejneru závislostí, aby jej mohly používat další části aplikace (například náš nástroj).- Nástroj
GetUserDetailsFromGraph: Tento nástroj potřebuje instanciAuthenticationService. Před jakoukoli činností zavoláauthService.AcquireTokenAsync()a získá platný přístupový token. Pokud je ověřování úspěšné, použije token k volání Microsoft Graph API a získání informací o uživateli.
// 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}";
}
}
3. Jak to celé funguje společně
- Když se MCP klient pokusí použít nástroj
GetUserDetailsFromGraph, nejdříve zavoláAcquireTokenAsync. AcquireTokenAsyncvyvolá knihovnu MSAL, která zkontroluje existenci platného tokenu.- Pokud žádný token není, MSAL přes brokera vyzve uživatele k přihlášení přes účet Entra ID.
- Po přihlášení vydá Entra ID přístupový token.
- Nástroj token přijme a použije ho k zabezpečenému volání Microsoft Graph API.
- Informace o uživateli jsou vráceny MCP klientovi.
Tento proces zajišťuje, že nástroj může používat pouze ověření uživatelé, čímž je váš lokální server MCP účinně zabezpečen.
Scénář 2: Zabezpečení vzdáleného serveru MCP (s důvěrným klientem)
Pokud váš server MCP běží na vzdáleném stroji (například na cloudovém serveru) a komunikuje přes protokol jako HTTP Streaming, bezpečnostní požadavky jsou jiné. V tomto případě byste měli použít důvěrného klienta a Authorization Code Flow. Toto je bezpečnější metoda, protože tajemství aplikace nejsou nikdy vystavena v prohlížeči.
Tento příklad používá server MCP založený na TypeScriptu, který používá Express.js pro zpracování HTTP požadavků.
1. Nastavení aplikace v Entra ID
Nastavení v Entra ID je podobné jako u veřejného klienta, ale s jedním klíčovým rozdílem: je nutné vytvořit klientské tajemství.
- Přejděte na Microsoft Entra portál.
- Ve vaší registraci aplikace přejděte na záložku Certifikáty a tajemství.
- Klikněte na Nové klientské tajemství, popište ho a klikněte na Přidat.
- Důležité: Okamžitě si zkopírujte hodnotu tajemství. Nebude již znovu zobrazena.
- Také musíte nakonfigurovat přesměrovací URI. Přejděte na záložku Ověřování, klikněte na Přidat platformu, vyberte Web a zadejte přesměrovací URI pro vaši aplikaci (např.
http://localhost:3001/auth/callback).
⚠️ Důležité bezpečnostní upozornění: Pro produkční aplikace Microsoft důrazně doporučuje používat ověřování bez tajemství jako spravované identity nebo federaci identit pracovních zatížení místo klientských tajemství. Klientská tajemství představují bezpečnostní riziko, protože mohou být vystavena nebo kompromitována. Spravované identity poskytují bezpečnější přístup tím, že eliminují potřebu ukládat přihlašovací údaje ve vašem kódu nebo konfiguraci.
Více informací o spravovaných identitách a jejich implementaci naleznete v přehledu Spravované identity pro prostředky Azure.
2. Rozbor kódu
Tento příklad používá přístup založený na relacích. Když se uživatel ověří, server uloží přístupový token a obnovovací token do relace a dá uživateli token relace. Tento token relace je pak používán u následných požadavků. Kompletní kód tohoto příkladu je dostupný ve složce Entra ID - Confidential client v repozitáři mcp-auth-servers na GitHubu.
Server.ts
Tento soubor nastavuje Express server a přenosovou vrstvu MCP.
requireBearerAuth: Toto je middleware, který chrání endpointy/ssea/message. Kontroluje, zda je v hlavičceAuthorizationplatný bearer token.EntraIdServerAuthProvider: Toto je vlastní třída, která implementuje rozhraníMcpServerAuthorizationProvider. Zodpovídá za zpracování OAuth 2.0 flow./auth/callback: Tento endpoint zpracovává přesměrování z Entra ID po přihlášení uživatele. Vymění autorizační kód za přístupový a obnovovací token.
// Zjednodušeno pro přehlednost
const app = express();
const { server } = createServer();
const provider = new EntraIdServerAuthProvider();
// Chraňte SSE koncový bod
app.get("/sse", requireBearerAuth({
provider,
requiredScopes: ["User.Read"]
}), async (req, res) => {
// ... připojit se k transportu ...
});
// Chraňte koncový bod zprávy
app.post("/message", requireBearerAuth({
provider,
requiredScopes: ["User.Read"]
}), async (req, res) => {
// ... zpracovat zprávu ...
});
// Zpracovat OAuth 2.0 callback
app.get("/auth/callback", (req, res) => {
provider.handleCallback(req.query.code, req.query.state)
.then(result => {
// ... zpracovat úspěch nebo neúspěch ...
});
});
Tools.ts
Tento soubor definuje nástroje, které server MCP poskytuje. Nástroj getUserDetails je podobný tomu z předchozího příkladu, ale přístupový token získává ze session.
// Zjednodušeno pro přehlednost
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.");
}
// Získejte token Entra ID ze zásobníku relace
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();
// ... vraťte podrobnosti uživatele ...
}
});
auth/EntraIdServerAuthProvider.ts
Tato třída zajišťuje logiku pro:
- Přesměrování uživatele na přihlašovací stránku Entra ID.
- Výměnu autorizačního kódu za přístupový token.
- Ukládání tokenů do
tokenStore. - Obnovování přístupového tokenu, když vyprší jeho platnost.
3. Jak to celé funguje společně
- Když se uživatel poprvé pokusí připojit k serveru MCP, middleware
requireBearerAuthzjistí, že nemá platnou relaci, a přesměruje ho na přihlašovací stránku Entra ID. - Uživatel se přihlásí svým účtem Entra ID.
- Entra ID přesměruje uživatele zpět na koncový bod
/auth/callbacks autorizačním kódem. - Server vymění kód za přístupový token a obnovovací token, uloží je a vytvoří token relace, který je odeslán klientovi.
- Klient nyní může použít tento token relace v hlavičce
Authorizationpro všechny budoucí požadavky na MCP server. - Když se zavolá nástroj
getUserDetails, použije token relace k nalezení přístupového tokenu Entra ID a poté jej použije k volání Microsoft Graph API.
Tento tok je složitější než tok veřejného klienta, ale je vyžadován pro internetově přístupné koncové body. Jelikož jsou vzdálené MCP servery přístupné přes veřejný internet, potřebují silnější bezpečnostní opatření k ochraně před neoprávněným přístupem a potenciálními útoky.
Bezpečnostní osvědčené postupy
- Vždy používejte HTTPS: Šifrujte komunikaci mezi klientem a serverem, aby byly tokeny chráněné před zachycením.
- Implementujte řízení přístupu založené na rolích (RBAC): Neověřujte pouze zda je uživatel autentizován; ověřte co je oprávněn dělat. Role můžete definovat v Entra ID a kontrolovat je na vašem MCP serveru.
- Sledujte a auditujte: Logujte všechny autentizační události, abyste mohli detekovat a reagovat na podezřelé aktivity.
- Zpracovávejte omezení počtu požadavků a zpomalování: Microsoft Graph a další API implementují omezení počtu požadavků pro prevenci zneužití. Implementujte exponenciální zpětný odstup a logiku opakování v MCP serveru, aby se elegantně zpracovaly odpovědi HTTP 429 (Too Many Requests). Zvažte ukládání často přistupovaných dat do cache ke snížení počtu volání API.
- Bezpečné uložení tokenů: Ukládejte přístupové a obnovovací tokeny bezpečně. U lokálních aplikací využijte bezpečnostní mechanismy systému. Pro serverové aplikace zvažte šifrované úložiště nebo služby pro správu klíčů, jako je Azure Key Vault.
- Zpracování vypršení platnosti tokenu: Přístupové tokeny mají omezenou životnost. Implementujte automatické obnovování tokenů pomocí obnovovacích tokenů, aby uživatel nemusel při vypršení platnosti znovu provádět autentizaci.
- Zvažte použití Azure API Management: Ačkoliv implementace zabezpečení přímo ve vašem MCP serveru poskytuje jemnozrnnou kontrolu, API brány jako Azure API Management mohou automaticky řešit mnohé bezpečnostní aspekty, včetně autentizace, autorizace, omezení počtu požadavků a monitoringu. Poskytují centralizovanou bezpečnostní vrstvu mezi vašimi klienty a MCP servery. Další informace o použití API bran s MCP najdete v našem článku Azure API Management Your Auth Gateway For MCP Servers.
Klíčová shrnutí
- Zabezpečení vašeho MCP serveru je klíčové pro ochranu vašich dat a nástrojů.
- Microsoft Entra ID poskytuje robustní a škálovatelné řešení pro autentizaci a autorizaci.
- Použijte veřejného klienta pro lokální aplikace a důvěrného klienta pro vzdálené servery.
- Autorizovaný tok pomocí kódu (Authorization Code Flow) je nejbezpečnější volba pro webové aplikace.
Cvičení
- Zamyslete se nad MCP serverem, který byste mohli vytvořit. Bude to lokální server nebo vzdálený server?
- Na základě vaší odpovědi, použijete veřejného klienta nebo důvěrného klienta?
- Jaké oprávnění by váš MCP server požadoval pro provádění akcí vůči Microsoft Graph?
Praktická cvičení
Cvičení 1: Registrace aplikace v Entra ID
Přejděte do portálu Microsoft Entra. Zaregistrujte novou aplikaci pro váš MCP server. Zaznamenejte si ID aplikace (klienta) a ID adresáře (nájemce).
Cvičení 2: Zabezpečení lokálního MCP serveru (veřejný klient)
- Postupujte podle příkladu kódu pro integraci MSAL (Microsoft Authentication Library) pro autentizaci uživatele.
- Otestujte autentizační tok zavoláním MCP nástroje, který získá podrobnosti o uživateli z Microsoft Graph.
Cvičení 3: Zabezpečení vzdáleného MCP serveru (důvěrný klient)
- Zaregistrujte důvěrného klienta v Entra ID a vytvořte klientské tajemství.
- Nakonfigurujte váš Express.js MCP server pro použití autorizovaného toku pomocí kódu.
- Otestujte chráněné koncové body a potvrďte přístup založený na tokenech.
Cvičení 4: Uplatnění bezpečnostních osvědčených postupů
- Povolení HTTPS pro váš lokální nebo vzdálený server.
- Implementujte řízení přístupu založené na rolích (RBAC) v logice serveru.
- Přidejte zpracování vypršení platnosti tokenů a bezpečné uložení tokenů.
Zdroje
-
Dokumentace přehledu MSAL
Naučte se, jak Microsoft Authentication Library (MSAL) umožňuje bezpečné získávání tokenů napříč platformami:
MSAL Overview on Microsoft Learn -
GitHub repozitář Azure-Samples/mcp-auth-servers
Referenční implementace MCP serverů ukazující autentizační toky:
Azure-Samples/mcp-auth-servers on GitHub -
Přehled Managed Identities pro Azure Resources
Pochopte, jak eliminovat tajemství použitím spravovaných identit přiřazených k systému nebo uživateli:
Managed Identities Overview on Microsoft Learn -
Azure API Management: Váš autentizační gateway pro MCP servery
Podrobný pohled na použití APIM jako zabezpečené OAuth2 brány pro MCP servery:
Azure API Management Your Auth Gateway For MCP Servers -
Referenční přehled oprávnění Microsoft Graph
Kompletní seznam delegovaných a aplikačních oprávnění pro Microsoft Graph:
Microsoft Graph Permissions Reference
Výsledky učení
Po dokončení této sekce budete schopni:
- Vysvětlit, proč je autentizace klíčová pro MCP servery a AI pracovní postupy.
- Nastavit a nakonfigurovat autentizaci Entra ID pro scénáře lokálních i vzdálených MCP serverů.
- Vybrat vhodný typ klienta (veřejný nebo důvěrný) podle nasazení serveru.
- Implementovat bezpečné programátorské praktiky, včetně uložení tokenů a autorizace na základě rolí.
- S jistotou chránit váš MCP server a jeho nástroje před neoprávněným přístupem.
Co bude dál
Prohlášení o omezení odpovědnosti: Tento dokument byl přeložen pomocí AI překladatelské služby Co-op Translator. Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.