Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

MĂ€rk. tĂ”lge.: Artikli autor Reuven Harrisonil on ĂŒle 20 aasta tarkvaraarenduse kogemust ning ta on praegu Tufini tehniline direktor ja kaasasutaja, mis loob turvapoliitikate haldamise lahendusi. Vaadates Kubernetes'e vĂ”rgu poliitikaid kui piisavalt vĂ”imekat vahendit vĂ”rgu segmentimiseks klastris, peab ta samas neid praktikas rakendamiseks keerukateks. KĂ€esolev materjal (pĂ€ris mahukas) on mĂ”eldud spetsialistide teadlikkuse tĂ”stmiseks selles kĂŒsimuses ja aitama neil luua vajalikke konfiguratsioone.

TĂ€napĂ€eval valivad ĂŒha rohkem ettevĂ”tteid Kubernetes'e oma rakenduste kĂ€ivitamiseks. Huvi selle tarkvara vastu on nii suur, et osa inimesi nimetab Kubernetes'e 'uueks operatsioonisĂŒsteemiks andmekeskustes'. Aja jooksul hakka Kubernetes (vĂ”i k8s) olema tajutud kui kriitiliselt oluline osa Ă€rist, mis vajab kĂŒpsete Ă€ri protsesside korraldamist, sealhulgas vĂ”rgu turvalisuse tagamist.

KĂŒbergansside spetsialistidele vĂ”ib Kubernetes'i platvormi vaikimisi poliitika, mis lubab kĂ”ike, osutuda tĂ”eliselt avardavaks.

See juhend aitab mĂ”ista vĂ”rgu poliitikate sisemist toimimist; selgitades, kuidas need erinevad tavaliste tulemĂŒĂŒri reeglitega. Tutvustatakse ka mĂ”ningaid lĂ”kse ja antakse soovitusi, mis aitavad kaitsta rakendusi Kubernetes'is.

Kubernetes'i vÔrgu poliitikad

Kubernetes'i vĂ”rgu poliitikate mehhanism vĂ”imaldab hallata platvormil tegevuses olevate rakenduste vahelist suhtlemist vĂ”rgutasemel (OSi mudeli kolmas tase). VĂ”rgu poliitikad ei paku mĂ”ningaid moodsate tulemĂŒĂŒride edasijĂ”udnud funktsioone, nagu seitsmenda OSi tasandi kontroll ja ohu avastamine, kuid need tagavad pĂ”hitaseme vĂ”rgu turvalisuse, olles hea alguspunkt.

VĂ”rgu poliitikad kontrollivad pod'ide vahelisi sideĂŒhendusi.

Kubernetesis jaotatakse koormus pod'ide vahel, mis koosnevad ĂŒhest vĂ”i mitmest konteinerist, mis on koos juurutatud. Kubernetes mÀÀrab igale pod'ile IP-aadressi, mis on teiste pod'ide jaoks saadaval. Kubernetes'i vĂ”rgu poliitikad mÀÀratlevad pÀÀsutingimused pod'ide gruppide jaoks, sarnaselt sellele, kuidas pilves kasutatavad turvagruppide mÀÀratakse virtuaalmasinate eksemplaride pÀÀsu haldamiseks.

VÔrgu poliitikate mÀÀratlemine

Nagu kÔik muud Kubernetes'i ressursid, mÀÀratakse vÔrgu poliitikad YAML keeles. JÀrgnevas nÀites rakendusele balance antakse juurdepÀÀs 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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

(MÀrk. tÔlge.: see ekraanipilt, nagu ka kÔik jÀrgmised sarnased, on loodud mitte Kubernetes'i natiivsete vahenditega, vaid tööriista Tufin Orca abil, mille arendamise taga on ettevÔte, kes on originaali autori ning mis mainitakse materjali lÔpus.

Oma vĂ”rgu poliitika mÀÀratlemiseks on vajalik pĂ”hiteadmised YAML-ist. See keel pĂ”hineb sisu jaotamisel (mille mÀÀravad tĂŒhikud, mitte tabulaatorid). Idendi tĂ€hendusega elemendi alluvus tuleneb lĂ€himast sama taseme elemendist. Uus loendi element algab kriipsuga, kĂ”ik teised elemendid on kujul. vĂ”ti-vÀÀrtus.

YAML-is poliitika kirjeldamisel kasutage kubectl, et luua see klusteris:

kubectl create -f policy.yaml

VÔrgu poliitika spetsifikatsioon

Kubernetes'i vÔrgu poliitika spetsifikatsioon hÔlmab nelja elementi:

  1. podSelector: mÀÀratleb pod'id, mida see poliitika mĂ”jutab (objektid) — kohustuslik;
  2. policyTypes: nĂ€itab, milliseid poliitikate tĂŒĂŒpe see hĂ”lmab: ingress ja/vĂ”i egress — valikuline, kuid soovitan seda kĂ”igis juhtudel selgelt mĂ€rgata;
  3. ingress: mÀÀratleb lubatud sissevoolu liiklus siht-pod'idesse — valikuline;
  4. egress: mÀÀratleb lubatud vĂ€ljaminev liiklus siht-pod'ist — valikuline.

NÀide, mis on laenatud Kubernetes'i saidilt (ma asendasin role jÀrgnevaga app), nÀitab, kuidas kasutatakse kÔik neli 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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele
Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Pange tĂ€hele, et kĂ”igi nelja elementi kaasamine ei ole kohustuslik. Kohustuslik on ainult podSelector, ĂŒlejÀÀnud parameetreid vĂ”ib kasutada vastavalt soovile.

Kui jÀtta vÀlja policyTypes, tÔlgendatakse poliitikat jÀrgmiselt:

  • Eeldatakse, et see mÀÀratleb ingress-poole. Kui poliitikas ei ole selgeid juhiseid, loetakse, et kogu liiklus on keelatud.
  • Egress-poole kĂ€itumist mÀÀratakse vastava egress-parameetri olemasolu vĂ”i puudumisega.

Vigade vÀltimiseks soovitan alati selgelt nÀidata policyTypes.

Ülaltoodud loogika kohaselt, kui parameetrid ingress ja/vĂ”i egress jĂ€etakse vĂ€lja, keelab poliitika kogu liikluse (vt "Koristamisreeglit" allpool).

Vaikimisi poliitika — lubada

Kui poliitikaid ei ole mÀÀratud, Kubernetes lubab vaikimisi kogu liikluse. KĂ”ik pod’id saavad vabalt omavahel teavet jagada. Turvalisuse vaatepunktist vĂ”ib see tunduda loogikast vĂ€ljas, kuid pidage meeles, et Kubernetes loodi algselt arendajate poolt rakenduste koostöö tagamiseks. VĂ”rgupoliitikaid lisati hiljem.

Nimekirjad

Nimekirjad (Namespaces) on Kubernetes’i koostöö mehhanism. Need on ette nĂ€htud loogiliste keskkondade ĂŒksteisest eristamiseks, samal ajal kui andmevahetus nimekirjade vahel on vaikimisi lubatud.

Nagu enamus Kubernetes’i komponente, elavad vĂ”rgupoliitikad teatud nimekirjas. Plokis metadata saab mÀÀrata, millisele nimekirjale poliitika kuulub:

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

Kui nimekirja metainformatsioonis ei ole selgelt mÀÀratud, kasutab sĂŒsteem kubectl’is mĂ€rgitud nimekirja (vaikimisi namespace=default):

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

Soovitan selgelt mÀÀrata nimekirja, kui te ei kirjuta poliitikat, mis on mÔeldud kohe mitmele nimede ruumile.

Peamine element podSelector poliitikas valib pod'e sellest nimede ruumist, kuhu poliitika kuulub (tal ei ole juurdepÀÀsu teiste nimede ruumide pod'idele).

Sarnasel moel podSelector'id ingress ja egress plokkides vĂ”ivad valida pod'e ainult oma nimede ruumist, vĂ€lja arvatud juhul, kui te ĂŒhendate need namespaceSelector'iga (sellest rÀÀgitakse jaotises „Filtreerimine nimede ruumide ja pod'ide kaudu“).

Poliitikate nimetamise reeglid

Poliitikate nimed on ĂŒhes nimede ruumis ainulaadsed. Kahel poliitikal ei saa olla sama nime ĂŒhes ruumis, kuid erinevates ruumides vĂ”ivad olla poliitikad sama nimega. See on mugav, kui soovite sama poliitikat mitu korda rakendada.

Mulle meeldib eriti ĂŒks nimetamisviis. See seisneb nimede ruumi ja sihipĂ€raste pod'ide ĂŒhendamises. NĂ€iteks:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Sildid

Kubernetesi objektidele, nagu pod-id ja nimed, saab lisada kohandatud silte. Sildid (labels — etiketid) on sarnased pĂ€istele pilves. Kubernetesi vĂ”rgupoliitikad kasutavad silte valimiseks pod'id, millele need rakendatakse:

podSelector:
  matchLabels:
    role: db


 vÔi nimed, millele need rakendatakse. Antud nÀites valitakse kÔik pod-id nimedes, millel on vastavad sildid:

namespaceSelector:
  matchLabels:
    project: myproject

Üks hoiatus: kasutamisel namespaceSelector'iga veenduge, et valitud nimed sisaldavad vajalikke silte. Pidage meeles, et vaikimisi nimed, nagu default ja kube-system, ei sisalda endas silte.

Nime lisamiseks nimele vÔite teha jÀrgmist:

kubectl label namespace default namespace=default

Siiski peab nimi jaotises metadata viitama tegelikule nimele, mitte sildile:

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

Allikas ja adressaat

TulemĂŒĂŒripoliitikad koosnevad reeglitest, millel on allikad ja sihtkohad. Kubernetes'i vĂ”rgu poliitikad mÀÀratlevad sihtmĂ€rkide - pod'ide komplekti, millele need kehtivad, ja seejĂ€rel kehtestavad reeglid sissetuleva (ingress) ja/vĂ”i vĂ€ljuva (egress) liikluse jaoks. Meie nĂ€ites on poliitika sihtmĂ€rk kĂ”ik pod'id nimede ruumis default mĂ€rgisega, mille vĂ”tme app ja vÀÀrtusega 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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele
Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Alam ingress selles poliitikas avab sissetulev liiklus sihitud pod'idesse. TeisisÔnu, ingress on allikas, samas kui sihtmÀrk on vastav sihtkoht. Sarnaselt on egress sihtkoht, samas kui sihtmÀrk on selle allikas.

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

See on ekvivalent kahe reegliga tulemĂŒĂŒrile: Ingress → SihtmĂ€rk; SihtmĂ€rk → Egress.

Egress ja DNS (tÀhtis!)

Piirates vĂ€ljuvat liiklust, pöörake erilist tĂ€helepanu DNS-ile — Kubernetes kasutab seda teenust teenuste sidumiseks IP-aadressidega. NĂ€iteks jĂ€rgmine poliitika ei tööta, kuna te ei ole lubanud rakendusel balance Pöörduda DNS-i poole:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Seda saab parandada, avades juurdepÀÀsu DNS-teenusele:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Viimane element to — tĂŒhi, ja seetĂ”ttu valib see kaudset kĂ”ik pod'id kĂ”igis nimede ruumides, lubades balance saata DNS-pĂ€ringud vastavasse Kubernetes teenusesse (tavaliselt töötab see ruumis kube-system).

See lĂ€henemine töötab, kuid see on ĂŒlemÀÀra lubav ja ebaturvaline, kuna vĂ”imaldab suunata DNS-pĂ€ringud klastrist vĂ€lja.

Seda saab tÀiustada kolme jÀrjestikuse sammuga.

1. Lubada DNS-pÀringud ainult sisemine klastri, lisades namespaceSelector'iga:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

2. Lubage DNS-pÀringud ainult nimede ruumis kube-system.

Selleks tuleb lisada silt nime ruumi kube-system: kubectl label namespace kube-system namespace=kube-system — ja mÀÀrata see poliitikasse kasutades namespaceSelector'iga:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

3. Paranoikud vĂ”ivad minna veelgi kaugemale ja piirata DNS-pĂ€ringuid konkreetse DNS-teenusega kube-system. Jaotises „Filter nime ruumide ja pod’ide jĂ€rgi“ rÀÀgitakse, kuidas seda saavutada.

Teine vÔimalus on lubada DNS nime ruumi tasemel. Sel juhul ei pea seda avama iga teenuse jaoks:

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

TĂŒhi podSelector valib kĂ”ik pod'id nimede ruumis.

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Esimene vastavus ja reeglite jÀrjekord

Tavalistes tulemĂŒĂŒrides mÀÀrab paketi tegevuse ("Lubada" vĂ”i "Keelata") esimene reegel, millele see vastab. Kuberneteses ei oma poliitikate jĂ€rjekord mingit tĂ€htsust.

Vaikimisi, kui poliitikad pole mÀÀratud, on pod'ide vaheline suhtlus lubatud ja nad saavad vabalt teavet vahetada. Kui hakkate poliitikaid koostama, muutub iga pod, mida mĂ”jutab vĂ€hemalt ĂŒks neist, isoleerituks vastavalt nende valitud poliitikate disjunktsioonile (loogiline VÕI). Pod'id, mida ei mĂ”juta ĂŒkski poliitika, jÀÀvad avatuks.

Sarnast kÀitumist saab muuta puhastamisreegliga.

Puhastamisreegel ("Keelata")

TulemĂŒĂŒride poliitikad keelavad tavaliselt iga asjaolu, mis ei ole selgelt lubatud.

Kuberneteses ei ole "keelata" (deny) tegevust, kuid sarnast mĂ”ju saab saavutada tavalise (lubava) poliitika abil, valides tĂŒhi pod'ide-allika (ingress) rĂŒhma:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

See policy valib kÔik pod'id nimede ruumis ja jÀtab ingress mÀÀratlemata, keelates kogu sissetuleva liikluse.

Sarnasel moel saab piirata kogu vÀljaminevat liiklust nimede ruumist:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Pange tĂ€hele, et igal tĂ€iendaval poliitikal, mis lubab liiklust pod'idesse nimede ruumis, on prioriteet selle reegli ees (sarnane lubava reegli lisamisega enne keelavat reeglit tulemĂŒĂŒris).

Luba kÔik (Any-Any-Any-Allow)

Kuna luua poliitika «Luba kĂ”ik», on soovitatav tĂ€iendada ĂŒlaltoodud keelu poliitikat tĂŒhja elemendiga ingress:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

See avab ligipÀÀsu kĂ”igist pod'idest kĂ”igis nimede ruumides (ja kĂ”ik IP) mistahes pod'idele nimede ruumis default. Sarnane kĂ€itumine on vaikimisi sisse lĂŒlitatud, seega tavaliselt ei ole seda vaja veelkord mÀÀratleda. Siiski vĂ”ib mĂ”nikord olla vajalik ajutine teatud lubade keelamine probleemi tĂ”rkeotsimiseks.

Reegelit saab kitsendada ja lubada juurdepÀÀsu ainult teatud hulgale pod'idele (app:balance) nimede ruumis default:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

JÀrgmine poliiitika lubab kogu sissetulevat (ingress) ja vÀljaminevat (egress) liiklust, sealhulgas juurdepÀÀsu mis tahes IP-le klastrist vÀljaspool:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele
Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Mitmete poliitikate ĂŒhendamine

Poliitikad ĂŒhendatakse loogiliste OR abil kolme taseme kaudu; iga pod'i lubamine mÀÀratakse kĂ”igi poliitikate disjunktsiooni alusel, mis seda mĂ”jutavad:

1. Valdkondades from ja to saab mÀÀrata kolme tĂŒĂŒpi elemente (kĂ”ik need kombineeritakse loogilise OR abil):

  • namespaceSelector'iga — valib nimede ruumi tĂ€ielikult;
  • podSelector — valib pod'id;
  • ipBlock — valib alamvĂ”rgu.

Sellega on elementide arv (isegi samade) osade hulgas from/to piiratud. KĂ”ik need ĂŒhendatakse loogilise OR abil.

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

2. Poliitika sees ingress vĂ”ib sisaldada mitmeid elemente from (need ĂŒhendatakse loogilise VÕI-tega). Sarnaselt vĂ”ib osa egress sisaldada mitmeid elemente to (need ĂŒhendatakse samuti disjunktsiooniga):

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

3. Erinevad poliitikad ĂŒhendatakse samuti loogilise VÕI-tega

Ent nende ĂŒhendamise puhul on ĂŒks piirang, millele et Chris Cooney: Kubernetes suudab kombineerida poliitikaid ainult erinevate policyTypes (Ingress vĂ”i Egress). Poliitikad, mis mÀÀratlevad ingress (vĂ”i egress), kirjutavad ĂŒksteist ĂŒle.

Nimekiri ruumide vahel

Vaikimisi on teabevahetus nimekiri ruumide vahel lubatud. Seda saab muuta piirava poliitikaga, mis piirab vĂ€ljaminevat ja/ vĂ”i sisenevat liiklust nimekirja ruumis (vt "Puhastusreegel" ĂŒlal).

Blokeerides juurdepÀÀsu nimeserverisse (vt „Korrigeerimise reegel“ ĂŒleval), saate teha erandeid keelu poliitikas, lubades ĂŒhendusi kindlast nimeserverist. namespaceSelector'iga:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Tulemuseks on see, et kÔik pod'id nimeserveris default saavad juurdepÀÀsu pod'idele postgres nimeserveris database. Aga mis siis, kui soovite avada juurdepÀÀsu postgres ainult konkreetsetele pod'idele nimeserveris default?

Filtreerimine nimeserverite ja pod'ide jÀrgi

Kubernetes versioonis 1.11 ja kÔrgem vÔimaldab kombineerida operaatorid namespaceSelector'iga ja podSelector kasutades loogilist JA. See nÀeb vÀlja nii:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Miks see tĂ”lgendatakse kui JA, mitte tavapĂ€raseks VÕI?

Pange tÀhele, et podSelector ei alga kriipsust. YAML-is tÀhendab see, et podSelector ja selle ees namespaceSelector'iga kuuluvad samasse listi elementi. SeetÔttu liidetakse need loogilise JA-ga.

Kriipsu lisamine enne podSelector toob endaga kaasa uue loendi elementi, mis kombineeritakse eelnevaga namespaceSelector'iga loogilise VÕI abil.

Kuna valida pod'e kindla sildi jĂ€rgi kĂ”igis nimede ruumides, jĂ€tke tĂŒhjaks namespaceSelector'iga:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Mitmed sillad ĂŒhendatakse VÕI-ga

TulekahjusĂŒsteemi reeglid mitme objekti (hostide, vĂ”rkude, rĂŒhmade) jaoks kombineeritakse loogilise VÕI abil. JĂ€rgmine reegel rakendub, kui paketi allikas vastab Host_1 VÕI Host_2:

| Allikas | Sihtkoht | Teenus | Tegevus |
| ----------------------------------------|
| Host_1 | AlamsĂŒsteem_A | HTTPS | Luba |
| Host_2 |             |         |        |
| ----------------------------------------|

Teiseks, Kubernetesis erinevad sillad podSelector vÔi namespaceSelector'iga kombineeritakse loogilise JA abil. NÀiteks jÀrgmine reegel valib pod'e, millel on mÔlemad sillad, role=db JA version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

Sama loogika kehtib kĂ”igi operaatorite tĂŒĂŒpide kohta: poliitika sihiselektsioonide, pod'i valikute ja nimede ruumide valikute puhul.

AlamsĂŒsteemid ja IP-aadressid (IPBlocks)

VLAN-e, IP-aadresse ja alamvĂ”rgud on brankdĂŒĂŒsi kasutamiseks vĂ”rgu segmentimiseks.

Kubernetesis mÀÀratakse IP-aadressid pod'idele automaatselt ja need vÔivad sageli muutuda, seetÔttu kasutatakse pod'ide ja nimede ruumide valimiseks vÔrgu poliitikates silte.

AlamvĂ”rgud (ipBlocks) kasutatakse sisenemise (ingress) vĂ”i vĂ€ljumise (egress) vĂ€lise (PĂ”hja-LĂ”una) ĂŒhenduste haldamiseks. NĂ€iteks avab see poliitika kĂ”igile pod'idele nimede ruumis default juurdepÀÀsu Google'i DNS-teenusele:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

KĂ€esoleval nĂ€itel tĂ€histab tĂŒhi pod'ide valija "vali kĂ”ik pod'id nimede ruumis".

See poliitika avab pÀÀsu ainult 8.8.8.8; juurdepÀÀs mistahes muule IP-le on keelatud. Seega olete sisuliselt blokeerinud juurdepÀÀsu Kubernetes'e sisemisele DNS-teenusele. Kui soovite selle avada, tehke seda selgelt.

Tavaliselt ipBlocks ja podSelectors on vastastikku vĂ€listavad, kuna sisemisi IP-aadresse pod'ide kohta ei kasutata ipBlocks. MÀÀrates sisemised IP pod'ide, te фаĐștiivselt lubate ĂŒhendusi pod'ide ja nende aadresside vahel. Praktiliselt ei tea te, millist IP-aadressi kasutada, seetĂ”ttu ei tasu neid pod'ide valimiseks kasutada.

NÀiteks sisaldab jÀrgmine poliitika kÔiki IP-aadresse ja seega lubab ligipÀÀsu kÔigile teistele pod'idele:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

VÔimalik on avada ligipÀÀs ainult vÀlistele IP-dele, jÀttes vÀlja pod'ide sisemised IP-aadressid. NÀiteks, kui teie pod'i alamvÔrk on 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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Pordid ja protokollid

Tavaliselt kuulavad pod'id ĂŒhte porti. See tĂ€hendab, et portide numbreid ei pea poliitikates lihtsalt mÀÀrama ja saab jĂ€tta kĂ”ik vaikeseadetele. Siiski on soovitatav poliitikad teha vĂ”imalikult piiravad, seega vĂ”ib mĂ”nel juhul portide tĂ€psustamine olla vajalik:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

MÀrge, et valija ports kÔikidele elementidele plokis to vÔi from, kus see asub. Erinevate elementide koguste jaoks erinevate portide mÀÀramiseks jagage ingress vÔi egress mitmeks alajaoks koos to vÔi from ja igas mÀÀrake oma pordid:

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

Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele

Portide vaikimisi töö:

  • Kui jĂ€tate pordi mÀÀratlemise tĂ€ielikult vĂ€lja (ports), tĂ€hendab see kĂ”iki protokolle ja kĂ”iki porte;
  • Kui jĂ€tate protokolli mÀÀratlemise vĂ€lja (protocol), tĂ€hendab see TCP;
  • Kui jĂ€tate pordi (port) mÀÀratlemise vĂ€lja, tĂ€hendab see kĂ”iki porte.

Parim praktika: Àrge toetuge vaikevÀÀrtustele, mÀÀrake vajalikud vÀÀrtused selgelt.

Pange tÀhele, et tuleb kasutada pod'ide porte, mitte teenuste omi (tÀiendav teave jÀrgmises lÔigus).

Kas poliitikad on mÀÀratletud pod'ide vÔi teenuste jaoks?

Tavaliselt suhtlevad pod'id Kubernetes'es omavahel teenuste kaudu — virtuaalse koormuse tasakaalustaja, mis suunab liiklust pod'idele, mis teenust rakendavad. VĂ”ib arvata, et vĂ”rgupoliitikad kontrollivad juurdepÀÀsu teenustele, kuid see pole nii. Kubernetes'e vĂ”rgupoliitikad töötavad pod'ide portidega, mitte teenuste portidega.

NÀiteks, kui teenus kuulab 80. porti, kuid suunab liiklust oma pod'ide 8080. porti, tuleb vÔrgupoliitikas mÀÀrata just 8080.

Sarnast mehhanismi tuleks pidada mitteoptimaalseks: teenuse sisemiste seadete muutumisel (mille porti kuulavad pod'id) tuleb vÔrgupoliitikaid uuendada.

Uus arhitektuuriline lĂ€henemine Service Mesh'i kasutamisega (nĂ€iteks vaadake Istio kohta allpool — tĂ”lkija mĂ€rkus) lahendab selle probleemi.

Kas on vajalik mÀÀrata nii Ingress kui ka Egress?

LĂŒhike vastus on ja, et pod A saaks suhelda pod B-ga, peab tal olema lubatud luua vĂ€ljuv ĂŒhendus (selleks tuleb seadistada egress-poliitika) ning pod B-l peab olema vĂ”imalik vastu vĂ”tta sissetulev ĂŒhendus (seega on vajalik ingress-poliitika).

Kuid praktikas vĂ”ib toetuda vaikimisi poliitikale, mis lubab ĂŒhendusi ĂŒhes vĂ”i mĂ”lemas suunas.

Kui mĂ”ni pod-allikas valitakse ĂŒhe vĂ”i mitme egress-poliitika kaudu, siis sellele kehtestatud piirangud mÀÀravad nende disjunktsioon. Sellisel juhul tuleb selgesĂ”naliselt lubada ĂŒhendus pod-adressaat. Kui pod ei ole valitud ĂŒhegi poliitika tĂ”ttu, on tema vĂ€ljuv (egress) liiklus vaikimisi lubatud.

Sarnaselt sĂ”ltub pod-adressaat, mille on valinud ĂŒhe vĂ”i mitme ingress-poliitika, nende disjunktsioonist. Sellisel juhul tuleb selgesĂ”naliselt lubada tal vastu vĂ”tta liiklust pod-ennetlest. Kui pod ei ole valitud ĂŒhegi poliitika tĂ”ttu, on kogu sissetulev (ingress) liiklus talle vaikimisi lubatud.

Vaata allpool punkti "Stateful vÔi Stateless".

Logid

Kubenetide poliitikad ei suuda liiklust logida. See raskendab poliitika tÔhususe mÀÀratlemist ja takistab oluliselt turvauuringute tegemist.

Liikluse kontroll vÀlistesse teenustesse

Kubenetide poliitikad ei vĂ”imalda mÀÀrata tĂ€isvormingus domeeninime (DNS) vĂ€ljumiste (egress) osades. See pĂ”hjustab mĂ€rkimisvÀÀrset ebamugavust, kui pĂŒĂŒtakse piirata liiklust vĂ€listele adressaatidele, kellel puudub staatiline IP-aadress (nĂ€iteks aws.com).

Poliitika kontrollimine

TulemĂŒĂŒri seadmed teavitavad teid vĂ”i isegi keelduvad vale poliitika vastuvĂ”tmisest. Kubernetes viib samuti lĂ€bi teatavaid kontrollimisi. Kui seadistada vĂ”rgupoliitika lĂ€bi kubectl, vĂ”ib Kubernetes vĂ€ita, et see on vale ja keelduda selle vastuvĂ”tmisest. Teistes olukordades vĂ”tab Kubernetes poliitika vastu ja tĂ€idab puuduvaid andmeid. Neid saab vaadata jĂ€rgmise kĂ€su abil:

kubernetes get networkpolicy  -o yaml

Pange tĂ€hele, et Kubernetes kontrollimisprotsess ei ole eksimustest vaba ja vĂ”ib jĂ€tta tĂ€helepanuta mĂ”ned tĂŒĂŒbid vigu.

Teostus

Kubernetes ei rakenda vĂ”rgu poliitikaid iseseisvalt, vaid toimib vaid API-lĂŒĂŒsina, jĂ€ttes koormava kontrollitöö allolevale sĂŒsteemile, mida tuntakse kui Container Networking Interface (CNI). Poliitikate seadmine Kubernetes klastris ilma vastava CNI mÀÀramiseta on sarnane poliitikate loomisega tulemĂŒĂŒride juhtimisse, ilma et need hiljem tulemĂŒĂŒridesse installitaks. Te peate ise veenduma, et teil on sobiv CNI vĂ”i, juhul kui Kubernetes platvormi pakutakse pilves, (vĂ”ite tutvuda teenusepakkujate nimekirjaga siit — tĂ”lkija mĂ€rkus.), rakendama vĂ”rgu poliitikaid, mis seadistavad CNI teie eest.

Pange tÀhele, et Kubernetes ei hoiatada teid, kui mÀÀrate vÔrgu poliitika, ilma et vastav toimetav CNI oleks olemas.

Stateful vÔi Stateless?

KĂ”ik CNI-d, millega olen kokku puutunud, salvestavad olekuid (nĂ€iteks Calico kasutab Linuxi conntrack). See vĂ”imaldab pod'il saada vastuseid tema alustatud TCP-ĂŒhendusele, ilma et oleks vaja seda uuesti kehtestada. Samas ei ole mulle teada Kubernetes'e standardit, mis garanteeriks olekute sĂ€ilitamise (statefulness).

Edasiarenenud turvapoliitika haldamine

Siin on mÔned viisid, kuidas tÔsta turvapoliitika tÀitmise efektiivsust Kuberneteses:

  1. Teenuse Meshi arhitektuurimuster kasutab sidecar-konteinereid, et tagada pÔhjalik telemeetrija ning liikluse kontroll teenuste tasemel. NÀiteks vÔib tuua Istio.
  2. MĂ”ned CNI pakkujad on tĂ€iendanud oma tööriistu nii, et need ĂŒletavad Kubernetes'e vĂ”rgu poliitikaid.
  3. Tufin Orca tagab Kubernetes'e vÔrgu poliitikate lÀbipaistvuse ja automatiseerimise.

Tufin Orca pakett haldab Kubernetes'e vÔrgu poliitikaid (ja toimib eespool toodud ekraanipiltide allikana).

Lisainformatsioon

KokkuvÔte

Kubernetesi vĂ”rgupoliitikad pakuvad head tööriistade kogumit klastrite segmenteerimiseks, kuid need on intuitsioonilt keerulised ja neil on palju nĂŒansse. Arvan, et selle keerukuse tĂ”ttu sisaldavad paljude olemasolevate klastrite poliitikad vigu. Selle probleemi vĂ”imalikud lahendused on poliitikate mÀÀratlemise automatiseerimine vĂ”i teiste segmenteerimisvahendite rakendamine.

Loodan, et see juhend aitab selgitada mĂ”ned kĂŒsimused ja lahendada probleemid, millega vĂ”ite kokku puutuda.

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster