SPIFFE
Hva er SPIFFEâ
SPIFFE (Secure Production Identity Framework For Everyone) er en standard som kort forklart definerer:
- en identifikator, kalt
SPIFFE ID. Ved bruk av SPIFFE vil hver workload ha en unik SPIFFE ID - et verifikasjonsdokument, kalt
SVID(SPIFFE Verifiable Identity Document). Workloads bruker SVID-en for Ă„ presentere sin identitet for andre workloads - en mekanisme for Ă„ utstede SVID-er, kalt
SPIFFE Workload API. Workload-APIet utsteder SVID-er til workloads med en tilhĂžrende kortlevd privat nĂžkkel, samt en trust bundle som inneholder de nĂždvendige sertifikatene for Ă„ verifisere SVID-er utstedt til andre workloads
SPIRE (SPIFFE Runtime Environment) er en implementasjon av SPIFFE, som SKIP har innebygd stĂžtte for via Istio.
Hvorfor SPIFFEâ
For at applikasjoner pÄ SKIP skal kunne kommunisere sikkert med bÄde eksterne og interne tjenester er det flere sikkerhetsmekanismer i spill:
- Applikasjoner er i utgangspunktet helt lÄst ned, og inngÄende og utgÄende nettverksregler mÄ defineres eksplisitt for Ä kunne kommunisere med andre tjenester
- Istio, som er vÄrt Service Mesh og kjÞrer som sidecar for alle pods, hÄndterer mutual TLS pÄ vegne av applikasjonen. Dette sikrer kryptert trafikk mellom tjenester
Network Policies pÄ Kubernetes tilbyr en del funksjonalitet pÄ nivÄ 3 og 4 (ref. OSI-modellen), blant annet:
- Label-basert tilgangskontroll, basert pÄ
podSelectorognamespaceSelector - IP-/CIDR-basert tilgangskontroll
- Begrensninger pÄ hvilke porter og protokoller som kan brukes
SPIFFE tilbyr derimot en del funksjonalitet som Network Policies ikke tilbyr, ogsÄ pÄ nivÄ 7, blant annet:
- Begrense trafikk basert pÄ SPIFFE-identiteter
- Begrense trafikk basert pÄ HTTP-verb og paths
- Deny-regler, i motsetning til Network Policies som baserer seg pÄ kun Allow-regler
Hvordan SPIFFEâ
PĂ„ sikt Ăžnsker vi Ă„ tilby et abstrasksjonslag som knytter oppsett av SPIFFE-regler tettere opp mot Ăžvrig konfigurasjon
av applikasjoner pÄ SKIP, f.eks via argokit, direkte i definisjon av Skiperator-applikasjoner, eller via en egen
custom resource. Kom gjerne med innspill pÄ hvordan dette bÞr se ut i praksis!
Dersom du har applikasjoner som prater sammen pÄ tvers av Kubernetes-cluster og Þnsker Ä bruke SPIFFE, ta gjerne kontakt med Team Tilgangsstyring. Basert pÄ behov og etterspÞrsel vil vi vurdere Ä tilby stÞtte for dette i fremtiden.
Ztoperator baserer seg, i likhet med SPIFFE, pÄ Ä opprette AuthorizationPolicy-ressurser. Det er derfor viktig Ä vÊre klar over at
Ztoperator og egendefinerte SPIFFE-baserte AuthorizationPolicy-ressurser kan komme i konflikt. Se
denne seksjonen for nÊrmere forklaring. PÄ sikt hÄper Team Tilgangsstyring Ä
kunne tilby en bedre lĂžsning for dette, f.eks stĂžtte for SPIFFE integrert i Ztoperator.
For Ă„ definere SPIFFE-regler bruker vi Istio sine AuthorizationPolicy-ressurser. Disse kan defineres med enten DENY
eller ALLOW som action. FĂžrstnevnte brukes gjerne sammen med notPrincipals for Ă„ nekte tilgang for alle andre
identiteter enn den som spesifiseres, mens sistnevnte brukes sammen med principals for Ă„ gi tilgang til spesifikke
identiteter. Ă
beskytte et API med bruk av SPIFFE-regler vil gjerne innebĂŠre en kombinasjon av ALLOW- og
DENY-regler.
Dersom en forespĂžrsel matcher en DENY-regel vil den alltid bli avvist, uavhengig av eventuelle ALLOW-regler.
Dersom det eksisterer ALLOW-regler sÄ mÄ en forespÞrsel matche minst én av disse for Ä bli tillatt.
Eksemplene under viser hvordan AuthorizationPolicy-ressurser med SPIFFE-regler kan defineres. Principals og
notPrincipals spesifiseres pÄ formatet <cluster>/ns/<namespace>/sa/<serviceaccount>. For kommunikasjon med
identiteter i sammen Kubernetes-cluster brukes cluster.local som cluster-navn. En applikasjon sin Service Account vil
alltid ha samme navn som den tilhÞrende Skiperator-applikasjonen. For applikasjoner pÄ SKIP vil altsÄ principals vÊre
pÄ formatet cluster.local/ns/<namespace>/sa/<app-name>.
I definisjon av paths brukes wildcards {*} og {**} for Ă„ matche hhv. ett eller flere path-segmenter. Sistnevnte kan
kun opptre i slutten av en path, mens fĂžrstnevnte kan opptre hvor som helst i pathen. Wildcard-operatorene kan ikke
opptre sammen med andre tegn i samme path-segment, dvs. /foo/bar/{*} er gyldig, mens /foo/bar{*} er ikke er gyldig.
Eksempel pĂ„ DENY-policy med notPrincipalsâ
Eksemplet avviser alle forespĂžrsler mot /secure{**}, unntatt de som kommer fra other-app sin SPIFFE-identitet.
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: my-app
namespace: my-namespace
spec:
selector:
matchLabels:
app: my-app
action: DENY
rules:
- from:
- source:
notPrincipals:
- cluster.local/ns/<other-app-namespace>/sa/<other-app>
to:
- operation:
paths:
- /secure/{**}
Eksempel pĂ„ ALLOW-policy med principalsâ
Eksemplet gir other-app-with-full-access tilgang med alle HTTP-verb, mens other-app-with-only-get-access kun fÄr
tilgang til GET-forespĂžrsler. I tillegg tillater den alle forespĂžrsler til /public og alle under-stier, uavhengig av
identitet.
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: my-app
namespace: my-namespace
spec:
selector:
matchLabels:
app: my-app
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/<other-app-namespace>/sa/<other-app-with-full-access>
- from:
- source:
principals:
- cluster.local/ns/<other-app-namespace>/sa/<other-app-with-only-get-access>
to:
- operation:
methods:
- GET
- to:
- operation:
methods:
- GET
paths:
- /public/{**}
Validering av SPIFFE-identitet i din applikasjonâ
Istio sender med seg headeren X-Forwarded-Client-Cert, som inneholder informasjon om SPIFFE-identiteten til klienten
som gjÞr kallet. Denne er pÄ formatet
By=spiffe://cluster.local/ns/<namespace>/sa/<service-account>;Hash=<hash>;Subject="";URI=spiffe://cluster.local/ns/<namespace>>/sa/<service-account>
Det mest naturlige er da Ä bruke URI-delen av headeren for Ä validere SPIFFE-identiteten. VÄr infrastruktur med Istio i sidecar-modus er konfigurert slik at applikasjonen alltid kan stole pÄ at denne headeren er korrekt, og at den ikke kan forfalskes av klienten.
Testing av SPIFFE-reglerâ
Team Tilgangsstyring tilbyr p.t. ingen verktĂžy for testing av AuthorizationPolicy-ressurser med SPIFFE-regler. Ta
kontakt med oss dersom du har innspill til hvordan et slikt testverktÞy bÞr fungere. Enn sÄ lenge anbefaler vi at dere
bruker dev-miljĂžet for testing. Vi er tilgjengelig for sparring mtp. oppsett av AuthorizationPolicy-ressurser.
Bruk av SPIFFE sammen med Ztoperatorâ
For rene maskin-til-maskin-baserte APIerâ
Dersom alle endepunkter i appen til er ment for samme type maskin-til-maskin-kommunikasjon, er det problemfritt Ă„ bruke Ztoperator (for validering av tokens) og SPIFFE-regler (for validering av identiteter) sammen.
For APIer som skal hĂ„ndtere bĂ„de maskin-til-maskin-kommunikasjon og kommunikasjon med sluttbrukereâ
For at Ztoperator-regler og SPIFFE-regler ikke skal gÄ i beina pÄ hverandre mÄ de ulike delene av APIet for hhv. m2m-
og sluttbruker-kommunikasjon vÊre adskilt, f.eks pÄ ulike rotstier /api/user/.. og /api/m2m/.... Videre mÄ du vÊre
nÞye pÄ Ä sette opp Ztoperator-regler og SPIFFE-regler slik at sikkerheten i APIet ikke kompromitteres. Dette innebÊrer:
- Sett opp Ztoperator med Ăžnsket validering av sluttbrukertokens, og
api/m2m/{**}somignoreAuthRules-path - Sett opp SPIFFE-regler for
api/m2m/{**}-pathen, med bÄde:DENY-regler som nekter tilgang for alle identiteter unntatt de som skal ha tilgangALLOW-regler som gir tilgang til de identitetene som skal ha tilgang