Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

ShĂ«n. pĂ«rk.: Autori i artikullit — Reuven Harrison — ka mĂ« shumĂ« se 20 vjet pĂ«rvojĂ« nĂ« zhvillimin e softuerit dhe aktualisht Ă«shtĂ« drejtori teknik dhe bashkĂ«themelues i kompanisĂ« Tufin, e cila krijon zgjidhje pĂ«r menaxhimin e politikave tĂ« sigurisĂ«. Duke e parĂ« politikĂ«n rrjetore tĂ« Kubernetes si njĂ« mjet mjaft tĂ« fuqishĂ«m pĂ«r segmentimin e rrjetit brenda njĂ« klasteri, ai gjithashtu beson se ato nuk janĂ« aq tĂ« lehta pĂ«r t'u zbatuar nĂ« praktikĂ«. Ky material (mjaft i gjerĂ«) ka pĂ«r qĂ«llim tĂ« rrisĂ« ndĂ«rgjegjĂ«simin e profesionistĂ«ve mbi kĂ«tĂ« çështje dhe tĂ« ndihmojĂ« ata nĂ« krijimin e konfigurimeve tĂ« nevojshme.

Sot, shumë kompani po e zgjedhin gjithnjë e më shpesh Kubernetes për të ekzekutuar aplikacionet e tyre. Interesi për këtë software është aq i lartë, sa disa e quajnë Kubernetes "sistemi i ri operativ për qendrat e të dhënave". Me kalimin e kohës, Kubernetes (ose k8s) fillon të perceptohet si një pjesë thelbësore e biznesit që kërkon organizimin e proceseve të zhvilluara të biznesit, duke përfshirë sigurimin e sigurisë rrjetore.

Për profesionistët e sigurisë që janë të shqetësuar nga puna me Kubernetes, politika e këtij platforme për parazgjedhje mund të jetë një zgjidhje e vërtetë: të lejohet çdo gjë.

Ky udhëzues do të ndihmojë në kuptimin e brendësisë së politikave rrjetore; do të shpjegojë se si dallohen ato nga rregullat për firewalle të zakonshme. Gjithashtu, do të përmenden disa pengesa dhe do të jepen rekomandime që ndihmojnë në mbrojtjen e aplikacioneve në Kubernetes.

Politikat rrjetore të Kubernetes

Mekanizmi i politikave rrjetore të Kubernetes lejon menaxhimin e ndërveprimeve të aplikacioneve të vendosura në platformë në nivelin rrjetor (nivi i tretë në modelin OSI). Politikat rrjetore nuk kanë disa karakteristika të avancuara të firewalleve moderne, si kontrolli në nivelin 7 të OSI dhe zbulesa e kërcënimeve, megjithatë ato ofrojnë një nivel të bazës së sigurisë rrjetore, që shërben si një pikë e mirë nisjeje.

Politikat rrjetore kontrollojnë komunikimet midis pod'ave

Ngarkesat në Kubernetes shpërndahen në pod-e, të cilat përbëhen nga një ose më shumë kontejnerë të vendosur së bashku. Kubernetes i jep secilit pod një adresë IP, e cila është e disponueshme nga pod-të e tjera. Politikat rrjetore të Kubernetes përcaktojnë të drejtat e aksesit për grupe pod-esh në të njëjtën mënyrë si grupet e sigurisë në re përdoren për të menaxhuar aksesin në instancat e makinave virtuale.

Definimi i politikave rrjetore

Si dhe burimet e tjera të Kubernetes, politikave rrjetore u janë caktuar në gjuhën YAML. Në shembullin më poshtë, aplikacioni balance i jepet akses në 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

(Shën. përk.: ky ekran i kapur, ashtu si të gjithë imazhet e ngjashme që do të pasojnë, është krijuar jo me mjetet native të Kubernetes, por me ndihmën e mjetit Tufin Orca, i cili është zhvilluar nga kompania e autorit të artikullit origjinal dhe përmendet në fund të materialit.

Për të përcaktuar politikën tuaj të rrjetit, do të nevojiten njohuri bazike të YAML. Ky gjuhë është e bazuar në hapësira (të përcaktuara me hapësira, jo me tab). Një element me hapësirë i përket elementit më të afërt me hapësirë në të sipërme. Një element i ri i listës fillon me një defis, të gjithë elementët e tjerë kanë formën çelës-vlerë.

Pasi të keni përshkruar politikën në YAML, përdorni kubectl, për ta krijuar atë në klasterin:

kubectl create -f policy.yaml

Specifikimi i politikës së rrjetit

Specifikimi i politikës së rrjetit Kubernetes përfshin katër elemente:

  1. podSelector: pĂ«rcakton pod’ët e prekur nga kjo politikĂ« (objektet) - obligatorike;
  2. policyTypes: tregon se cilat lloje politikash janë të përfshira në këtë: ingress dhe/apo egress - opcionale, megjithatë rekomandoj ta shkruani qartë në të gjitha rastet;
  3. ingress: pĂ«rcakton trafikun e lejuar tĂ« ardhshĂ«m nĂ« pod’ët e synuara - opcionale;
  4. egress: pĂ«rcakton trafikun e lejuar trafiku i daljes nga pod’ët e synuara - opcionale.

Një shembull, e marrë nga faqja Kubernetes (unë e zëvendësova role në app), tregon se si përdoren të katër elementët:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë
Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Kiniçon përshtatni se të katër elementët janë të panevojshme. Të detyrueshëm është vetëm podSelector, parametrat tjerë mund të përdoren sipas dëshirës.

Nëse lihet jashtë policyTypes, politika do të interpretohet si më poshtë:

  • Default, supozohet se ajo definon anĂ«n e ingress. NĂ«se nĂ« politikĂ« nuk ka udhĂ«zime tĂ« qarta pĂ«r kĂ«tĂ«, sistemi do ta konsiderojĂ« se tĂ« gjithĂ« trafiku Ă«shtĂ« i ndaluar.
  • Sjellja nĂ« anĂ«n e egress do tĂ« pĂ«rcaktohet nga pranimi ose mungesa e parametrave pĂ«rkatĂ«s tĂ« egress.

Për të shmangur gabimet, rekomandoj të citohet gjithmonë qartë policyTypes.

Sipas logjikës së mësipërme, në rast se parametrat ingress dhe/ose egress janë lënë jashtë, politika do të ndalojë të gjithë trafikun (shih "Rregulli i pastrimit" më poshtë).

Politika e parazgjedhur - lejo

NĂ«se politikat nuk janĂ« tĂ« pĂ«rcaktuara, Kubernetes lejon pĂ«r nga default çdo trafik. TĂ« gjitha pod’ët mund tĂ« komunikojnĂ« lirisht mes tyre. Nga njĂ« kĂ«ndvĂ«shtrim sigurie, kjo mund tĂ« duket irracionale, por mbani nĂ« mend se Kubernetes Ă«shtĂ« krijuar fillimisht nga zhvilluesit pĂ«r tĂ« siguruar ndĂ«rveprimin e aplikacioneve. Politikat e rrjetit janĂ« shtuar mĂ« vonĂ«.

Hapësirat emërore

Hapësirat emërore (Namespaces) janë mekanizmi i bashkëpunimit në Kubernetes. Ato janë të destinuara për të izoluara ambientet logjike nga njëra-tjetra, ndërkohë që ndarja e të dhënave mes hapësirave nga default lejohet.

Si shumica e komponenteve të Kubernetes, politikat e rrjetit jetojnë në një hapësirë të caktuar emërore. Në bllokun metadata mund të shkruhet se kujt hapësire i përket politika:

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

Nëse hapësira emërore në metadata nuk është shprehur qartë, sistemi do të përdorë hapësirën emërore të caktuar në kubectl (nga default namespace=default):

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

Unë rekomandoj të specifikohet qartë hapësira emërore, përveç nëse po shkruani një politikë që është e destinuar për disa hapësira emri njëherësh.

Themelor element podSelector nĂ« politikĂ« do tĂ« zgjedhĂ« pod’ë nga hapĂ«sira emri tĂ« cilĂ«s i pĂ«rket politika (ai nuk ka akses nĂ« pod’ët nga hapĂ«sira tjetĂ«r emri).

Po ashtu podSelector’ët nĂ« blloqet ingress dhe egress mund tĂ« zgjedhin pod’ë vetĂ«m nga hapĂ«sira e tyre emri, pĂ«rveç nĂ«se nuk i bashkoni ato me namespaceSelector (pĂ«r kĂ«tĂ« do tĂ« flitet nĂ« seksionin 'Filtrimi sipas hapĂ«sirave emri dhe pod’ëve').

Rregullat e emërtesës së politikave

Emrat e politikave janë unikë brenda një hapësire emri. Dy politika me të njëjtën emër në një hapësirë nuk mund të ekzistojnë, por mund të ketë politika me emra të njëjtë në hapësira të ndryshme. Kjo është e dobishme kur dëshironi të përsërisni të njëjtën politikë në disa hapësira.

MĂ« pĂ«lqeu veçanĂ«risht njĂ« nga metodat e emĂ«rtesĂ«s. Kjo pĂ«rfshin kombinimin e emrit tĂ« hapĂ«sirĂ«s emri me pod’ët target.

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Etiketat

Etiketat mund tĂ« bashkĂ«ngjiten objekteve Kubernetes si pod-Ă«t dhe hapĂ«sirat emĂ«rore. Etiketat (etiketat — shenjat) janĂ« ekuivalenti i etiketave nĂ« re. Politikat e rrjetit tĂ« Kubernetes pĂ«rdorin etiketat pĂ«r tĂ« pĂ«rzgjedhur pod'Ă«t, tĂ« cilave ata iu referohen:

podSelector:
  matchLabels:
    role: db


 ose hapësirat emërore, të cilave ata iu referohen. Në këtë shembull, përzgjidhen të gjitha pod-ët në hapësirat emërore me etiketat përkatëse:

namespaceSelector:
  matchLabels:
    project: myproject

Një këshillë: gjatë përdorimit namespaceSelector sigurohuni që hapësirat emërore të përzgjedhura përmbajnë etiketën e duhur. Mbani mend se hapësirat emërore të integruara si default dhe kubectl -n kube-system edit cm kubelet-config-1.16, në mënyrë të paracaktuar, nuk përmbajnë etiketa.

Për të shtuar një etiketë në hapësirën emërore, mund ta bëni si më poshtë:

kubectl label namespace default namespace=default

Në këtë rast, hapësira në seksionin metadata duhet të referohet në emrin aktual të hapësirës, jo në etiketë:

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

Burimi dhe adresati

Politikat pĂ«r firewalls pĂ«rbĂ«hen nga rregulla me burime dhe adresat. Politikat rrjetore Kubernetes pĂ«rcaktohen pĂ«r njĂ« qĂ«llim - njĂ« grup tĂ« pod’ave, tĂ« cilĂ«ve iu aplikohen, dhe pastaj vendosin rregulla pĂ«r trafikun e ardhshĂ«m (ingress) dhe/ose tĂ« dalshĂ«m (egress). NĂ« shembullin tonĂ«, qĂ«llimi i politikĂ«s do tĂ« jetĂ« tĂ« gjitha pod’ët nĂ« hapĂ«sirĂ«n emĂ«rore default me etiketĂ« me çelĂ«sin app dhe vlerĂ«n 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë
Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

NĂ«nseksioni ingress nĂ« kĂ«tĂ« politikĂ« hap trafikun e ardhshĂ«m nĂ« pod’ët e synuar. Me fjalĂ« tĂ« tjera, ingress vepron si burim, ndĂ«rsa qĂ«llimi Ă«shtĂ« adresati pĂ«rkatĂ«s. Po ashtu, egress Ă«shtĂ« adresati, dhe qĂ«llimi Ă«shtĂ« burimi i tij.

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Kjo Ă«shtĂ« ekuivalente me dy rregulla pĂ«r firewalls: Ingress → QĂ«llim; QĂ«llim → Egress.

Egress dhe DNS (është e rëndësishme!)

Duke kufizuar trafikun e dalshĂ«m, kushtojini vĂ«mendje tĂ« veçantĂ« DNS — Kubernetes e pĂ«rdor kĂ«tĂ« shĂ«rbim pĂ«r tĂ« lidhur shĂ«rbimet me adresat IP. PĂ«r shembull, politika e mĂ«poshtme nuk do tĂ« funksionojĂ«, pasi nuk e lejoni aplikacionin balance tĂ« aksesojĂ« 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Mund ta rregulloni këtë duke hapur aksesin në shërbimin 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
  - to:               # <<<<
    ports:            # <<<<
    - protocol: UDP   # <<<<
      port: 53        # <<<<
  policyTypes:
  - Egress

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Elementi i fundit to — bosh, dhe prandaj ai pĂ«rzgjedh nĂ« mĂ«nyrĂ« indirecte tĂ« gjitha pod’ët nĂ« tĂ« gjitha hapĂ«sirat e emrave, duke lejuar balance dĂ«rgimin e kĂ«rkesave DNS nĂ« shĂ«rbimin pĂ«rkatĂ«s tĂ« Kubernetes (zakonisht ai funksionon nĂ« hapĂ«sirĂ«n kubectl -n kube-system edit cm kubelet-config-1.16).

Ky qasje funksionon, megjithatë është shumë lehtësues dhe i pasigurt, pasi lejon dërgimin e kërkesave DNS jashtë klasterit.

Mund ta përmirësoni këtë me tri hapa të radhitur.

1. Lejoni kërkesat DNS vetëm brenda për klasterin, duke shtuar 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

2. Lejoni DNS-requests vetëm në hapësirën e emrave kubectl -n kube-system edit cm kubelet-config-1.16.

PĂ«r kĂ«tĂ« duhet tĂ« shtoni njĂ« etiketĂ« nĂ« hapĂ«sirĂ«n e emrave kubectl -n kube-system edit cm kubelet-config-1.16: kubectl label namespace kube-system namespace=kube-system — dhe ta pĂ«rfshini nĂ« politikĂ«n me 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

3. ParanoikĂ«t mund tĂ« shkojnĂ« edhe mĂ« tej dhe tĂ« kufizojnĂ« DNS-requests pĂ«r njĂ« shĂ«rbim tĂ« caktuar DNS nĂ« kubectl -n kube-system edit cm kubelet-config-1.16. NĂ« seksionin "Filtro sipas hapĂ«sirave tĂ« emrave dhe pod’ave" do tĂ« flitet pĂ«r mĂ«nyrĂ«n se si mund tĂ« arrini kĂ«tĂ«.

Një alternativë tjetër është të lejoni DNS në nivelin e hapësirës së emrave. Në këtë rast, nuk do të nevojitet që ta hapni për çdo shërbim:

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

Bosht podSelector zgjedh tĂ« gjithĂ« pod’ët nĂ« hapĂ«sirĂ«n e emrave.

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Përputhja e parë dhe rendi i rregullave

Në bllokadat e zakonshme, veprimi («Lejo» ose «Ndalo») në lidhje me paketën përcaktohet nga rregulli i parë që plotësohet. Në Kubernetes, rendi i politikave nuk ka rëndësi.

NĂ« mĂ«nyrĂ« default, kur politikatat nuk janĂ« pĂ«rcaktuar, komunikimet midis pod’ëve janĂ« tĂ« lejuara dhe ata mund tĂ« shkĂ«mbejnĂ« informacion nĂ« mĂ«nyrĂ« tĂ« lirĂ«. Sa herĂ« qĂ« filloni tĂ« formuloni politika, çdo pod qĂ« preket nga sĂ« paku njĂ«ra prej tyre bĂ«het i izoluar nĂ« pĂ«rputhje me disjunksionin (logjik O) tĂ« tĂ« gjitha politikave qĂ« e pĂ«rfshijnĂ«. Pod’ët, qĂ« nuk shqetĂ«sohen nga ndonjĂ« politikĂ«, mbeten tĂ« hapur.

I njëjti sjellje mund të ndryshohet duke përdorur një rregull pastrimi.

Rregulli i pastrimit («Ndalo»)

Politikat e bllokadave zakonisht ndalojnë çdo trafiku që nuk është lejuar në mënyrë të qartë.

NĂ« Kubernetes nuk ka veprimi «ndalo» (deny), megjithatĂ«, njĂ« efekt tĂ« ngjashĂ«m mund tĂ« arrijmĂ« me njĂ« politikĂ« tĂ« zakonshme (lejuese), duke zgjedhur njĂ« grup tĂ« zbrazĂ«t pod’ësh-burimi (ingress):

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Kjo politikĂ« zgjedh tĂ« gjithĂ« pod’ët nĂ« hapĂ«sirĂ«n e emrit dhe lĂ« ingress-in tĂ« pĂ«rcaktuar, duke ndaluar tĂ« gjithĂ« trafikun e hyrĂ«s.

Në mënyrë të ngjashme, mund të kufizoni të gjithë trafikun e dalës nga hapësira e emrit:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Mbani parasysh se politikat e tjera tĂ« saja qĂ« lejojnĂ« trafikun nĂ« pod’ët e hapĂ«sirĂ«s sĂ« emrit do tĂ« kenĂ« prioritet mbi kĂ«tĂ« rregull (ngjashĂ«m me shtimin e njĂ« rregulli lehtĂ«sues para njĂ« rregulli ndaluese nĂ« konfigurimin e firewall-it).

Lejo të gjitha (Any-Any-Any-Allow)

Për të krijuar politikën "Lejo të gjitha", duhet të plotësoni politikën ndaluese të mësipërme me një element të zbrazët ingress:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Ajo hap aksesin nga tĂ« gjithĂ« pod’ët nĂ« tĂ« gjitha hapĂ«sirat e emrit (dhe tĂ« gjitha IP) nĂ« çdo pod nĂ« hapĂ«sirĂ«n e emrit default. NjĂ« sjellje e tillĂ« Ă«shtĂ« e aktivizuar nga default, prandaj zakonisht nuk ka nevojĂ« tĂ« pĂ«rcaktohet mĂ« tej. MegjithatĂ«, ndonjĂ«herĂ« mund tĂ« jetĂ« e nevojshme tĂ« çaktivizoni pĂ«rkohĂ«sisht disa leje specifike pĂ«r tĂ« diagnostikuar njĂ« problem.

Rregulli mund tĂ« ngushtohet dhe tĂ« lejojĂ« akses vetĂ«m nĂ« njĂ« grup tĂ« caktuar pod’ash (app:balance) nĂ« hapĂ«sirĂ«n e emrave default:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Politika e mëposhtme lejon të gjithë trafikun e ardhshëm (ingress) dhe dalës (egress), duke përfshirë aksesin në çdo IP jashtë grumbullit:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë
Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Kombinimi i disa politikave

Politikat kombinohen përmes logjikës OREDHE në tri nivele; lejet për çdo pod përcaktohen në përputhje me disjunktivën e të gjitha politikave që e prekin atë:

1. Në fushat from dhe to mund të përcaktohen tre lloje elementësh (të gjithë ata kombinohen përmes OREDHE):

  • namespaceSelector — zgjat tĂ«rĂ« hapĂ«sirĂ«n e emrave;
  • podSelector — zgjat pod’ash;
  • ipBlock — zgjat nĂ«ndegĂ«n.

Në këtë rast, numri i elementëve (edhe nëse janë të njëjtë) në nënshkrime from/to nuk është i kufizuar. Të gjithë ata do të kombinohen me logjikën OREDHE.

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

2. Brendi i politikës ingress mund të ketë shumë elemente from (bashkohen me LOGJIKOREN O). Po ashtu, brendi egress mund të përfshijë shumë elemente to (po ashtu bashkohen me DISJUNKSHEN):

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

3. Politikat e ndryshme gjithashtu bashkohen me LOGJIKOREN O

Por kur ato bashkohen, ka një kufizim që caktova Chris Cooney: Kubernetes mund të kombinojë politikat vetëm me ndryshme policyTypes (Ingress ose Egress). Politikat që përcaktojnë ingress (ose egress) do të tejkalojnë njëra-tjetrën.

Lidhja ndërmjet hapësirave të emrave

Sipas parazgjedhjes, shkëmbimi i informacionit ndërmjet hapësirave të emrave është i lejuar. Këtë mund ta ndryshoni me një politikë ndaluese që do të kufizojë trafikun dalës dhe/ose hyjës në hapësirën e emrit (shih 'Rregulli i pastrimit' më lart).

Duke bllokuar q ì ‘ê·Œin nĂ« hapĂ«sirĂ«n e emrave (shih „Rregullin e pastrimit“ mĂ« lart), mund tĂ« bĂ«ni pĂ«rjashtime nga politika ndaluese duke lejuar lidhjet nga njĂ« hapĂ«sirĂ« emrash tĂ« caktuar me 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Si rezultat, të gjitha pod'ët në hapësirën e emrave default do të kenë akses në pod'ët postgres në hapësirën e emrave database. Por çfarë nëse dëshironi të hapni aksesin në postgres vetëm pod'ë të caktuara në hapësirën e emrave default?

Filtër sipas hapësirave të emrave dhe pod'ëve

Kubernetes version 1.11 dhe më lart lejon kombinimin e operatorëve namespaceSelector dhe podSelector me anë të logjikës AND. Kjo duket kështu:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Pse e shikon këtë si AND në vend të zakonshmës OR?

Merrni parasysh se podSelector nuk fillon me një pikë. Në YAML kjo do të thotë që podSelector dhe elementi që i paraprinig namespaceSelector i përkasin të njëjtit element të listës. Prandaj ato bashkohen me logjikën AND.

Shtimi i një hije para podSelector do të sjellë krijimin e një elementi të ri të listës, i cili do të kombinohet me atë që e parakalon namespaceSelector nëpërmjet logjikës ORE.

PĂ«r tĂ« zgjedhur pod’ët me njĂ« etikĂ«t e caktuar nĂ« tĂ« gjitha hapĂ«sirat e emrave, shkruani bosh 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Etiketat multiple kombinohen me AND

Rregullat për firewall me shumë objektiva (host, rrjete, grupe) kombinohen me logjikën ORE. Rregulli në vijim do të funksionojë nëse burimi i paketës përputhet me Host_1 OSE Host_2:

| Burimi | Destinacioni | Shërbimi | Veprimi |
| ----------------------------------------|
| Host_1 | Subnet_A    | HTTPS   | Lejo  |
| Host_2 |             |         |        |
| ----------------------------------------|

Nga ana tjetĂ«r, nĂ« Kubernetes etiketat e ndryshme nĂ« podSelector ose namespaceSelector kombinohen me logjikĂ«n AND. PĂ«r shembull, rregulli nĂ« vijim do tĂ« zgjedhĂ« pod’ët qĂ« kanĂ« tĂ« dy etiketat role=db DHE version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

E njĂ«jta logjikĂ« zbatohet pĂ«r tĂ« gjithĂ« llojet e operatorĂ«ve: selektorĂ«t e qĂ«llimeve tĂ« politikĂ«s, selektorĂ«t e pod’ëve dhe selektorĂ«t e hapĂ«sirave tĂ« emrave.

Subnetet dhe IP adresat (IPBlocks)

Për segmentimin e rrjetit, firewall-et përdorin VLAN, adresat IP dhe subnetet.

Në Kubernetes, adresat IP i jepen pod-ave automatikisht dhe mund të ndryshojnë shpesh, prandaj për përzgjedhjen e pod-ave dhe hapësirave të emrave në politikat rrjetore përdoren etiketa.

Subnetet (ipBlocks) përdoren kur menaxhohen lidhjet e jashtme (North-South) për hyrje (ingress) ose dalje (egress). Për shembull, kjo politikë iu jep të gjithë pod-ave nga hapësira e emrit default qasje në shërbimin DNS të Google:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Një selektor i zbrazët pod-ash në këtë shembull do të thotë "përzgjidh të gjitha pod-at në hapësirën e emrit".

Kjo politikë hap qasje vetëm në 8.8.8.8; çdo qasje në adresat IP të tjera është e ndaluar. Pra, në thelb, keni bllokuar qasjen në shërbimin e brendshëm DNS të Kubernetes. Nëse gjithsesi dëshironi ta hapni atë, specifikoni këtë në mënyrë të qartë.

Zakonisht ipBlocks dhe podSelectors janĂ« pĂ«rjashtuese, pĂ«r shkak se adresat IP tĂ« brendshme tĂ« pod-ave nuk pĂ«rdoren nĂ« ipBlocks. Duke specifikuar adresat IP tĂ« brendshme tĂ« pod-ave, nĂ« fakt, do tĂ« lejoni lidhjet nĂ«/nga pod’ët me kĂ«to adresa. NĂ« praktikĂ«, nuk do tĂ« dini se cila IP adresĂ« tĂ« pĂ«rdorni, prandaj nuk Ă«shtĂ« mirĂ« t'i pĂ«rdorni pĂ«r tĂ« zgjedhur pod’ët.

Si njĂ« kundĂ«r-shembull, politika e mĂ«poshtme pĂ«rfshin tĂ« gjitha IP-tĂ« dhe, nĂ« kĂ«tĂ« mĂ«nyrĂ«, lejon aksesin nĂ« tĂ« gjitha pod’ët e tjera:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Mund tĂ« hapni aksesin vetĂ«m pĂ«r IP-tĂ« e jashtme, duke pĂ«rjashtuar adresat IP tĂ« brendshme tĂ« pod’ëve. PĂ«r shembull, nĂ«se subneti i pod’it tuaj Ă«shtĂ« 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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Portat dhe protokollet

Zakonisht, pod’ët dĂ«gjojnĂ« njĂ« port. Kjo do tĂ« thotĂ« se mund ta lini numrin e porteve nĂ« politika pa specificuar. MegjithatĂ«, rekomandohet qĂ« politikat tĂ« jenĂ« sa mĂ« tĂ« kufizuara, prandaj nĂ« disa raste Ă«shtĂ« e mundur tĂ« specifikoni porte:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Vini rehat se selegjini portet aplikohet në të gjitha elementet në bllok to ose from, ku përmban. Nëse dëshironi të përcaktoni porte të ndryshme për grupe të ndryshme elementesh, ndanë ingress ose egress në disa nënndarje me to ose from dhe në secilën shkruani portet tuaja:

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

Një hyrje në politikat rrjetore Kubernetes për specialistët e sigurisë

Funksioni i porteve për herë të parë:

  • NĂ«se e lini plotĂ«sisht jashtĂ« pĂ«rkufizimin e porteve (portet), kjo do tĂ« thotĂ« tĂ« gjitha protokollet dhe tĂ« gjitha portet;
  • NĂ«se e lini jashtĂ« pĂ«rkufizimin e protokollit (protokolli), kjo do tĂ« thotĂ« TCP;
  • NĂ«se e lini jashtĂ« pĂ«rkufizimin e portit (port), kjo do tĂ« thotĂ« tĂ« gjitha portet.

Praktika më e mirë: mos u mbështetni në vlerat e paracaktuar, jepni ato që ju nevojiten qartë.

Kujdes, duhet tĂ« pĂ«rdorni portat e pod’ave, jo tĂ« shĂ«rbimeve (mĂ« shumĂ« rreth kĂ«saj nĂ« paragrafin e ardhshĂ«m).

Politikat janĂ« tĂ« pĂ«rcaktuara pĂ«r pod’ava ose shĂ«rbime?

NĂ« pĂ«rgjithĂ«si, pod’at nĂ« Kubernetes i qasen njĂ«ri-tjetrit pĂ«rmes shĂ«rbimit — njĂ« balancues virtual ngarkese, qĂ« redirecton trafikun nĂ« pod’at qĂ« implementojnĂ« shĂ«rbimin. Mund tĂ« duket se politikat rrjetĂ«rore kontrollojnĂ« aksesin nĂ« shĂ«rbime, por nuk Ă«shtĂ« kĂ«shtu. Politikat rrjetĂ«rore Kubernetes funksionojnĂ« me portat e pod’ave, jo tĂ« shĂ«rbimeve.

PĂ«r shembull, nĂ«se shĂ«rbimi dĂ«gjon nĂ« portin 80, por redirecton trafikun nĂ« portin 8080 tĂ« pod’ave tĂ« tij, nĂ« politikĂ«n rrjetĂ«rore duhet tĂ« specifikohet pikĂ«risht 8080.

NjĂ« mekanizĂ«m tĂ« tillĂ« duhet ta pranojmĂ« si jo optimal: kur ndryshon struktura e brendshme e shĂ«rbimit (portet e tĂ« cilit dĂ«gjojnĂ« pod’at), do tĂ« duhet tĂ« pĂ«rditĂ«sojmĂ« politikat rrjetĂ«rore.

NjĂ« qasje e re arkitektonike duke pĂ«rdorur Service Mesh (p.sh., shih pĂ«r Istio mĂ« poshtĂ« — shĂ«nimi i pĂ«rkthyesit.) ndihmon pĂ«r tĂ« trajtuar kĂ«tĂ« problem.

A është e nevojshme të përcaktohen si Ingress ashtu edhe Egress?

Përgjigja e shkurtër është po, për të lejuar që pod A të lidhet me pod-in B, duhet të lejohet krijimi i një lidhjeje dërguese (për këtë duhet konfigurimi i politikës egress), dhe pod-i B duhet të ketë aftësinë për të pranuar një lidhje hyrëse (për këtë, përkatësisht, është e nevojshme një politikë ingress).

Megjithatë, në praktikë, mund të mbështetet në politikën e përbashkët që lejon lidhjet në një ose të dyja drejtimet.

Nëse ndonjë pod-burimi zgjidhet nga një ose më shumë egress-politika, kufizimet e vendosura mbi të do të përcaktohen nga disjunksioni i tyre. Në këtë rast, do të jetë e nevojshme të lejohet qartë lidhja me pod-in-destinatar. Nëse pod-i nuk zgjidhet nga ndonjë politikë, trafiku i tij dërgues (egress) lejohet automatikisht.

Në mënyrë të ngjashme, fati i pod-it-destinatar, i zgjedhur nga një ose më shumë ingress-politika, do të përcaktohet nga disjunksioni i tyre. Në këtë rast, është e nevojshme të lejohet qartë që ai të marrë trafik nga pod-i-burim. Nëse pod-i nuk zgjidhet nga ndonjë politikë, gjithë trafiku hyrës (ingress) për të lejohet automatikisht.

Shih pikën "Stateful ose Stateless" më poshtë.

Logjet

Politikat rrjetore Kubernetes nuk kanë kapacitetin për të regjistruar trafikun. Kjo e bën të vështirë të përcaktohet nëse politika po funksionon siç duhet dhe e komplikon shqyrtimin në fushën e sigurisë.

Kontrolli i trafikut ndaj shërbimeve të jashtme

Politikat rrjetore Kubernetes nuk lejojnë përcaktimin e një emri të plotë domeni (DNS) në pjesët e egress. Ky fakt sjell një shqetësim të madh gjatë përpjekjes për të kufizuar trafikun ndaj destinacioneve të jashtme pa një adresë IP fikse (si aws.com).

Verifikimi i politikës

Firewalls do t'ju paralajmërojnë ose madje do të refuzojnë të pranojnë politikën e gabuar. Kubernetes gjithashtu bën disa verifikime. Kur përcaktoni një politikë rrjeti përmes kubectl, Kubernetes mund të deklarojë se ajo është e pasaktë dhe të refuzojë ta pranojë. Në raste të tjera, Kubernetes do ta pranojë politikën dhe do ta plotësojë atë me detajet e humbura. Mund të shihen me komandën:

kubernetes get networkpolicy  -o yaml

Mbani parasysh se sistemi i verifikimit të Kubernetes nuk është i pakapshëm dhe mund të lejojë disa lloje gabimesh.

Ekzekutimi

Kubernetes nuk punon vetĂ« me realizimin e politikave rrjetore, por Ă«shtĂ« veçse njĂ« nyje API qĂ« e ngarkon punĂ«n e kontrollit tek sistemi nĂ«nkuptimor i quajtur Container Networking Interface (CNI). Caktimi i politikave nĂ« klusterin Kubernetes pa caktimin e CNI tĂ« duhur Ă«shtĂ« si tĂ« krijosh politika nĂ« serverin e menaxhimit tĂ« firewall-eve pa i instaluar ato mĂ« pas nĂ« firewall-e. Ju vetĂ« duhet tĂ« siguroheni pĂ«r praninĂ« e njĂ« CNI tĂ« pĂ«rshtatshĂ«m ose, nĂ« rastin e platformave Kubernetes tĂ« vendosura nĂ« cloud, (mund tĂ« konsultoheni me listĂ«n e ofruesve kĂ«tu — shĂ«n. pĂ«rk.), angazhoni politika rrjetore qĂ« do tĂ« vendosnin CNI pĂ«r ju.

Kujdes, Kubernetes nuk do t'ju paralajmërojë nëse caktoni një polit të rrjetit pa CNI-në përkatëse ndihmëse.

Stateful apo Stateless?

Të gjithë CNI-të e Kubernetes që kam hasur ruajnë gjendjen (p.sh., Calico përdor Linux conntrack). Kjo lejon që pod-i të marrë përgjigje për TCP-lidhjen që ai ka iniciuar pa nevojën për ta rivendosur atë. Për këtë, nuk di për ndonjë standard Kubernetes që garanton ruajtjen e gjendjes (statefulness).

Menaxhim i avancuar i politikave të sigurisë

Ja disa mënyra për të rritur efikasitetin e zbatimit të politikave të sigurisë në Kubernetes:

  1. Modeli arkitektonik Service Mesh përdor kontejnerë sidecar për të ofruar telemetri të detajuar dhe kontroll mbi trafikun në nivelin e shërbimeve. Si shembull mund të përmendim Istio.
  2. Disa nga ofruesit e CNI e kanë zgjeruar mjete e tyre për të shkuar përtej politikave rrjetore të Kubernetes.
  3. Tufin Orca siguron transparencë dhe automatizim të politikave rrjetore të Kubernetes.

Paketa Tufin Orca menaxhon politikat rrjetore të Kubernetes (dhe shërben si burim për ekranet e përmendura më lart).

Informacione shtesë

Përfundimi

Politikat e rrjetit Kubernetes ofrojnë një grup të mirë mjetesh për segmentimin e klasterëve, megjithatë ato janë intuitivisht të panjohura dhe kanë shumë nuanca. Mendoj se për shkak të kësaj kompleksiteti, politikat e shumë klasterëve ekzistues përmbajnë gabime. Zgjidhjet e mundshme për këtë problem janë automatizimi i përcaktimeve të politikave ose përdorimi i mjeteve të tjera për segmentim.

Shpresoj që ky udhëzues do të ndihmojë në sqarimin e disa pyetjeve dhe në zgjidhjen e problemeve me të cilat mund të përballeni.

P.S. nga përkthyesi

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster