Secrets, identitet och runtime

Identitet för arbetslaster

Så kan tjänster identifiera sig utan statiska lösenord, kopierade nycklar eller maskinbunden tillit.

Arbetsbelastningsidentitet är praxis att tilldela en verifierbar, kryptografiskt bunden identitet till varje körande tjänst eller jobb istället för att förlita sig på delade uppgifter. Detta gör att infrastrukturen själv kan bevisa vem en arbetsbelastning är, vilket eliminerar behovet av att distribuera och hantera långläftade hemligheter.

Lärandemål

Det här ska du kunna efter genomläsning.
  • Förklara hur tjänstekonton och arbetslastidentitet minskar spridningen av hemligheter.
  • Beskriva hur federation och OIDC gör det möjligt för externa system att få åtkomst till molnet.
  • Känna igen varför minsta möjliga behörighet och kortlivade uppgifter behöver fungera tillsammans.

I korthet

En snabb mental modell innan du går på djupet.
Identitetskälla
  • Tjänstekonton
  • Arbetslastidentitet
  • Tillitsgräns
Tillitsbrygga
  • Federation
  • OIDC i molnet
  • Tokenutbyte
Säkerhetsutfall
  • Kortlivade uppgifter
  • Minsta möjliga behörighet
  • Spårbarhet

Varför arbetsbelastningsidentitet är viktigt

Traditionell tjänsteautentisering bygger på delade hemligheter. En tjänst ges ett användarnamn och lösenord, API-nyckel eller statisk token för att autentisera sig mot andra tjänster. Dessa långlivade uppgifter måste lagras på ett ställe som är tillgängligt för tjänsten, distribueras till varje miljö och roteras manuellt. Varje steg är en potentiell felpunkt som leder till exponering av uppgifter.

Arbetsbelastningsidentitet löser detta genom att tilldela en kryptografiskt verifierbar identitet till varje arbetsbelastning baserat på dess position i infrastrukturen snarare än på en hemlighet den innehar. En pod i Kubernetes, en funktion i AWS Lambda eller en virtuell dator i GCP kan bevisa sin identitet för andra tjänster genom att presentera en token utfärdad av själva plattformen.

Säkerhetsfördelen är betydande. Det finns ingen långlivad uppgift att stjäla, rotera eller oavsiktligt checka in i källkodshantering. Arbetsbelastningsidentitetstokens är korttidslivade, kopplade till den specifika arbetsbelastningen och verifierbara av alla tjänster som litar på den utfärdande myndigheten. Att kompromissa en token ger bara åtkomst tills den löper ut.

Molnleverantörers arbetsbelastningsidentiteter

Varje stor molnleverantör erbjuder arbetsbelastningsidentitet. AWS IAM-roller för EC2, ECS och Lambda tillåter arbetsbelastningar att anta en roll och ta emot temporära STS-uppgifter via instansmetadatatjänsten (IMDS). Azure Managed Identities tilldelar ett tjänsteprincipal till en VM, container eller funktion. GCP-tjänstkonton bundna till instanser tar emot tokens via GCP-metadataservern.

Mekanismen är konsekvent mellan leverantörer. Arbetsbelastningen gör en lokal HTTP-förfrågan till metadataendpointen (tillgänglig bara inifrån beräkningsresursen), tar emot en kortlivad token och presenterar den token till moln-API:er. Molnleverantören validerar token mot arbetsbelastningens tilldelade identitet och utvärderar om identitetens policyer tillåter den begärda åtgärden.

IMDS-endpoints attackyta är ett bekymmer. Om en SSRF-sårbarhet i applikationen tillåter en angripare att göra förfrågningar till metadatatjänsten kan de stjäla den aktuella token. Åtgärder inkluderar att kräva IMDSv2 (som använder ett sessionsbaserat protokoll som är svårare att utnyttja via SSRF) och strikta nätverkspolicyer.

Kubernetes arbetsbelastningsidentitet

Kubernetes utfärdar en ServiceAccount-token till varje pod vid start. Moderna Kubernetes-versioner stöder projicerade tjänstekontotokens med konfigurerbara målgrupper och TTL:er, vilket ersätter äldre tokens som var långlivade och saknade målgruppsbegränsning. Dessa tokens tillåter pods att autentisera sig mot Kubernetes API-servern.

För att autentisera sig mot externa molntjänster använder Kubernetes-kluster federation av arbetsbelastningsidentitet. AWS EKS stöder IAM Roles for Service Accounts (IRSA), som mappar ett Kubernetes ServiceAccount till en AWS IAM-roll. Pods projicerade token utbyts mot temporära AWS STS-uppgifter. GCP GKE och Azure AKS har motsvarande mekanismer.

Att använda arbetsbelastningsidentitet korrekt i Kubernetes kräver att varje driftsättning binds till ett dedikerat ServiceAccount, att det ServiceAccount binds till en IAM-roll med bara de behörigheter arbetsbelastningen behöver, och att inte använda standardtjänstkontot (som delas av alla pods i namnrymden). Många säkerhetsincidenter som involverar Kubernetes-arbetsbelastningar kan spåras tillbaka till alltför privilegierade standardtjänstkonton.

SPIFFE och SPIRE

SPIFFE (Secure Production Identity Framework for Everyone) är en öppen standard för arbetsbelastningsidentitet som fungerar över moln, on-premises och hybridmiljöer. Den definierar ett URI-baserat identitetsformat (SPIFFE ID) och två dokumenttyper. X.509 SVIDs (certifikat) och JWT SVIDs (JSON Web Tokens). Alla tjänster som förstår SPIFFE kan verifiera identiteten hos en annan SPIFFE-aktiverad arbetsbelastning oavsett var den körs.

SPIRE (SPIFFE Runtime Environment) är referensimplementationen av SPIFFE-standarden. Den består av en SPIRE Server (som fungerar som certifikatmyndighet) och SPIRE Agents (som körs på varje nod och attesterar arbetsbelastningsidentitet med nodnivåselektorer). Agenter levererar SVIDs till arbetsbelastningar via en Unix-domänsocket.

Värdet av SPIFFE/SPIRE är enhetlig arbetsbelastningsidentitet i heterogena miljöer. En arbetsbelastning som körs i Kubernetes på AWS kan presentera samma SPIFFE-identitet för en tjänst som körs på bare metal i ett datacenter, vilket möjliggör mTLS-autentisering utan delade hemligheter eller förtillhandahållna certifikat.

Tjänstnätsidentitet

Tjänstnät som Istio och Linkerd använder mutual TLS (mTLS) för att autentisera arbetsbelastningar mot varandra på nätverksnivå. Varje sidecar-proxy utfärdas ett certifikat av nätverkets certifikatmyndighet, vanligtvis ett SPIFFE X.509 SVID. När två tjänster kommunicerar utför deras sidecars ett ömsesidigt TLS-handshake och verifierar varandras certifikat.

Certifikaten roteras automatiskt av nätverkets kontrollplan, vanligtvis på timmar eller dagar, utan applikationsnivåinblandning. Detta innebär att tjänst-till-tjänst-autentisering är kontinuerlig och baserad på kortlivade uppgifter utan att någon utvecklare behöver hantera certifikatfiler eller hemlighetslotation.

Tjänstnätsidentitet möjliggör finkorniga auktoriseringspolicyer. Tjänster kan deklarera exakt vilka andra tjänster som tillåts anropa dem, baserat på identitet, inte nätverksadress. Detta är mycket mer robust än nätverksbaserade kontroller eftersom det förblir korrekt även om nätverkssegmentering är felkonfigurerad.

Signaler att bevaka

Mönster som är värda att undersöka vidare.
  • Applikationer använder manuellt kopierade accessnycklar eller delade lösenord för tjänster.
  • Molnroller är bredare än vad arbetslasten behöver för att utföra sitt jobb.
  • En komprometterad värd eller pipeline kan återanvända samma identitet långt utanför sitt avsedda syfte.

FÖRDJUPNING

Tjänstkonton

Ett tjänstkonto är en icke-mänsklig identitet som används av en applikation, tjänst eller automatiserad process för att autentisera sig mot andra tjänster och API:er. Till skillnad från användarkonton hanteras tjänstkonton programmatiskt, är kopplade till en arbetsbelastning snarare än en person, och i moderna system kräver de inte ett lagrat lösenord.

I traditionella miljöer var tjänstkonton associerade med långlivade lösenord eller API-nycklar lagrade i konfigurationsfiler eller miljövariabler. Detta skapade betydande säkerhetsrisk. Uppgifterna var statiska, delades ofta över flera tjänster och miljöer, var svåra att rotera utan att orsaka driftstopp och glömdes lätt i källkod.

I moln- och Kubernetes-miljöer har tjänstkonton utvecklats till att vara lösenordsfria. Molnhanterade tjänstkonton (AWS IAM-roller, GCP-tjänstkonton, Azure Managed Identities) fungerar genom plattformsbaserade mekanismer. Molnplattformen attesterar att en beräkningsresurs körs med en viss identitet och tillhandahåller automatiskt kortlivade uppgifter.

Det vanligaste misstaget med tjänstkonton är att ge dem alltför stora behörigheter. Ett tjänstkonto för en skrivskyddad rapporteringstjänst bör inte ha skrivbehörighet till produktionsdatabasen. Att följa principen om minsta behörighet strikt innebär att skapa ett dedikerat tjänstkonto för varje arbetsbelastning med exakt de behörigheter arbetsbelastningen kräver.

Arbetsbelastningsidentitet

Arbetsbelastningsidentitet är konceptet att tilldela en unik, verifierbar, kryptografiskt stödd identitet till varje körande arbetsbelastning (applikation, tjänst, container eller jobb), snarare än till en person. Denna identitet härleds från egenskaper hos arbetsbelastningens körningsmiljö och attesteras av en betrodd myndighet som molnleverantören eller Kubernetes kontrollplan.

Den viktigaste distinktionen från traditionella tjänstkonton är att arbetsbelastningsidentitet inte bygger på en hemlighet som arbetsbelastningen innehar. En pod som körs i ett specifikt Kubernetes-namnrum med ett specifikt ServiceAccount får en identitet för att Kubernetes API-servern attesterar det faktum och utfärdar en signerad token. Ingen uppgift lagras, identiteten är en egenskap hos driftsättningen.

Tokens för arbetsbelastningsidentitet följer ett gemensamt mönster. Den betrodda myndigheten utfärdar en signerad JSON Web Token (JWT) med anspråk som beskriver arbetsbelastningen. Arbetsbelastningen presenterar denna token för andra tjänster, som validerar signaturen med myndighetens publicerade publika nycklar. Eftersom token är kortlivad och bunden till specifika anspråk kan den inte återanvändas av en angripare efter utgångstiden.

Arbetsbelastningsidentitet är grundläggande för zero trust-arkitekturer. När varje tjänst kryptografiskt kan bevisa sin identitet kan åtkomstkontrollbeslut baseras på 'vilken tjänst gör detta anrop' snarare än 'vilken nätverksadress anropar'. Detta möjliggör säker tjänst-till-tjänst-kommunikation även i platta, delade nätverk.

Federation

Identitetsfederation är mekanismen som gör det möjligt för en arbetsbelastning att presentera en identitet från ett system (som Kubernetes eller GitHub Actions) och utbyta den mot uppgifter i ett annat system (som AWS eller GCP), utan att källsystemet behöver lagra några långlivade uppgifter från målsystemet. Federation bygger på ömsesidigt förtroende.

Det vanligaste federationsmönstret i DevSecOps är CI/CD-pipeline till molnleverantör. Ett GitHub Actions-arbetsflöde autentiserar sig mot AWS med OIDC-federation utan att lagra några AWS-uppgifter i GitHub. Arbetsflödet begär en GitHub-utfärdad OIDC-token, presenterar den för AWS STS och tar emot temporära AWS-uppgifter giltiga under jobbets varaktighet.

Federation bygger på öppna standarder. OIDC (OpenID Connect) och SAML är de två dominerande federationsprotokollen. OIDC föredras för modern arbetsbelastningsidentitet eftersom det använder kompakta JWT:er och stöds native av alla stora molnleverantörer och CI/CD-plattformar.

Ett vanligt misstag är att ange alltför breda förtroendekonditioner i federationspolicyer. När man konfigurerar GitHub OIDC-federation med AWS bör team begränsa förtroendet till specifika reposiotorer, specifika grenar och specifika miljöer. En policy som litar på vilket arbetsflöde som helst från vilket repository som helst i en GitHub-organisation innebär att alla bidragsgivare kan få molnuppgifter.

OIDC i molnet

OpenID Connect (OIDC) är ett identitetslager byggt ovanpå OAuth 2.0. I sammanhanget av molnarbetsbelastningsidentitet gör OIDC det möjligt för arbetsbelastningar att autentisera sig mot molntjänster genom att presentera en signerad JWT utfärdad av en betrodd identitetsleverantör (Kubernetes API-servern, GitHub Actions, CircleCI, etc.) och utbyta den mot molnbaserade temporära uppgifter.

Utbytet fungerar på följande sätt. Arbetsbelastningen begär en token från sin lokala OIDC-leverantör, presenterar denna token för molnleverantörens Security Token Service (STS), och molnleverantören validerar tokens signatur med OIDC-leverantörens publicerade publika nycklar. Om giltig utfärdar molnleverantören temporära uppgifter kopplade till den mappade IAM-rollen.

OIDC-tokens bär strukturerade anspråk som beskriver arbetsbelastningen. En Kubernetes pod-token bär anspråk för namnrymden, tjänstkontots namn och podden. En GitHub Actions-token bär anspråk för repositoryt, grenen, arbetsflödets namn och miljön. Moln-IAM-policyer använder dessa anspråk som villkor i förtroendepolicing.

Säkerhetsegenskaperna hos OIDC-federation är starka eftersom tokens är kortlivade, kryptografiskt signerade med kända nycklar och bundna till specifika strukturerade anspråk om arbetsbelastningen. Det finns inga bestående uppgifter att stjäla och återanvända på obestämd tid. Om en token avlyssnas löper den snabbt ut.

Kortlivade uppgifter

Kortlivade uppgifter är autentiseringstokens eller hemligheter som automatiskt löper ut efter en kort period, vanligtvis minuter till timmar. Genom att begränsa uppgifternas livstid begränsar organisationen skadan av stöld av uppgifter. En angripare som erhåller uppgifter som löper ut om 15 minuter har ett mycket smalt fönster att utnyttja dem.

AWS STS, GCPs OAuth-tokentjänst och Azure AD genererar alla temporära uppgifter med konfigurerbara utgångstider. Applikationer som använder dessa tjänster håller aldrig en långlivad uppgift, de begär färska temporära uppgifter vid behov och använder sin arbetsbelastningsidentitet för autentisering. SDK:er för molnleverantörer hanterar detta transparent. De cachelagrar uppgifter och uppdaterar dem proaktivt innan de löper ut.

Den operativa utmaningen med kortlivade uppgifter är hantering av uppdatering. Applikationer måste designas för att erhålla nya uppgifter innan de nuvarande löper ut. De flesta moln-SDK:er hanterar detta transparent för API-anrop, men applikationer som cachelagrar uppgifter på applikationsnivå (som databasanslutningspooler) kan hålla utgångna uppgifter.

Ett vanligt antimönster är att skapa 'långlivade tokens' genom att ange konstlat långa utgångstider på vad som tekniskt sett är en kortlivad uppgiftsmekanism. Team gör ibland detta för att undvika att hantera tokenuppdateringslogik, men detta motverkar syftet. Målet är uppgifter som löper ut på minuter till timmar, inte på ett år.

Minsta behörighet

Principen om minsta behörighet fastslår att varje identitet bara ska ha åtkomst till den minsta uppsättning behörigheter som krävs för dess avsedda funktion. Tillämpad på arbetsbelastningsidentitet innebär detta att varje tjänst får sin egen identitet med exakt de behörigheter den behöver, avgränsade till exakt de resurser den behöver. Alltför privilegierade arbetsbelastningsidentiteter är en av de vanligaste molnsäkerhetsfelkonfiguationerna.

Minsta behörighet i moln-IAM uppnås genom finkorniga policydefinitioner. Istället för att ge en tjänst administratörsrollen eller bred åtkomst till alla resurser i ett konto kan ett korrekt privilegierat tjänstkonto ha behörighet att läsa objekt från ett specifikt S3-bucket-prefix, skriva till en specifik DynamoDB-tabell och publicera till ett specifikt SNS-ämne.

Behörighetsanalysverktyg hjälper team att identifiera och stänga gapet mellan beviljade och faktiskt använda behörigheter. AWS IAM Access Analyzer med sin senast använda information, GCP Policy Analyzer och liknande verktyg analyserar CloudTrail-loggar eller granskningsloggar för att avgöra vilka behörigheter en roll faktiskt utövar i praktiken.

Ett vanligt misstag är att bevilja jokertecknsbehörigheter för att det är enklare än att fastställa de exakta kraven. Att skriva 'Action: *' eller 'Resource: *' i en IAM-policy är en betydande varningssignal. Ett annat vanligt misstag är att bevilja behörigheter på kontonivå när de borde avgränsas till specifika resurser. Båda mönstren skapar mycket mer åtkomst än vad någon enskild arbetsbelastning någonsin borde behöva.