Skip to main content

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Ă„ podSelector og namespaceSelector
  • 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​

Vi Þnsker Ä forenkle oppsett av SPIFFE pÄ SKIP

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!

SKIP stÞtter ikke SPIFFE pÄ tvers av Kubernetes-cluster

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.

Samspill mellom Ztoperator og SPIFFE-regler

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/{**} som ignoreAuthRules-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 tilgang
    • ALLOW-regler som gir tilgang til de identitetene som skal ha tilgang