
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 
(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 , et luua see klusteris:
kubectl create -f policy.yamlVÔrgu poliitika spetsifikatsioon
Kubernetes'i vÔrgu poliitika spetsifikatsioon hÔlmab nelja elementi:
-
podSelector: mÀÀratleb pod'id, mida see poliitika mĂ”jutab (objektid) â kohustuslik; -
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; -
ingress: mÀÀratleb lubatud sissevoolu liiklus siht-pod'idesse â valikuline; -
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 

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.yamlSoovitan 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 
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 

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.

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 
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 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 
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 
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.

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 
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 
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 
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 
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 

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 
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 
3. Erinevad poliitikad ĂŒhendatakse samuti loogilise VĂI-tega
Ent nende ĂŒhendamise puhul on ĂŒks piirang, millele : 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 
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 
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 
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: v2Sama 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 
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 
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 
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 
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 
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 yamlPange 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 â 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:
- Teenuse Meshi arhitektuurimuster kasutab sidecar-konteinereid, et tagada pÔhjalik telemeetrija ning liikluse kontroll teenuste tasemel. NÀiteks vÔib tuua .
- MĂ”ned CNI pakkujad on tĂ€iendanud oma tööriistu nii, et need ĂŒletavad Kubernetes'e vĂ”rgu poliitikaid.
- 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:
- âTagasi mikroteenuste juurde koos Istioâgaâ: , , ;
- âIllustreeritud juhend Kuberneteses olevate vĂ”rkude seadistamiseksâ: , ;
- «»;
- «»;
- «».
Allikas: habr.com
