Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

PiezÄ«me. tulk.: Raksta autoram Reuvenam Harisonam ir vairāk nekā 20 gadu pieredze programmatÅ«ras izstrādē, un Å”odien viņŔ ir droŔības politikas pārvaldÄ«bas risinājumu radÄ«Å”anas uzņēmuma Tufin CTO un lÄ«dzdibinātājs. Lai gan viņŔ uzskata, ka Kubernetes tÄ«kla politikas ir diezgan spēcÄ«gs rÄ«ks tÄ«kla segmentÄ“Å”anai klasterÄ«, viņŔ arÄ« uzskata, ka tās nav tik viegli ieviest praksē. Å is materiāls (diezgan apjomÄ«gs) ir paredzēts, lai uzlabotu speciālistu izpratni par Å”o jautājumu un palÄ«dzētu viņiem izveidot nepiecieÅ”amās konfigurācijas.

MÅ«sdienās daudzi uzņēmumi arvien vairāk izvēlas Kubernetes savu lietojumprogrammu palaiÅ”anai. Interese par Å”o programmatÅ«ru ir tik liela, ka daži Kubernetes sauc par "jauno operētājsistēmu datu centram". Pamazām Kubernetes (jeb k8s) sāk uztvert kā kritisku biznesa sastāvdaļu, kas prasa nobrieduÅ”u biznesa procesu organizÄ“Å”anu, tostarp tÄ«kla droŔību.

DroŔības speciālistiem, kuri ir neizpratnē par darbu ar Kubernetes, patiesā atklāsme var bÅ«t platformas noklusējuma politika: atļaut visu.

Å Ä« rokasgrāmata palÄ«dzēs izprast tÄ«kla politiku iekŔējo struktÅ«ru; saprast, kā tie atŔķiras no noteikumiem par parastajiem ugunsmÅ«riem. Tas arÄ« aptvers dažas nepilnÄ«bas un sniegs ieteikumus, lai palÄ«dzētu aizsargāt lietojumprogrammas vietnē Kubernetes.

Kubernetes tīkla politikas

Kubernetes tÄ«kla politikas mehānisms ļauj pārvaldÄ«t platformā izvietoto lietojumprogrammu mijiedarbÄ«bu tÄ«kla slānÄ« (treÅ”ais OSI modelÄ«). TÄ«kla politikām trÅ«kst dažu moderno ugunsmÅ«ru uzlaboto lÄ«dzekļu, piemēram, OSI Layer 7 izpildes un draudu noteikÅ”anas, taču tās nodroÅ”ina pamata tÄ«kla droŔības lÄ«meni, kas ir labs sākumpunkts.

Tīkla politikas kontrolē saziņu starp podiem

Kubernetes darba slodzes ir sadalÄ«tas pa podiem, kas sastāv no viena vai vairākiem kopā izvietotiem konteineriem. Kubernetes pieŔķir katram podam IP adresi, kas ir pieejama no citiem podiem. Kubernetes tÄ«kla politikas nosaka piekļuves tiesÄ«bas podiņu grupām tādā paŔā veidā, kā droŔības grupas mākonÄ« tiek izmantotas, lai kontrolētu piekļuvi virtuālās maŔīnas gadÄ«jumiem.

Tīkla politiku noteikŔana

Tāpat kā citi Kubernetes resursi, tÄ«kla politikas ir norādÄ«tas YAML. Tālāk esoÅ”ajā piemērā lietojumprogramma balance piekļuve postgres:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: balance
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

(PiezÄ«me. tulk.: Å”is ekrānuzņēmums, tāpat kā visi nākamie lÄ«dzÄ«gie, tika izveidots nevis izmantojot vietējos Kubernetes rÄ«kus, bet gan rÄ«ku Tufin Orca, kuru izstrādāja oriÄ£inālā raksta autora uzņēmums un kas minēts materiāla beigās.)

Lai definētu savu tÄ«kla politiku, jums bÅ«s nepiecieÅ”amas pamatzināŔanas par YAML. Å Ä«s valodas pamatā ir atkāpe (norāda atstarpes, nevis tabulÄ“Å”anas zÄ«mes). Atkāpes elements pieder tuvākajam atkāpes elementam virs tā. Jauns saraksta elements sākas ar defisi, visiem pārējiem elementiem ir forma atslēgas vērtÄ«ba.

Aprakstot politiku YAML, izmantojiet kubectllai to izveidotu klasterī:

kubectl create -f policy.yaml

Tīkla politikas specifikācija

Kubernetes tīkla politikas specifikācijā ir iekļauti četri elementi:

  1. podSelector: definē aplikumus, uz kuriem attiecas Ŕī politika (mērÄ·i) - nepiecieÅ”ams;
  2. policyTypes: norāda, kāda veida politikas ir iekļautas Å”ajā: ingress un/vai izeja - pēc izvēles, bet iesaku to skaidri norādÄ«t visos gadÄ«jumos;
  3. ingress: definē atļauto ienākoÅ”o datplÅ«sma uz mērÄ·a podiem ā€” pēc izvēles;
  4. egress: definē atļauto izejoÅ”o datplÅ«sma no mērÄ·a podiem nav obligāta.

Piemērs ņemts no Kubernetes vietnes (es nomainīju role par app), parāda, kā tiek izmantoti visi četri elementi:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:    # <<<
    matchLabels:
      app: db
  policyTypes:    # <<<
  - Ingress
  - Egress
  ingress:        # <<<
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:         # <<<
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem
Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

LÅ«dzu, ņemiet vērā, ka visiem četriem elementiem nav jābÅ«t iekļautiem. Tas ir tikai obligāti podSelector, pēc vēlÄ“Å”anās var izmantot citus parametrus.

Ja jÅ«s izlaižat policyTypes, politika tiks interpretēta Ŕādi:

  • Pēc noklusējuma tiek pieņemts, ka tas definē ieejas pusi. Ja politikā tas nav skaidri norādÄ«ts, sistēma pieņems, ka visa satiksme ir aizliegta.
  • UzvedÄ«bu izejas pusē noteiks atbilstoŔā izejas parametra esamÄ«ba vai neesamÄ«ba.

Lai izvairītos no kļūdām, es iesaku vienmēr skaidri norādiet policyTypes.

Saskaņā ar iepriekÅ” minēto loÄ£iku, ja parametri ingress un / vai egress izlaist, politika aizliedz visu trafiku (skatiet tālāk sadaļu "NoņemÅ”anas kārtula").

Noklusējuma politika ir Atļaut

Ja nav noteiktas politikas, Kubernetes pēc noklusējuma atļauj visu trafiku. Visas pākstis var brÄ«vi apmainÄ«ties ar informāciju savā starpā. No droŔības viedokļa tas var Ŕķist pretrunā, taču atcerieties, ka Kubernetes sākotnēji izstrādāja izstrādātāji, lai nodroÅ”inātu lietojumprogrammu savietojamÄ«bu. TÄ«kla politikas tika pievienotas vēlāk.

Vārdtelpas

Vārdtelpas ir Kubernetes sadarbības mehānisms. Tie ir paredzēti, lai izolētu loģiskās vides viena no otras, savukārt saziņa starp telpām ir atļauta pēc noklusējuma.

Tāpat kā lielākā daļa Kubernetes komponentu, tīkla politikas atrodas noteiktā nosaukumvietā. Blokā metadata varat norādīt, kurai vietai politika pieder:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: my-namespace  # <<<
spec:
...

Ja nosaukumvieta nav skaidri norādīta metadatos, sistēma izmantos kubectl norādīto nosaukumvietu (pēc noklusējuma namespace=default):

kubectl apply -n my-namespace -f namespace.yaml

Iesaku skaidri norādiet nosaukumvietu, ja vien nerakstāt politiku, kuras mērķauditorija ir vairākas nosaukumvietas vienlaikus.

Galvenais elements podSelector politikā atlasīs aplikumus no nosaukumvietas, kurai politika pieder (tai ir liegta piekļuve aplikumiem no citas nosaukumvietas).

Tāpat podSelectors ieejas un izejas blokos var atlasÄ«t aplikumus tikai no savas nosaukumvietas, ja vien jÅ«s tos neapvienojat ar namespaceSelector (par to tiks runāts sadaļā ā€œFiltrēt pēc nosaukumvietām un aplikumiemā€).

Politikas nosaukŔanas noteikumi

Politiku nosaukumi ir unikāli vienā nosaukumvietā. Vienā vietā nevar bÅ«t divas politikas ar vienādu nosaukumu, taču dažādās vietās var bÅ«t politikas ar vienādu nosaukumu. Tas ir noderÄ«gi, ja vēlaties atkārtoti piemērot vienu un to paÅ”u politiku vairākās vietās.

ÄŖpaÅ”i man patÄ«k viena no nosaukÅ”anas metodēm. Tas sastāv no nosaukumvietas nosaukuma apvienoÅ”anas ar mērÄ·a pākstiem. Piemēram:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres  # <<<
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

EtiÄ·etes

Varat pievienot pielāgotas etiķetes Kubernetes objektiem, piemēram, aplikumiem un nosaukumvietām. Etiķetes (uzlīmes - tagi) ir līdzvērtīgi tagiem mākonī. Lai atlasītu Kubernetes tīkla politikas, tiek izmantotas etiķetes pākstisuz kuriem tie attiecas:

podSelector:
  matchLabels:
    role: db

ā€¦ vai nosaukumvietasuz kuriem tie attiecas. Å ajā piemērā tiek atlasÄ«ti visi aplikumi nosaukumvietās ar atbilstoÅ”ajām iezÄ«mēm:

namespaceSelector:
  matchLabels:
    project: myproject

Viens piesardzÄ«ba: lietojot namespaceSelector pārliecinieties, vai atlasÄ«tajās nosaukumvietās ir ietverta pareizā etiÄ·ete. Ņemiet vērā, ka iebÅ«vētās nosaukumvietas, piemēram, default Šø kube-system, pēc noklusējuma nesatur etiÄ·etes.

Varat pievienot iezīmi vietai, piemēram:

kubectl label namespace default namespace=default

Tajā paŔā laikā sadaļā nosaukumu telpa metadata jāattiecas uz faktisko telpas nosaukumu, nevis etiķeti:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default   # <<<
spec:
...

Avots un galamērķis

UgunsmÅ«ra politikas sastāv no noteikumiem ar avotiem un galamērÄ·iem. Kubernetes tÄ«kla politikas tiek definētas mērÄ·im ā€” apvidu kopai, uz kuru tās attiecas, un pēc tam tiek iestatÄ«ti ieejas un/vai izejas trafika noteikumi. MÅ«su piemērā politikas mērÄ·is bÅ«s visi nosaukumvietas aplikumi default ar etiÄ·eti ar atslēgu app un nozÄ«me db:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: db   # <<<
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem
Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

ApakÅ”nodaļa ingress Å”ajā politikā atver ienākoÅ”o datplÅ«smu mērÄ·a podiem. Citiem vārdiem sakot, iekļūŔana ir avots, un mērÄ·is ir atbilstoÅ”ais galamērÄ·is. Tāpat izeja ir galamērÄ·is, un mērÄ·is ir tā avots.

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Tas ir lÄ«dzvērtÄ«gs diviem ugunsmÅ«ra noteikumiem: Ingress ā†’ Target; MērÄ·is ā†’ Izeja.

Izeja un DNS (svarīgi!)

Ierobežojot izejoÅ”o trafiku, pievērsiet Ä«paÅ”u uzmanÄ«bu DNS - Kubernetes izmanto Å”o pakalpojumu, lai kartētu pakalpojumus ar IP adresēm. Piemēram, Ŕī politika nedarbosies, jo neesat atļāvis lietojumprogrammu balance piekļūt DNS:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  policyTypes:
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

To var novērst, atverot piekļuvi DNS pakalpojumam:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:               # <<<
    ports:            # <<<
    - protocol: UDP   # <<<
      port: 53        # <<<
  policyTypes:
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Pēdējais elements to ir tukÅ”s, un tāpēc tas netieÅ”i atlasa visas pākstis visās nosaukumvietās, ļaujot balance nosÅ«tiet DNS vaicājumus attiecÄ«gajam Kubernetes pakalpojumam (parasti tas darbojas telpā kube-system).

Šī pieeja darbojas, neskatoties uz to pārāk pieļaujams un nedroŔs, jo tas ļauj DNS vaicājumus novirzīt ārpus klastera.

Varat to uzlabot trīs secīgās darbībās.

1. Atļaut tikai DNS vaicājumus laikā klasteri, pievienojot namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:
    - namespaceSelector: {} # <<<
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

2. Atļaut DNS vaicājumus tikai nosaukumvietā kube-system.

Lai to izdarītu, nosaukumu telpai jāpievieno etiķete kube-system: kubectl label namespace kube-system namespace=kube-system - un pierakstiet to politikā, izmantojot namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgres
  - to:
    - namespaceSelector:         # <<<
        matchLabels:             # <<<
          namespace: kube-system # <<<
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

3. ParanoiÄ·i var iet vēl tālāk un ierobežot DNS vaicājumus lÄ«dz noteiktam DNS pakalpojumam kube-system. Sadaļā ā€œFiltrēt pēc nosaukumvietām UN aplikumiemā€ tiks parādÄ«ts, kā to panākt.

Vēl viena iespēja ir atrisināt DNS nosaukumvietas līmenī. Šajā gadījumā tas nav jāatver katram pakalpojumam:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.dns
  namespace: default
spec:
  podSelector: {} # <<<
  egress:
  - to:
    - namespaceSelector: {}
    ports:
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

TukŔs podSelector atlasa visas pākstis nosaukumvietā.

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Pirmā spēle un noteikumu secība

Parastos ugunsmūros darbību (Atļaut vai Aizliegt) paketē nosaka pirmais noteikums, kuram tā atbilst. Kubernetes politikā politiku secībai nav nozīmes.

Pēc noklusējuma, ja nav iestatÄ«tas politikas, ir atļauta saziņa starp podiem un tie var brÄ«vi apmainÄ«ties ar informāciju. Kad sākat formulēt politikas, katra apgrupa, kuru ietekmē vismaz viena no tām, tiek izolēta atbilstoÅ”i visu to politiku sadalÄ«jumam (loÄ£iski VAI), kas to atlasÄ«ja. Aplikācijas, kuras neietekmē neviena politika, paliek atvērtas.

Varat mainÄ«t Å”o darbÄ«bu, izmantojot noņemÅ”anas kārtulu.

NoņemÅ”anas kārtula (ā€œNoliegtā€)

Ugunsmūra politikas parasti aizliedz jebkādu trafiku, kas nav skaidri atļauta.

Kubernetes darbÄ«bu nevar noliegttomēr lÄ«dzÄ«gu efektu var panākt ar parastu (atļaujoÅ”u) politiku, atlasot tukÅ”u avota aplikumu grupu (iekļūŔanu):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Å Ä« politika atlasa visus aplikumus nosaukumvietā un atstāj iekļūŔanu nedefinētu, liedzot visu ienākoÅ”o trafiku.

Līdzīgā veidā varat ierobežot visu izejoŔo trafiku no nosaukumvietas:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

LÅ«dzu, ņemiet vērā, ka jebkurai papildu politikai, kas atļauj trafiku uz aplikumiem nosaukumvietā, bÅ«s prioritāte pār Å”o noteikumu (lÄ«dzÄ«gi kā atļauÅ”anas kārtulas pievienoÅ”ana pirms aizlieguma kārtulas ugunsmÅ«ra konfigurācijā).

Atļaut visu (jebkurŔ-jebkur-atļaut)

Lai izveidotu politiku Atļaut visu, iepriekÅ” minētā politika ir jāpapildina ar tukÅ”u elementu ingress:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
  namespace: default
spec:
  podSelector: {}
  ingress: # <<<
  - {}     # <<<
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Tas ļauj piekļūt no visi aplikumi visās nosaukumvietās (un visi IP) uz jebkuru aplikumu nosaukumvietā default. Å Ä« darbÄ«ba ir iespējota pēc noklusējuma, tāpēc parasti tā nav jādefinē sÄ«kāk. Tomēr dažreiz jums var bÅ«t nepiecieÅ”ams Ä«slaicÄ«gi atspējot dažas Ä«paÅ”as atļaujas, lai diagnosticētu problēmu.

Noteikumu var saŔaurināt, lai atļautu piekļuvi tikai īpaŔs pākstu komplekts (app:balance) nosaukumvietā default:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-to-balance
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: balance
  ingress: 
  - {}
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Tālāk norādītā politika atļauj visu ieejas un izejas trafiku, tostarp piekļuvi jebkuram IP ārpus klastera:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}
  egress:
  - {}
  policyTypes:
  - Ingress
  - Egress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem
Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Vairāku politiku apvienoŔana

Politikas tiek apvienotas, izmantojot loÄ£isko VAI trÄ«s lÄ«meņos; Katras podziņas atļaujas tiek iestatÄ«tas saskaņā ar atŔķirÄ«bu no visām politikām, kas to ietekmē:

1. Laukos from Šø to Var definēt trÄ«s veidu elementus (visi tiek apvienoti, izmantojot VAI):

  • namespaceSelector ā€” atlasa visu nosaukumu telpu;
  • podSelector ā€” atlasa pākstis;
  • ipBlock ā€” atlasa apakÅ”tÄ«klu.

Turklāt elementu skaits (pat identiski) apakŔsadaļās from/to nav ierobežots. Visi tie tiks apvienoti ar loģisko VAI.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    - podSelector:
        matchLabels:
          app: admin
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

2. Politikas sadaļā ingress var būt daudz elementu from (kombinēts ar loģisko VAI). Tāpat sadaļa egress var ietvert daudzus elementus to (arī apvienots ar disjunkciju):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
  - from:
    - podSelector:
        matchLabels:
          app: admin
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

3. Dažādas politikas tiek apvienotas arī ar loģisko VAI

Bet, tos apvienojot, ir viens ierobežojums norādīja Kriss Kūnijs: Kubernetes var apvienot tikai politikas ar dažādām policyTypes (Ingress vai Egress). Politikas, kas nosaka ieeju (vai izeju), pārrakstīs viena otru.

Attiecības starp nosaukumu telpām

Pēc noklusējuma informācijas apmaiņa starp nosaukumvietām ir atļauta. To var mainÄ«t, izmantojot aizlieguma politiku, kas ierobežos izejoÅ”o un/vai ienākoÅ”o trafiku nosaukumvietā (skatiet iepriekÅ” sadaļu ā€œNoņemÅ”anas kārtulaā€).

Kad esat bloķējis piekļuvi nosaukumvietai (skatiet iepriekÅ” minēto ā€œNoņemÅ”anas kārtuluā€), varat veikt izņēmumus noraidÄ«Å”anas politikai, atļaujot savienojumus no noteiktas nosaukumvietas, izmantojot namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector: # <<<
        matchLabels:
          namespace: default
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Rezultātā visas pākstis nosaukumvietā default būs piekļuve pākstīm postgres vārdu telpā database. Bet ko darīt, ja vēlaties atvērt piekļuvi postgres tikai noteiktas pākstis nosaukumvietā default?

Filtrējiet pēc nosaukumvietām un aplikumiem

Kubernetes versija 1.11 un jaunāka versija ļauj apvienot operatorus namespaceSelector Šø podSelector izmantojot loÄ£isko UN. Tas izskatās Ŕādi:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          namespace: default
      podSelector: # <<<
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Kāpēc tas tiek interpretēts kā UN, nevis parastā VAI?

LÅ«dzu, ņemiet vērā, ka podSelector nesākas ar defisi. YAML tas nozÄ«mē to podSelector un stāvot viņam priekŔā namespaceSelector atsaukties uz to paÅ”u saraksta elementu. Tāpēc tie tiek apvienoti ar loÄ£isko UN.

Pirms tam pievieno defisi podSelector rezultātā parādÄ«sies jauns saraksta elements, kas tiks apvienots ar iepriekŔējo namespaceSelector izmantojot loÄ£isko VAI.

Lai atlasītu pākstis ar noteiktu etiķeti visās nosaukumvietās, ievadiet tukŔu namespaceSelector:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Vairākas etiķetes sadarbojas ar I

Noteikumi ugunsmūrim ar vairākiem objektiem (resursdatoriem, tīkliem, grupām) tiek apvienoti, izmantojot loģisko VAI. Šis noteikums darbosies, ja pakeŔu avots sakrīt Host_1 VAI Host_2:

| Source | Destination | Service | Action |
| ----------------------------------------|
| Host_1 | Subnet_A    | HTTPS   | Allow  |
| Host_2 |             |         |        |
| ----------------------------------------|

Gluži pretēji, Kubernetes dažādās etiÄ·etes iekŔā podSelector vai namespaceSelector ir apvienoti ar loÄ£isko UN. Piemēram, Ŕī kārtula atlasÄ«s aplikumus, kuriem ir abas etiÄ·etes, role=db Š˜ version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

Tāda pati loģika attiecas uz visu veidu operatoriem: politikas mērķa atlasītājiem, pod atlasītājiem un nosaukumvietas atlasītājiem.

ApakŔtīkli un IP adreses (IPBlocks)

UgunsmÅ«ri izmanto VLAN, IP adreses un apakÅ”tÄ«klus, lai segmentētu tÄ«klu.

Programmā Kubernetes IP adreses aplikācijām tiek pieŔķirtas automātiski, un tās var bieži mainÄ«ties, tāpēc etiÄ·etes tiek izmantotas, lai tÄ«kla politikās atlasÄ«tu aplikumus un nosaukumvietas.

ApakÅ”tÄ«kli (ipBlocks) tiek izmantoti, pārvaldot ienākoÅ”os (ieejas) vai izejoÅ”os (izejas) ārējos (ziemeļu-dienvidu) savienojumus. Piemēram, Ŕī politika tiek atvērta visiem aplikumiem no nosaukumvietas default piekļuve Google DNS pakalpojumam:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-dns
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    ports:
    - protocol: UDP
      port: 53

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

TukÅ”ais aplikumu atlasÄ«tājs Å”ajā piemērā nozÄ«mē ā€œatlasÄ«t visus aplikumus nosaukumvietāā€.

Å Ä« politika ļauj piekļūt tikai 8.8.8.8; piekļuve jebkurai citai IP ir aizliegta. Tātad bÅ«tÄ«bā jÅ«s esat bloķējis piekļuvi iekŔējam Kubernetes DNS pakalpojumam. Ja joprojām vēlaties to atvērt, skaidri norādiet to.

Parasti ipBlocks Šø podSelectors ir savstarpēji izslēdzoÅ”as, jo netiek izmantotas podziņu iekŔējās IP adreses ipBlocks. Norādot iekŔējie IP podi, jÅ«s faktiski atļausiet savienojumus uz/no podiem ar Ŕīm adresēm. Praksē jÅ«s nezināt, kuru IP adresi izmantot, tāpēc tās nevajadzētu izmantot, lai atlasÄ«tu pākstis.

Pretpiemērs: tālāk norādītā politika ietver visus IP un tādējādi ļauj piekļūt visiem citiem aplikumiem.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Varat atvērt piekļuvi tikai ārējiem IP adresēm, izņemot podziņu iekŔējās IP adreses. Piemēram, ja jÅ«su apakÅ”tÄ«kla apakÅ”tÄ«kls ir 10.16.0.0/14:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.16.0.0/14

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Porti un protokoli

Parasti podi klausās vienu portu. Tas nozÄ«mē, ka politikās var vienkārÅ”i nenorādÄ«t portu numurus un atstāt visu pēc noklusējuma. Tomēr ir ieteicams padarÄ«t politikas pēc iespējas ierobežojoŔākas, tāpēc dažos gadÄ«jumos joprojām varat norādÄ«t portus:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
      - port: 443      # <<<
        protocol: TCP  # <<<
      - port: 80       # <<<
        protocol: TCP  # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Ņemiet vērā, ka atlasÄ«tājs ports attiecas uz visiem bloka elementiem to vai from, kas satur. Lai dažādām elementu kopām norādÄ«tu dažādus portus, sadaliet ingress vai egress vairākās apakÅ”sadaļās ar to vai from un katrā reÄ£istrējiet savas ostas:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    ports:             # <<<
     - port: 443       # <<<
       protocol: TCP   # <<<
  - from:
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
     - port: 80        # <<<
       protocol: TCP   # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Ievads par Kubernetes tīkla politikām droŔības profesionāļiem

Noklusējuma porta darbība:

  • Ja pilnÄ«bā izlaižat porta definÄ«ciju (ports), tas nozÄ«mē visus protokolus un visus portus;
  • Ja izlaižat protokola definÄ«ciju (protocol), tas nozÄ«mē TCP;
  • Ja izlaižat porta definÄ«ciju (port), tas nozÄ«mē visas ostas.

Labākā prakse: nepaļaujieties uz noklusējuma vērtÄ«bām, skaidri norādiet, kas jums nepiecieÅ”ams.

LÅ«dzu, ņemiet vērā, ka jums ir jāizmanto pod porti, nevis apkalpoÅ”anas porti (vairāk par to nākamajā rindkopā).

Vai aplikācijām vai pakalpojumiem ir noteiktas politikas?

Parasti Kubernetes podi piekļūst viens otram, izmantojot pakalpojumu ā€” virtuālo slodzes balansētāju, kas novirza trafiku uz aplikācijām, kas ievieÅ” pakalpojumu. Varētu domāt, ka tÄ«kla politikas kontrolē piekļuvi pakalpojumiem, taču tas tā nav. Kubernetes tÄ«kla politikas darbojas uz pod portiem, nevis pakalpojumu portiem.

Piemēram, ja pakalpojums klausās 80. portu, bet novirza datplÅ«smu uz 8080. portu, tÄ«kla politikā ir jānorāda tieÅ”i 8080.

Šāds mehānisms jāuzskata par neoptimālu: ja pakalpojuma iekŔējā struktÅ«ra (kuru porti klausās) mainās, tÄ«kla politikas bÅ«s jāatjaunina.

Jauna arhitektÅ«ras pieeja, izmantojot Service Mesh (piemēram, par Istio skatÄ«t zemāk - apm. tulk.) ļauj tikt galā ar Å”o problēmu.

Vai ir jāreģistrē gan Ingress, gan Egress?

ÄŖsā atbilde ir jā, lai pods A varētu sazināties ar pod B, tam ir jāļauj izveidot izejoÅ”o savienojumu (Å”im nolÅ«kam ir jākonfigurē izejas politika), un podam B ir jāspēj pieņemt ienākoÅ”o savienojumu ( Å”im, attiecÄ«gi, ir nepiecieÅ”ama ieejas politika). politika).

Tomēr praksē varat paļauties uz noklusējuma politiku, lai atļautu savienojumus vienā vai abos virzienos.

Ja daži pod-avots tiks atlasÄ«ti viens vai vairāki izeja-politiÄ·i, tam uzliktos ierobežojumus noteiks viņu disjunkcija. Å ajā gadÄ«jumā jums bÅ«s skaidri jāatļauj savienojums ar pod -adresātam. Ja pods nav atlasÄ«ts nevienā politikā, tā izejoŔā (izejas) trafika ir atļauta pēc noklusējuma.

Tāpat arÄ« pāksts liktenis iradresāts, ko atlasÄ«jis viens vai vairāki iekļūŔana-politiÄ·i, noteiks viņu nesaskaņas. Å ajā gadÄ«jumā jums ir skaidri jāļauj tai saņemt trafiku no avota apkopa. Ja podziņa nav atlasÄ«ta nevienā politikā, visa tā ieejas datplÅ«sma ir atļauta pēc noklusējuma.

Skatiet zemāk.

Baļķi

Kubernetes tÄ«kla politikas nevar reÄ£istrēt trafiku. Tas apgrÅ«tina noteikt, vai politika darbojas, kā paredzēts, un ievērojami sarežģī droŔības analÄ«zi.

Trafika kontrole uz ārējiem pakalpojumiem

Kubernetes tīkla politikas neļauj norādīt pilnībā kvalificētu domēna nosaukumu (DNS) izejas sadaļās. Šis fakts rada ievērojamas neērtības, mēģinot ierobežot trafiku uz ārējiem galamērķiem, kuriem nav fiksētas IP adreses (piemēram, aws.com).

Politikas pārbaude

UgunsmÅ«ri jÅ«s brÄ«dinās vai pat atteiksies pieņemt nepareizu politiku. Kubernetes veic arÄ« dažas pārbaudes. Iestatot tÄ«kla politiku, izmantojot kubectl, Kubernetes var paziņot, ka tā ir nepareiza, un atteikties to pieņemt. Citos gadÄ«jumos Kubernetes paņems politiku un aizpildÄ«s to ar trÅ«kstoÅ”o informāciju. Tos var redzēt, izmantojot komandu:

kubernetes get networkpolicy <policy-name> -o yaml

Ņemiet vērā, ka Kubernetes validācijas sistēma nav nekļūdīga un var palaist garām dažus kļūdu veidus.

IzpildīŔana

Kubernetes pati neievieÅ” tÄ«kla politikas, bet ir tikai API vārteja, kas deleģē kontroles slogu pamatā esoÅ”ajai sistēmai, ko sauc par konteineru tÄ«kla saskarni (CNI). Politiku iestatÄ«Å”ana Kubernetes klasterÄ«, nepieŔķirot atbilstoÅ”o CNI, ir tāda pati kā politiku izveide ugunsmÅ«ra pārvaldÄ«bas serverÄ«, pēc tam tās neinstalējot ugunsmÅ«ros. JÅ«su ziņā ir nodroÅ”ināt pienācÄ«gu CNI vai, Kubernetes platformu gadÄ«jumā, mitināt mākonÄ«. (jÅ«s varat redzēt pakalpojumu sniedzēju sarakstu Å”eit ā€” apm. trans.), iespējojiet tÄ«kla politikas, kas iestatÄ«s CNI jÅ«su vietā.

Ņemiet vērā, ka Kubernetes nebrÄ«dinās, ja iestatÄ«siet tÄ«kla politiku bez atbilstoÅ”a palÄ«ga CNI.

Pavalstnieks vai bezvalstnieks?

Visi Kubernetes CNI, ar kuriem esmu saskārusies, ir statusa (piemēram, Calico izmanto Linux conntrack). Tas ļauj podam saņemt atbildes uz uzsākto TCP savienojumu, to neizveidojot no jauna. Taču man nav zināms Kubernetes standarts, kas garantētu valstiskumu.

Uzlabota droŔības politikas pārvaldība

Šeit ir daži veidi, kā uzlabot droŔības politikas izpildi Kubernetes:

  1. Service Mesh arhitektūras modelis izmanto blakusvāģu konteinerus, lai sniegtu detalizētu telemetriju un satiksmes kontroli servisa līmenī. Kā piemēru varam ņemt Istio.
  2. Daži CNI pārdevēji ir paplaÅ”inājuÅ”i savus rÄ«kus, lai pārsniegtu Kubernetes tÄ«kla politikas.
  3. Tufins Orka NodroŔina Kubernetes tīkla politiku redzamību un automatizāciju.

Tufin Orca pakotne pārvalda Kubernetes tÄ«kla politikas (un ir iepriekÅ” minēto ekrānuzņēmumu avots).

papildu informācija

Secinājums

Kubernetes tÄ«kla politikas piedāvā labu rÄ«ku komplektu klasteru segmentÄ“Å”anai, taču tās nav intuitÄ«vas un tām ir daudz smalkumu. Å Ä«s sarežģītÄ«bas dēļ es uzskatu, ka daudzas esoŔās klasteru politikas ir kļūdainas. Iespējamie Ŕīs problēmas risinājumi ietver politikas definÄ«ciju automatizāciju vai citu segmentācijas rÄ«ku izmantoÅ”anu.

Ceru, ka Ŕī rokasgrāmata palÄ«dzēs noskaidrot dažus jautājumus un atrisināt iespējamās problēmas.

PS no tulka

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru