
MĂ€rkus tĂ”lke kohta.: Artikli autor Reuven Harrison omab ĂŒle 20 aasta tarkvaraarenduse kogemust ning on praegu Tufin'i tehniline direktor ja kaasasutaja, kes loob turvapoliitikate haldamise lahendusi. Kuigi ta peab Kubernetes'e vĂ”rgu poliitikaid piisavalt vĂ”imsaks, et neist saaks kasutada vĂ”rgu segmenteerimist klasteris, arvab ta siiski, et need ei ole praktikas nii lihtsad rakendada. See ulatuslik materjal on mĂ”eldud spetsialistide teadlikkuse tĂ”stmiseks ning nende abistamiseks vajalike konfiguratsioonide loomisel.
TĂ€napĂ€eval valivad jĂ€rjest rohkem ettevĂ”tteid Kubernetes'e oma rakenduste kĂ€ivitamiseks. Huvi selle tarkvara vastu on nii kĂ”rge, et mĂ”ned nimetavad Kubernetes'e âuueks operatsioonisĂŒsteemiks andmekeskustesâ. Aja jooksul hakatakse Kubernetes'e (vĂ”i k8s) pidama Ă€ri kriitiliselt oluliseks osaks, mis nĂ”uab kĂŒpsete Ă€ri protsesside korraldamist, sealhulgas vĂ”rgu turvalisuse tagamist.
KĂŒberturbe spetsialistidele, kes seisavad silmitsi Kubernetes'e kasutamisega, vĂ”ib tĂ”eliseks ĂŒllatuseks olla selle platvormi vaikimisi poliitika: lubada kĂ”ike.
See juhend aitab mĂ”ista vĂ”rgu poliitikate sisemist ĂŒlesehitust ja selles eristumist tavaliste tulemĂŒĂŒride reeglitest. RÀÀgitakse ka mĂ”nest takistustest ning antakse soovitusi, mis aitavad kaitsta rakendusi Kubernetes'es.
Kubernetes'e vÔrgu poliitikad
Kubernetes'e vĂ”rgu poliitikate mehhanism vĂ”imaldab hallata rakenduste vahelisi suhteid vĂ”rgu tasandil (kolmas tase OSI mudelis). VĂ”rgu poliitikad on ilma mĂ”nede kaasaegsete tulemĂŒĂŒride edasijĂ”udnud omadusteta, nagu seitsmenda taseme OSI kontroll ja ohu tuvastamine, kuid need tagavad pĂ”hilise vĂ”rgu turvalisuse taseme, mis on hea alguspunkt.
VÔrgu poliitikad kontrollivad suhtlemist pod'ide vahel
Kubernetesis jaotatakse töökoormused pod'ide vahel, mis koosnevad ĂŒhest vĂ”i mitmest ĂŒhiselt rakendatud konteinerist. Kubernetes mÀÀrab igale podâile IP-aadressi, mis on teiste pod'ide jaoks ligipÀÀsetav. Kubernetes' vĂ”rgupoliitikad mÀÀravad juurdepÀÀsuĂ”igused pod'ide rĂŒhmadele sarnaselt sellele, kuidas pilveteenused kasutavad turberĂŒhmi virtuaalmasinatele juurdepÀÀsu haldamiseks.
VÔrgupoliitikate mÀÀratlemine
Nagu kÔik teised Kubernetes'i ressurssidest, on vÔrgupoliitikad mÀÀratletud YAML keeles. Allolevas nÀites avatakse rakendusele balance 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 
(MÀrkus tÔlke kohta.: see ekraanipilt, nagu kÔik jÀrgnevad sarnased, on loodud mitte Kubernetes'i originaalitootmisvahendite abil, vaid Tufin Orca tööriista kaudu, mille arendust toetab originaali artikli autor ja mis mainitakse materjali lÔpus.
Oma vĂ”rgupoliitika mÀÀratlemiseks on vajalikud pĂ”hiteadmised YAML-ist. See keel pĂ”hineb sissetĂ”mbeindentatsioonil (mida mÀÀravad tĂŒhikud, mitte tabulaatorid). Indentatsiooniga element kuulub kĂ”ige lĂ€hemale indentatsiooniga elemendile, mis on selle kohal. Uus loendi element algab sidekriipsuga, kĂ”ik teised elemendid nĂ€evad vĂ€lja vĂ”tme-vÀÀrtuse paar.
YAML-is poliitika mÀÀratlemise jÀrel kasutage , et luua see klastris:
kubectl create -f policy.yamlVÔrgupoliitika spetsifikatsioon
Kubernetes'i vÔrgupoliitika spetsifikatsioon sisaldab nelja elementi:
-
podSelector: mÀÀratleb pod'id, mida see poliitika mĂ”jutab (eesmĂ€rgid) â kohustuslik; -
policyTypes: nĂ€itab, milliseid poliitikate tĂŒĂŒpe see sisaldab: ingress ja/vĂ”i egress â valikuline, kuid soovitan seda kĂ”igil juhtudel selgelt vĂ€lja tuua; -
ingress: mÀÀratleb lubatud sisenemine sihtpod'idesse â valikuline; -
egress: mÀÀratleb lubatud vĂ€ljuv liiklus sihtpod'idest â valikuline.
NÀide, mis on saadud Kubernetes'i saidilt (ma vahetasin role . Tundub, et app), nÀitab, kuidas kasutatakse kÔiki nelja 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 

Pange tĂ€hele, et kĂ”iki nelja elementi ei pea lisama. Kohustuslik on ainult podSelector, ĂŒlejÀÀnud parameetreid saab kasutada soovi korral.
Kui jÀtta vÀlja policyTypes, tÔlgendatakse poliitikat jÀrgmiselt:
- Vaikimisi eeldatakse, et see mÀÀratleb ingress-osa. Kui poliitikas ei ole selgeid juhiseid selle kohta, peab sĂŒsteem seda tulu keelama.
- Egress-osa kÀitumine mÀÀratakse vastava egress-parameetri olemasolu vÔi puudumise jÀrgi.
Vigade vÀltimiseks soovitan alati selgelt mÀÀrata policyTypes.
Ălaltoodud loogika kohaselt, juhul kui parameetrid ingress ja/or egress on vĂ€lja jĂ€etud, keelab poliitika kogu liikluse (vt "Puhastamise reegel" allpool).
Vaikimisi poliitika on lubada
Kui poliitikat ei ole mÀÀratud, lubab Kubernetes vaikimisi kogu liikluse. KĂ”ik podâid saavad omavahel vabalt teavet vahetada. Turvalisuse seisukohalt vĂ”ib see tunduda loogikavĂ€line, kuid pidage meeles, et Kubernetes loodi algselt arendajate poolt rakenduste suhtlemise vĂ”imaldamiseks. VĂ”rgupoliitikad lisati hiljem.
Nimi
Nimi (Namespaces) on Kubernetes'i koostöö mehhanism. Neid kasutatakse loogiliste keskkondade ĂŒksteisest eristamiseks, samas on andmevahetus nimede vahel vaikimisi lubatud.
Nagu enamik Kubernetes'i komponente, elavad vÔrgu poliitikad teatud nimes. Plokis metadata vÔib mÀÀrata, kellele poliitika kuulub:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: my-namespace # <<<
spec:
... Kui nimes ei ole metaandmetes selgelt mÀÀratud, kasutab sĂŒsteem kubectlis mÀÀratud namespace'i (vaikimisi namespace=default):
kubectl apply -n my-namespace -f namespace.yamlSoovitan selgelt mÀÀrata namespace, kui te ei kirjuta poliitikat, mis on mÔeldud kohe mitme nimeala jaoks.
PÔhi element podSelector poliitikas valitakse pod'id selle nimeala seest, kuhu poliitika kuulub (tal ei ole juurdepÀÀsu pod'idele teistest nimealadest).
Sarnaselt podSelector'itele ingress ja egress plokkides vĂ”ivad valida pod'e ainult oma nimealast, kui te neid ei ĂŒhenda namespaceSelector selle kohta rÀÀgitakse peatĂŒkis 'Filtreerimine nimealade ja pod'ide jĂ€rgi'.
Poliitika nimereeglid
Poliitika nimed on unikaalsed ĂŒhe nimeala raames. Ăhes nimealas ei saa olla kahte sama nimega poliitikat, kuid eri nimealade vahel vĂ”ivad olla poliitikad sama nimega. See on mugav, kui soovite sama poliitikat mitmetes nimealades uuesti rakendada.
Mulle meeldib eriti ĂŒks nimede mÀÀramise viis. See seisneb selles, et kombineerida nimeala nimi sihtpod'idega. 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 
MĂ€rgid
Kubernetes objektidele, nagu pod'id ja nimealad, saab kinnitada kohandatud mĂ€rgid. MĂ€rgid (labels â etiketid) on sarnased pilvemĂ€rkmetele. Kubernetes vĂ”rgupoliitikad kasutavad mĂ€rke valiku tegemiseks pod'ide, millele neid rakendatakse:
podSelector:
matchLabels:
role: db⊠vÔi nimealasid, millele neid rakendatakse. Selles nÀites valitakse kÔik pod'id nimeala, millel on vastavad mÀrgid:
namespaceSelector:
matchLabels:
project: myproject Ăks ettevaatusabinĂ”u: kui kasutate namespaceSelector , veenduge, et valitud nimealad sisaldavad soovitud mĂ€rki. Pidage meeles, et sisseehitatud nimealad, nagu SeejĂ€rel kĂ€ivitame exec kĂ€su ja ootame 5000 sekundit, et jĂ€tkata jĂ€lgimist: ja kubectl -n kube-system edit cm kubelet-config-1.16, ei sisalda vaikimisi mĂ€rke.
Nimele saab lisada mÀrgi jÀrgmiselt:
kubectl label namespace default namespace=default Sel juhul peab nimeala jaotises metadata viitama tegelikule nimeala nimetusele, mitte mÀrgile:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default # <<<
spec:
...Allikas ja adressaat
Firewall'i poliitikad koosnevad reeglitest, millel on allikad ja sihtkohad. Kubernetes'e vĂ”rgupoliitikad mÀÀratletakse eesmĂ€rgi jaoks - podâide kogum, millele need kehtivad, ja seejĂ€rel kehtestatakse reeglid sissetuleva (ingress) ja/vĂ”i vĂ€ljamineva (egress) liikluse jaoks. Meie nĂ€ites on poliitika eesmĂ€rgiks kĂ”ik pod'id kubernetes'e nimede vahel. SeejĂ€rel kĂ€ivitame exec kĂ€su ja ootame 5000 sekundit, et jĂ€tkata jĂ€lgimist: mĂ€rgiga, millel on vĂ”ti app ja vÀÀrtusega . Teenuse vĂ”rgud lahendavad sarnaseid probleeme tavaliselt mTLS-i kaudu: sertifikaadid on antud juhul olulise identifikaatorina.:
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 

Alam ingress selles poliitikas avab sissetuleva liikluse sihtpod'idele. TeisisÔnu, ingress on allikas ning siht on sobiv adressaat. Sarnaselt on egress adressaat ja siht tema allikas.

See on ekvivalent kahe firewall'i reegli jaoks: Ingress â EesmĂ€rk; EesmĂ€rk â Egress.
Egress ja DNS (tÀhtis!)
VĂ€ljamineva liikluse piiramisel, 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 rakendusele lubanud balance suhelda DNS-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
policyTypes:
- Egress 
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 
Viimane element to â tĂŒhi, ja seega valib see kaudselt kĂ”ik pod'id kĂ”igis nimede vahel, vĂ”imaldades balance saata DNS-pĂ€ringud vastavale Kubernetes teenusele (see töötab tavaliselt nimede vahel) kubectl -n kube-system edit cm kubelet-config-1.16).
See lÀhenemine toimib, however it on liiga lubav ja ebaturvaline, kuna see vÔimaldab suunata DNS-pÀringud klastrist vÀljapoole.
Seda saab paranda kolme jÀrjestikuse sammuga.
1. Lubage DNS-pÀringud ainult sees klastri, lisades 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 
2. Lubage DNS-pÀringute tegemiseks ainult nimetuste ruumis kubectl -n kube-system edit cm kubelet-config-1.16.
Selleks tuleb lisada silt nimetuste ruumi kubectl -n kube-system edit cm kubelet-config-1.16: kubectl label namespace kube-system namespace=kube-system â ja mÀÀrata see poliitika kaudu 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 
3. Paranoikud vÔivad minna veelgi kaugemale ja piirata DNS-pÀringute tegemist kindla DNS-teenusega kubectl -n kube-system edit cm kubelet-config-1.16. Jaotises "Filtreeri nimetuste ruumide ja podide jÀrgi" rÀÀgitakse, kuidas seda saavutada.
Teine variant on lubada DNS nimetuste 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 nimetuste ruumis.

Esimene vastavus ja reeglite jÀrjekord
TavapĂ€rastel tulemĂŒĂŒridel mÀÀratakse paketi suhtes tegevus ("Luba" vĂ”i "Keela") esimesele reeglile, millele see vastab. Kuberneteses pole poliitikate jĂ€rjekorral mingit tĂ€hendust.
Vaikimisi, kui poliitikaid pole mÀÀratud, on suhtlemine pod'ide vahel lubatud ja nad saavad vabalt teavet vahetada. Niipea, kui hakkate poliitikaid formuleerima, muutub iga pod, mida mĂ”jutab vĂ€hemalt ĂŒks neist, eraldatuks vastavalt kĂ”igi juurde valitud poliitikate disjunktsioonile (loogiline V). Pod'id, mis ei ole ĂŒhegi poliitikaga seotud, jÀÀvad avatuks.
Sarnast kÀitumist saab muuta puhastusreegli abil.
Puhastusreegel ("Keela")
TulemĂŒĂŒride poliitikad keelavad tavaliselt kĂ”ik selgelt mitte lubatud liikluse.
Kuberneteses ei ole "keela" tegevust, kuid sarnase efekti saab saavutada tavapĂ€rase (lubava) poliitika kaudu, valides tĂŒhja pod'ide allika grupi (ingress):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress 
See kasutuspoliitika valib kÔik pod'id nimesse ja jÀtab ingress'i mÀÀratlemata, keelates kogu sissetuleva liikluse.
Sarnasel viisil on vÔimalik piirata kogu vÀljuvat liiklust nimestikus:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress 
Pange tĂ€hele, et kĂ”ik tĂ€iendavad poliitikad, mis lubavad liiklust pod'idele nimestikus, saavad selle reegli ĂŒle prioriteedi (sarnane lubava reegli lisamisega keelu reegli ette tulemĂŒĂŒris).
Luba kÔik (Any-Any-Any-Allow)
Selleks, et luua "Luba kĂ”ik" poliitika, on vaja tĂ€iendavalt lisada ĂŒlaltoodud keelu poliitikale tĂŒhi element ingress:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
namespace: default
spec:
podSelector: {}
ingress: # <<<
- {} # <<<
policyTypes:
- Ingress 
See avab juurdepÀÀsu kÔikidest pod'idest kÔigis nimestikes (ja kÔikidest IP-dest) igale pod'ile nimestikus . Selline kÀitumine on vaikimisi lubatud, seega ei pea seda tavaliselt tÀiendavalt mÀÀratlema. Siiski vÔib mÔnikord osutuda vajalikuks mÔne spetsiifilise loa ajutine keelamine probleemi diagnostika jaoks. SeejÀrel kÀivitame exec kÀsu ja ootame 5000 sekundit, et jÀtkata jÀlgimist:Reeglit saab kitsendada ja lubada juurdepÀÀs ainult
mÔningatele mÀÀratud pod'idele app:balance () nimestikusapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-to-balance namespace: default spec: podSelector: matchLabels: app: balance ingress: - {} policyTypes: - Ingress SeejÀrel kÀivitame exec kÀsu ja ootame 5000 sekundit, et jÀtkata jÀlgimist::
JÀrgmine poliitika lubab kogu sissetuleva (ingress) ja vÀljuva (egress) liikluse, sealhulgas juurdepÀÀsu igale IP-le klastrist vÀljas: 
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} ingress: - {} egress: - {} policyTypes: - Ingress - Egress
Mitme poliitika ĂŒhendamine 

Poliitikad ĂŒhendatakse loogilise VĂI abil kolmel tasemel; iga pod'i loakombinatsioon mÀÀratakse kĂ”igi poliitikate dĂŒsjunksiooni pĂ”hjal, mis sellele mĂ”juvad:
1. VĂ€li
saab mÀÀrata kolme tĂŒĂŒbi elemente (kĂ”ik need on kombineeritud VĂI abil): from ja to â valib nimesse tervikuna;
-
namespaceSelectorâ valib pod'id; -
podSelectoripBlock -
â valib alamvĂ”rgu.Kuid elementide (isegi sama) arv alampunktides
ei ole piiratud. KĂ”ik need ĂŒhendatakse loogilise VĂI abil. from/to piiramatu. KĂ”ik need ĂŒhendatakse loogilise VĂI-operatsiooniga.
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 
2. Jagamise poliitika sees ingress vĂ”ib sisaldada mitmeid elemente from (kookonduvad loogilise VĂI abil). Samamoodi vĂ”ib jagamise osa egress ka sisaldada mitmeid elemente to (samuti kookonduvad 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 
3. Erinevaid poliitikaid ĂŒhendatakse samuti loogilise VĂI abil
Kuid nende ĂŒhendamisel on ĂŒks piirang, millele : Kubernetes vĂ”ib poliitikad kombineerida ainult erinevatega policyTypes (Ingress vĂ”i VĂ€ljaminev). Poliitikad, mis mÀÀratlevad sisendi (vĂ”i vĂ€ljundi), kirjutavad ĂŒksteist ĂŒle.
Ruumi vahel
Vaikimisi on teabe vahetamine ruumide vahel lubatud. Seda saab muuta piirava poliitikaga, mis piirab vÀljaminevat ja/vÔi sisenevat liiklust ruumi (vt 'Puhastamise reegel' eespool).
Piirates juurdepÀÀsu ruumile (vt 'Puhastamise reegel' eespool), saate teha erandeid piiravas poliitikas, lubades ĂŒhendusi kindlast ruumist kaudu 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 
Tulemuseks on, et kÔik pod'id ruumis SeejÀrel kÀivitame exec kÀsu ja ootame 5000 sekundit, et jÀtkata jÀlgimist: saavad juurdepÀÀsu pod'idele postgres nimede ruumis database. Aga mis siis, kui soovite avada juurdepÀÀsu postgres ainult konkreetsetele pod'idele ruumis SeejÀrel kÀivitame exec kÀsu ja ootame 5000 sekundit, et jÀtkata jÀlgimist:?
Filtreerimine ruumide ja pod'ide jÀrgi
Kubernetes versioon 1.11 ja ĂŒhe rohkem vĂ”imaldab operaatorite kombineerimist namespaceSelector ja podSelector loogilise JA abil. See nĂ€eb vĂ€lja jĂ€rgmine:
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 
Miks see tĂ”lgendatakse kui JA, mitte tavalise VĂI-ga?
Pange tÀhele, et podSelector ei alga sidekriipsuga. YAML-is tÀhendab see, et podSelector ja selle ees namespaceSelector kuuluvad sama loendi elemendile. Seega nad kookonduvad loogilise JA abil.
Sidekriipsu lisamine ette podSelector toob viib uue nimekirja elemendi tekkimiseni, mis kombineeritakse eelnevaga namespaceSelector loogilise VĂI abil.
Kuidas valida podâe kindla sildiga kĂ”igis nimespettides, sisestage tĂŒhi 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 
Mitmed sildid kombineeritakse ja.
Mitme objekti (hostide, vĂ”rkude, rĂŒhmade) tulemĂŒĂŒrireeglid kombineeritakse loogilise VĂI abil. JĂ€rgmine reegel kehtib, kui paketi allikas vastab Host_1 VĂI Host_2:
| Allikas | Sihtkoht | Teenus | Tegevus |
| ----------------------------------------|
| Host_1 | Subnet_A | HTTPS | Luba |
| Host_2 | | | |
| ----------------------------------------| Seevastu Kuberneteses kombineeritakse erinevad sildid podSelector vĂ”i namespaceSelector loogilise ja abil. NĂ€iteks jĂ€rgnev reegel valib podâe, millel on mĂ”lemad sildid, role=db ma saan kasutada version=v2:
podSelector:
matchLabels:
role: db
version: v2Sama loogika kehtib kĂ”igi operaatorite tĂŒĂŒpide kohta: poliitika sihiselektorid, podâi selektorid ja nimespatsi selektorid.
Alamsuunad ja IP-aadressid (IPBlocks)
VĂ”rgusegmentimiseks kasutavad tulemĂŒĂŒrid VLAN-i, IP-aadresse ja alamsuundi.
Kuberneteses mÀÀratakse podâidele IP-aadressid automaatselt ja need vĂ”ivad sageli muutuda, seega kasutatakse vĂ”rgu poliitikates podâide ja nimespatside valimiseks silte.
Alamsuunad (ipBlocks) kasutatakse sisse- (ingress) vĂ”i vĂ€ljaminevate (egress) vĂ€listooted (North-South) ĂŒhenduste haldamiseks. NĂ€iteks avab see poliitika kĂ”ikidele podâidele nimespatsis SeejĂ€rel kĂ€ivitame exec kĂ€su ja ootame 5000 sekundit, et jĂ€tkata jĂ€lgimist: 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 
TĂŒhi podâi selektor nĂ€itab selles nĂ€ites "valida kĂ”ik podâid nimespatsis".
See poliitika avab juurdepÀÀsu ainult 8.8.8.8; juurdepÀÀs igale teisele IP-le on keelatud. Niisiis, olete sisuliselt DNS teenusele Kubernetes blokeerinud. Kui soovite seda siiski avada, mÀrkige see selgelt.
Tavaliselt ipBlocks ja podSelectors on vastastikku vĂ€listavad, kuna podâide sisemised IP-aadressid ei ole ipBlocks. MĂ€rkides podâide sisemised IP-aadressid, te ĂŒhendate nende aadressidega podâide vahel. Praktikas ei tea te, millist IP-aadressi kasutada, seetĂ”ttu ei tohiks neid podâide valimiseks kasutada.
Vastupidise nĂ€itena hĂ”lmab jĂ€rgmine poliitika kĂ”iki IP-sid ja seega lubab juurdepÀÀsu kĂ”ikidele muudele 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 
VĂ”ite lubada juurdepÀÀsu ainult vĂ€listele IP-dele, jĂ€ttes vĂ€lja podâide sise-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 
Pordid ja protokollid
Tavaliselt kuulavad podâid ĂŒhte porti. See tĂ€hendab, et porta numbreid ei pea poliitikates lihtsalt mĂ€rkima ja kĂ”ik vĂ”ib jĂ€tta eelvaadeks. Kuid poliitikaid on soovitatav teha vĂ”imalikult piiravaks, seetĂ”ttu on mĂ”nel juhul siiski vĂ”imalik porte mĂ€rkida:
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 
Pange tÀhele, et valija ports kehtib kÔikidele elementidele plokis to vÔi from, milles see asub. Erinevate portide mÀÀramiseks erinevate elementide kogumite jaoks jagage ingress vÔi egress mitmete alamjaotuste vahel, kus to vÔi from ja kirjeldage igas oma porte:
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 
Portide vaikimisi töö:
- Kui te jÀtate portide mÀÀratlemise tÀielikult vÀlja (
ports), tÀhendab see kÔiki protokolle ja kÔiki porte; - Kui te jÀtate protokolli mÀÀratlemise vÀlja (
protocol), tÀhendab see TCP; - Kui te jÀtate porta mÀÀratlemise vÀlja (
port), tÀhendab see kÔiki porte.
Parim praktika: Àrge toetuge vaikimisi vÀÀrtustele, mÀÀrake see, mida vajate, selgelt.
Pange tÀhele, et tuleb kasutada pod'ide porte, mitte teenuste porte (selle kohta rohkem jÀrgmises lÔigus).
Kas poliitikad on mÀÀratud pod'idele vÔi teenustele?
Tavaliselt suhtlevad Kubernetesâe pod'id omavahel teenuse kaudu â virtuaalne koormuse jagaja, mis suunab liikluse pod'ide juurde, mis teenust rakendavad. VĂ”ib arvata, et vĂ”rgupoliitikad kontrollivad juurdepÀÀsu teenustele, kuid see ei vasta tĂ”ele. Kubernetesâe vĂ”rgupoliitikad töötavad pod'ide portidega, mitte teenuste portidega.
NÀiteks, kui teenus kuulab 80. porti, kuid suunab liikluse oma pod'ide 8080. porti, tuleb vÔrgupoliitikas mÀrkida just 8080.
Sarnast mehhanismi tuleb tunnustada mitteoptimaalsena: teenuse sisemise struktuuri muutes (mille portidele pod'id vÀlja kuulavad) tuleb samas uuendada ka vÔrgupoliitikaid.
Uus arhitektuuriline lĂ€henemine Service Meshâi kasutuselevĂ”tuga (nĂ€iteks vaata allpool Istio kohta â toimetaja mĂ€rkus.) lahendab selle probleemi.
Kas on vajalik mÀÀrata nii Ingress kui Egress?
LĂŒhike vastus â jah, et pod A saaks pod B-ga suhelda, peab tal olema lubatud luua vĂ€ljaminev ĂŒhendus (selleks tuleb seadistada egress-poliitika) ja pod B-l peab olema vĂ”imalus vastu vĂ”tta sisenemist (seega on vajalik ingress-poliitika).
Praktikas vĂ”ib aga toetuda vaikimisi poliitikale, mis lubab ĂŒhendusi ĂŒhes vĂ”i mĂ”lemas suunas.
Kui mĂ”ni pod-allikas valitakse ĂŒhe vĂ”i mitme egress-poliitika poolt, siis tema suhtes kehtivad piirangud mÀÀratakse nende disjunktiooniga. Sellisel juhul tuleb selgelt lubada ĂŒhendust pod'-iga-sihtpunkt. Kui pod'i ei ole valitud ĂŒhegi poliitikaga, on tema vĂ€ljaminev (egress) liiklus vaikimisi lubatud.
Sarnasel viisil mÀÀratakse pod'i-sihtpunkti, mille on valinud ĂŒhe vĂ”i mitme ingress-poliitika, saatus nende disjunktiooniga. Sellisel juhul tuleb selgelt lubada saada liiklust pod'ilt-allikalt. Kui pod'i ei ole valitud ĂŒhegi poliitikaga, on kogu sissetulev (ingress) liiklus tema jaoks vaikimisi lubatud.
Vaata punkti "Stateful vÔi Stateless" allpool.
Logid
Kubernetesâe vĂ”rgupoliitikad ei oska logida liiklust. See muudab keeruliseks kindlaks teha, kas poliitika töötab korrektselt, ja raskendab oluliselt turvavaldkonna analĂŒĂŒsi.
Kontroll liikluse ĂŒle vĂ€liste teenuste suunas.
Kubernetesi vĂ”rgupoliitikad ei vĂ”imalda mÀÀrata tĂ€ielikku domeeninime (DNS) egressi sektsioonides. See tekitab mĂ€rkimisvÀÀrset ebamugavust, kui ĂŒritatakse piirata liiklust vĂ€listesse sihtkohtadesse, mis ei oma staatilist IP-aadressi (nt aws.com).
Politika kontrollimine
TulekahjusĂŒsteemid teavitavad teid vĂ”i keelduda isegi vale poliitika kinnitamist. Kubernetes viib samuti lĂ€bi teatud valideerimise. Kui mÀÀrate vĂ”rgupoliitika lĂ€bi kubectl, vĂ”ib Kubernetes vĂ€ita, et see on vale ja keelduda selle aktsepteerimisest. Teistes olukordades aktsepteerib Kubernetes poliitikat ja tĂ€iendab puuduvate detailidega. Need on nĂ€htavad jĂ€rgmisel kĂ€sklusel:
kubernetes get networkpolicy -o yamlPange tĂ€hele, et Kubernetes kontrollimisseade ei ole infallible ja vĂ”ib mĂ”ningaid tĂŒĂŒpe vigu mööda lasta.
Teostus
Kubernetes ei teosta vĂ”rgupoliitikaid iseseisvalt, vaid on lihtsalt API-lĂŒli, mis asetab kontrollimise koorma alumisele sĂŒsteemile, mida nimetatakse Container Networking Interface (CNI). Politike mÀÀramine Kubernetes klastris ilma vastava CNI mÀÀramata on sarnane politikumireeglite loomisele tulekahjusĂŒsteemi haldussĂŒsteemis nende hilisema seadistamise puudumisega. Te peate ise veenduma, et teil on piisav CNI vĂ”i, kui tegemist on pilves baseeruva Kubernetes platvormiga, (teenusepakkujate nimekirjaga saab tutvuda â tĂ”lkija mĂ€rkus), rakendama vĂ”rgupoliitikaid, mis seadistavad CNI teie jaoks.
Pange tÀhele, et Kubernetes ei teavita teid, kui mÀÀrate vÔrgupoliitika ilma vastava abistava CNI-ta.
Stateful vÔi Stateless?
KĂ”ik Kubernetes CNI-d, millega olen kokku puutunud, sĂ€ilitavad olekut (nĂ€iteks Calico kasutab Linuxi conntrack'i). See vĂ”imaldab pod'il saada vastuseid algatatud TCP-ĂŒhendusele ilma selle uuesti loomise vajaduseta. Siiski ei ole mulle teada, et eksisteeriks Kubernetes'e standard, mis garantiib oleku sĂ€ilitamise (statefulness).
EdasijÔudnud turvapostustamise haldamine
Siin on mÔned viisid, kuidas tÔsta turvapostustamise tÀitmise efektiivsust Kubernetes'is:
- TeenusevĂ”rgu arhitektuurimuster kasutab sidecar konteinerite abil ĂŒksikasjalikku telemeetriat ja liikluse juhtimist teenuste tasandil. NĂ€itena vĂ”ib tuua .
- MĂ”ned CNI teenusepakkujad on tĂ€iendanud oma tööriistu, et need ĂŒletaksid Kubernetes'i vĂ”rgupoliitikat.
- tagab Kubernetes'i vÔrgupoliitikate lÀbipaistvuse ja automatiseerimise.
Tufin Orca paketiga hallatakse Kubernetes'i vĂ”rgupoliitikaid (ja see teenib allikana ĂŒlaltoodud ekraanipilte).
Lisainformatsioon
- ;
- ;
- ;
- .
KokkuvÔte
Kubernetes'i vĂ”rgupoliitikad pakuvad korralikku tööriistakomplekti klastrite segmentimiseks, kuid need on intuitiivselt mitte arusaadavad ja sisaldavad palju nĂŒansse. Arvan, et nende keerukuse tĂ”ttu paljudes olemasolevates klastrites on vigu. Probleemi lahenduste hulka kuulub poliitikate mÀÀratlemise automatiseerimine vĂ”i muude segmentimisvahendite rakendamine.
Loodan, et see juhend aitab selgitada mĂ”ningaid kĂŒsimusi ja lahendada probleeme, millega vĂ”ite silmitsi seista.
P.S. tÔlkijalt
Lugege ka meie blogist:
- "Tagasi mikroteenustele koos Istio": , , ;
- «Kubernetese vĂ”rgu ĂŒlesehituse illustreeritud juhend»: , ;
- «»;
- «»;
- «».
Allikas: habr.com
