En arkitektur baserad på mikrotjänster erbjuder flexibilitet och skalbarhet, vilket möjliggör ändringar, tillägg eller borttagning av programvarukomponenter utan att störa andra delar av applikationen.
Denna struktur bidrar till snabbare utvecklingscykler, mindre team och flexibla val av programmeringsspråk. Dessutom underlättar den skalning eller felsökning av specifika funktioner eller tjänster utan att påverka de övriga komponenterna.
Mikrotjänster möjliggör generellt uppdelning av omfattande, monolitiska applikationer i självständiga, distribuerbara tjänster. Dock ökar denna uppdelning antalet komponenter, vilket i sin tur kan leda till ökad komplexitet och utmaningar med säkerheten.
Bild som jämför Monolitisk- vs- mikrotjänstarkitektur: Red Hat
En typisk distribution av mikrotjänster innefattar vanligtvis hårdvara, enskilda tjänster eller applikationer, kommunikationslager, molntjänster, virtualisering och ett orkestreringsskikt. Vart och ett av dessa lager har unika säkerhetskrav, kontroller och utmaningar.
Säkerhetsutmaningar kopplade till mikrotjänster
Mikrotjänster är ofta vida distribuerade system med komplexa åtkomstregler, ökade trafikmängder som behöver övervakas och en större attackyta. Dessutom körs merparten av mikrotjänsterna i molnmiljöer, vilka också har egna specifika säkerhetskonfigurationer och kontroller.
Det stora antalet API:er, portar och komponenter som exponeras gör att traditionella brandväggar kanske inte erbjuder tillräckligt skydd. Dessa omständigheter gör implementeringar av mikrotjänster mer sårbara för cyberhot som man-i-mitten-attacker, injektionsattacker, cross-site scripting, DDoS-attacker och andra hot.
Nätverkssäkerhet är en annan utmaning med mikrotjänster. Särskilt identitets- och åtkomstkontrollen uppnår en ny nivå av komplexitet. Andra svagheter omfattar osäker kod och brister i system för upptäckt av tjänster.
Även om mikrotjänster är svårare att säkra jämfört med monolitiska applikationer, är det möjligt att effektivt skydda dem genom att införa en genomtänkt strategi och följa bästa praxis.
I idealfallet kräver arkitekturen en distribuerad strategi som omfattar alla olika komponenter.
Typiska områden att ta itu med inkluderar:
- Skydd av applikationer, mikrotjänster och användare
- Säker identitets- och åtkomsthantering
- Dataskydd
- Förbättrad säkerhet för kommunikation mellan tjänster
- Övervakning av mikrotjänster och säkerhetssystem
Bästa metoder för att säkra mikrotjänster
En effektiv strategi är att använda en kombination av bästa praxis, verktyg och kontroller för att säkra hela ekosystemet. Den faktiska tillvägagångssättet kan variera beroende på tjänsternas typ, applikationer, användare, miljö och andra relevanta faktorer.
Om du väljer att använda mikrotjänster är det viktigt att säkerställa att alla säkerhetskrav för tjänsterna, anslutningarna och data uppfylls.
Låt oss nu utforska några effektiva säkerhetsåtgärder för mikrotjänster.
#1. Bygg säkerhet från grunden
Integrera säkerhet som en del av utvecklingscykeln. Helst bör säkerheten inkluderas i utvecklingen och distributionen av mikrotjänster från start. Att adressera säkerheten på det här viset är mer effektivt och kostnadseffektivt än att vänta till slutet av mjukvaruutvecklingen.
#2. Använd en försvarsstrategi i flera lager
Denna strategi (Defense in Depth, DiP) innebär att tillämpa flera säkerhetslager på dina tjänster och data. Denna praxis gör det svårare för angripare att tränga igenom de olika lagren, vilket resulterar i ett starkare skydd av dina tjänster och data.
Till skillnad från perimetersäkerhetslösningar som brandväggar, använder DiP en kombination av verktyg som antivirus, brandvägg, patchhantering, anti-spam-programvara och andra, för att tillhandahålla flera säkerhetslager som är fördelade över hela systemet.
Bild som illustrerar ett flerlagers försvar för djupgående säkerhet: Imperva
Med detta tillvägagångssätt är det första steget att identifiera de känsliga tjänsterna, varefter du tillämpar lämpliga säkerhetslager runt dem.
#3. Distribuera säkerhet på containernivå
Eftersom mikrotjänster ofta bygger på containerteknik, är det viktigt att säkra containrarna, både internt och externt, för att minska attackytan och riskerna. En bra tumregel är att tillämpa principen om minsta privilegium och använda en kombination av strategier, inklusive men inte begränsat till:
- Begränsa behörigheter till det minimum som krävs.
- Undvik att köra tjänster och allt annat med sudo- eller privilegierade konton.
- Begränsa eller kontrollera åtkomst och förbrukning av tillgängliga resurser. Att begränsa containeråtkomst till operativsystemets resurser hjälper till att förebygga datastöld eller kompromettering.
- Lagera inte hemligheter i containerns disk.
- Använd lämpliga regler för att isolera åtkomsten till resurserna.
Det är också viktigt att säkerställa att containeravbildningarna inte har några sårbarheter eller säkerhetsproblem. Regelbunden säkerhets- och sårbarhetsskanning av containrarna hjälper till att identifiera potentiella risker.
Vanliga verktyg för avbildningsskanning inkluderar Clair, Anchore med flera.
#4. Implementera multifaktorautentisering
Genom att aktivera multifaktorautentisering ökar du säkerheten i front-end.
Användare som vill få tillgång måste, utöver användarnamn och lösenord, ange en extra form av verifiering, som en kod skickad till deras telefon eller en angiven e-postadress. Denna teknik gör det svårare för angripare som har stulit eller hackat lösenord att få tillgång till mikrotjänsterna, eftersom de saknar det andra autentiseringssteget.
#5. Använd användaridentitet och åtkomsttoken
Vid implementering av mikrotjänster kommer ett stort antal applikationer och tjänster att kräva säker auktorisering och åtkomstkontroll. Ett auktoriseringsramverk som OAuth 2.0 och OpenID gör det möjligt att hantera tokens på ett säkert sätt, vilket skyddar dina mikrotjänster. Detta tillåter tredjepartsapplikationer att få tillgång till andra tjänster eller data från användare.
I en typisk distribution kommer huvudapplikationen att be användaren godkänna tredjepartstjänsten. Efter godkännandet genererar applikationen en åtkomsttoken för sessionen.
OAuth är i synnerhet en av de mest effektiva strategierna för användaridentitet och åtkomstkontroll. Det finns flera andra auktoriseringsprotokoll, och det är möjligt att bygga sina egna, men det rekommenderas att använda OAuth då den är mer standardiserad, stabil och allmänt accepterad.
#6. Skapa en API-gateway
Mikrotjänster består ofta av flera komponenter som är distribuerade över olika nätverk och tillgängliga från en mängd olika system och klienter. Att exponera mikrotjänsterna ökar sårbarheten och säkerhetsriskerna. En lösning är att skapa en säker ingångspunkt för att centralisera all åtkomst från externa system och klienter.
Implementera en API-gateway för att kontrollera alla inkommande förfrågningar efter säkerhetsproblem innan de dirigeras till de aktuella mikrotjänsterna. API-gatewayen fungerar som en mellanhand mellan klientapplikationerna och mikrotjänsterna. Den begränsar exponeringen av mikrotjänsterna och erbjuder extra funktioner för hantering av förfrågningar som autentisering, SSL-avslutning, protokollöversättning, övervakning, förfrågningsdirigering, cachelagring med mera.
Genom detta tillvägagångssätt dirigerar API-gatewayen alla externa tjänster till mikrotjänsterna, samtidigt som den stöder säkerhetsstrategin för djupförsvar.
Microservices API-gatewaybild: Livebook
Vanliga API-gateways inkluderar NGINX, Kong, Tyk, Ambassador, AWS API-gateway och fler.
För mer information om API-säkerhet, se vår guide om varför och hur du säkrar API-slutpunkter.
#7. Profilera API:er baserat på distributionszonen
Implementera rollbaserade begränsningar genom att säkerställa att användare endast har tillgång till de API:er och tjänster de behöver. Genom att begränsa åtkomsten till endast behöriga användare minskar risken, eftersom skadliga program ofta exponeras för fler användare än avsett. Ett sätt att minska exponeringen är att märka API:erna baserat på de användare som ska ha tillgång till dem. API:erna kan till exempel vara:
- Ethernet-API:er – för tjänster som exponeras mot omvärlden utanför datacentret.
- Corporate Zone API:er – avsedda för intern privat trafik.
- DMZ API:er – för att hantera trafik som kommer från internet.
- Hybrid Zone API:er – för datacenterinstallationer.
#8. Säkra kommunikationen mellan tjänster
Effektiva metoder omfattar autentisering och auktorisering av förfrågningar när två mikrotjänster kommunicerar.
I allmänhet finns det tre huvudtekniker som kan användas för att säkra kommunikationen mellan tjänster. Dessa är Trust the network, JSON Web Token (JWT) och Mutual Transport Layer Security (mTLS eller Mutual TLS).
Säkra kommunikation mellan tjänster med JWT: Livebook
Av dessa tre är mTLS den mest populära. I den här metoden måste varje mikrotjänst inneha ett offentligt/privat nyckelpar. Klientmikrotjänsten använder sedan nyckelparet för att autentisera sig för den mottagande mikrotjänsten via mTLS.
Under autentiseringen genererar varje mikrotjänst ett certifikat. Efter detta kommer varje mikrotjänst att använda certifikatet från den andra för att autentisera sig.
TLS erbjuder integritet och konfidentialitet för data under överföring och gör det även möjligt för klienten att identifiera en mikrotjänst. Klientmikrotjänsten känner oftast till den andra mikrotjänsten. Men eftersom TLS är enkelriktad, kan en mottagande mikrotjänst inte verifiera klientmikrotjänsten – och angripare kan utnyttja denna svaghet. mTLS ger däremot ett sätt för varje mikrotjänst att identifiera varandra.
#9. Begränsa kundtrafik
Begränsning av extern trafik förhindrar problem som överbelastningsattacker (DoS) och scenarier där vissa klienter förbrukar majoriteten av applikationens bandbredd. En metod är att tillämpa olika regler som kan övervaka och kontrollera hastigheten för trafik som skickas eller tas emot från en klient baserat på IP, tid etc.
Konfigurera dina tjänster så att de saktar ner om de detekterar flera misslyckade inloggningsförsök till dina API:er eller någon annan misstänkt aktivitet.
Ett långsammare system kan avskräcka angripare och få dem att ge upp sina försök att nå tjänsterna. Hastighetsbegränsning kan implementeras via API-gatewayen, i koden eller med hjälp av andra tekniker. Vanligtvis har de flesta SaaS-miljöer hastighetsbegränsningar för att minimera missbruk av användare och attacker.
#10. Använd orkestreringsverktyg
Med hjälp av orkestreringshanterare kan du automatisera konfiguration, samordning och andra hanteringsuppgifter för mikrotjänster, samt förbättra säkerheten. Dessa verktyg gör att du kan hantera flera containrar, begränsa åtkomst till metadata, separera arbetsbelastningar, samla in loggar med mera.
Vissa orkestreringsverktyg har även extra funktioner som gör det möjligt för utvecklarna att lagra och dela känslig information som SSL-certifikat, krypteringsnycklar, lösenord och identitetstokens.
De två vanligaste metoderna för effektiv orkestrering av mikrotjänster är:
- Koda orkestreringen som en mikrotjänst.
- Använd API-gateways för att tillhandahålla ett orkestreringslager.
Orkestrering genom API-gatewayen rekommenderas inte på grund av svårigheter vid skalning av tjänster.
Mikrotjänstorkestreringslager – Bild: Globallogik
Vanliga verktyg för orkestreringshantering inkluderar Kubernetes, Istio, Azure Kubernetes Service (AKS) etc.
För mer information, undersök Containerorkestrering för DevOps.
#11. Övervaka alla dina system och tjänster
Eftersom mikrotjänster förlitar sig på distribuerade system, är det viktigt att ha en pålitlig och effektiv övervakningsstrategi för alla enskilda komponenter.
Genom att implementera kontinuerlig övervakning kan du upptäcka och hantera säkerhetsrisker i tid. Det finns ett brett utbud av övervakningslösningar för mikrotjänster, inklusive Prometheus, Statsd, InfluxDB, Logstash etc.
Övervakning inom mikrotjänstarkitektur
Använd lämpliga verktyg för att övervaka interna system och tjänster. Några bästa metoder omfattar:
- Aktivera loggning i applikationslagret. Du kan använda verktyg som Splunk, Graphana, ELK-stacken och andra för att samla in loggar på applikations-, container-, nätverks- och infrastrukturnivå.
- Övervaka användningsstatistik.
- Använd mätvärden som CPU, minne, svarstider, fel, varningar och andra trender för att upptäcka ovanlig aktivitet som kan tyda på en faktisk eller potentiell attack.
- Granska loggarna i områden som inkommande kundförfrågningar, databasposter, containrar med mera för att identifiera inkonsekvenser eller avvikande aktiviteter.
#12. Automatisera säkerhetsaktiviteter
Automatisera säkerhetsprocesser som distribution av uppdateringar, sårbarhetsskanning, övervakning, efterlevnad av policyer och andra aktiviteter. Kontrollera även uppdateringarna för att säkerställa att de är säkra och inte introducerar nya sårbarheter.
Efter uppdateringar bör säkerhetsprogramvaran idealiskt utföra tester på alla containrar och mikrotjänster för att verifiera att det inte har uppstått sårbarheter eller säkerhetsproblem.
#13. Skydda data hela tiden
Skydda data under transport och i vila. Upprätthåll användningen av HTTPS för all kommunikation för att säkra data under överföring, och kryptera all känslig data i vila. Undvik att överföra eller lagra oformaterade lösenord, nycklar, autentiseringsuppgifter och annan känslig data utanför koden.
Den bästa strategin är att använda standardtekniker för att kryptera all känslig information så tidigt som möjligt. Dekryptera sedan informationen så sent som möjligt för att minimera exponeringen.
Slutsats
Mikrotjänster är beroende av distribuerade komponenter för att ge fördelar som ökad flexibilitet och distributionsalternativ. Vid användning av mikrotjänster måste organisationer anpassa sina interna säkerhetspolicyer och strategier mot en mer molnbaserad och distribuerad strategi.
Sträva efter att minska attackytan och skydda mikrotjänstmiljön, API:er, applikationer och data.