Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Akiyesi. itumọ.: Onkọwe ti nkan naa, Reuven Harrison, ni diẹ sii ju ọdun 20 ti iriri ni idagbasoke sọfitiwia, ati loni ni CTO ati oludasile-oludasile Tufin, ile-iṣẹ kan ti o ṣẹda awọn solusan iṣakoso eto imulo aabo. Lakoko ti o n wo awọn eto nẹtiwọọki Kubernetes bi ohun elo ti o lagbara ni iṣẹtọ fun pipin nẹtiwọọki ni iṣupọ kan, o tun gbagbọ pe wọn ko rọrun pupọ lati ṣe ni iṣe. Ohun elo yii (pupọ pupọ) jẹ ipinnu lati ni ilọsiwaju imọ awọn alamọja nipa ọran yii ati ṣe iranlọwọ fun wọn lati ṣẹda awọn atunto to wulo.

Loni, ọpọlọpọ awọn ile-iṣẹ n pọ si yan Kubernetes lati ṣiṣẹ awọn ohun elo wọn. Awọn iwulo ninu sọfitiwia yii ga tobẹẹ ti diẹ ninu n pe Kubernetes “eto iṣẹ ṣiṣe tuntun fun ile-iṣẹ data.” Diẹdiẹ, Kubernetes (tabi k8s) bẹrẹ lati ni akiyesi bi apakan pataki ti iṣowo, eyiti o nilo iṣeto ti awọn ilana iṣowo ti ogbo, pẹlu aabo nẹtiwọọki.

Fun awọn alamọja aabo ti o jẹ iyalẹnu nipa ṣiṣẹ pẹlu Kubernetes, ifihan gidi le jẹ eto imulo aiyipada ti pẹpẹ: gba ohun gbogbo laaye.

Itọsọna yii yoo ran ọ lọwọ lati loye ilana inu ti awọn eto imulo nẹtiwọki; ye bi wọn ṣe yatọ si awọn ofin fun awọn firewalls deede. Yoo tun bo diẹ ninu awọn ọfin ati pese awọn iṣeduro lati ṣe iranlọwọ awọn ohun elo to ni aabo lori Kubernetes.

Kubernetes nẹtiwọki imulo

Ilana eto imulo nẹtiwọọki Kubernetes ngbanilaaye lati ṣakoso ibaraenisepo ti awọn ohun elo ti a fi ranṣẹ sori pẹpẹ ni Layer nẹtiwọki (ẹkẹta ninu awoṣe OSI). Awọn eto imulo nẹtiwọọki ko ni diẹ ninu awọn ẹya ilọsiwaju ti awọn ogiriina ode oni, gẹgẹbi imuṣiṣẹ OSI Layer 7 ati wiwa irokeke, ṣugbọn wọn pese ipele ipilẹ ti aabo nẹtiwọki ti o jẹ ibẹrẹ ti o dara.

Awọn ilana nẹtiwọki n ṣakoso awọn ibaraẹnisọrọ laarin awọn pods

Awọn ẹru iṣẹ ni Kubernetes ti pin kaakiri awọn adarọ-ese, eyiti o ni ọkan tabi diẹ sii awọn apoti ti a fi ranṣẹ papọ. Kubernetes fi adiresi IP kọọkan fun adarọ-ese kan ti o wa lati awọn adarọ-ese miiran. Awọn ilana nẹtiwọọki Kubernetes ṣeto awọn ẹtọ iraye si fun awọn ẹgbẹ ti awọn adarọ-ese ni ọna kanna ti awọn ẹgbẹ aabo ninu awọsanma ṣe lo lati ṣakoso iraye si awọn apẹẹrẹ ẹrọ foju.

Asọye nẹtiwọki imulo

Bii awọn orisun Kubernetes miiran, awọn ilana nẹtiwọọki jẹ pato ni YAML. Ni apẹẹrẹ ni isalẹ, ohun elo balance wiwọle si 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

(Akiyesi. itumọ.Sikirinifoto yii, bii gbogbo awọn iru ti o tẹle, ni a ṣẹda laisi lilo awọn irinṣẹ Kubernetes abinibi, ṣugbọn lilo ohun elo Tufin Orca, eyiti o jẹ idagbasoke nipasẹ ile-iṣẹ ti onkọwe ti nkan atilẹba ati eyiti a mẹnuba ni ipari ohun elo naa.)

Lati ṣalaye eto imulo nẹtiwọọki tirẹ, iwọ yoo nilo imọ ipilẹ ti YAML. Ede yii da lori itọsi (pato nipasẹ awọn alafo dipo awọn taabu). Ohun indented eroja je ti si awọn sunmọ ano indented loke rẹ. Ẹya atokọ tuntun bẹrẹ pẹlu amọra, gbogbo awọn eroja miiran ni fọọmu naa bọtini-iye.

Lehin ti ṣe apejuwe eto imulo ni YAML, lo kubectllati ṣẹda rẹ ninu iṣupọ:

kubectl create -f policy.yaml

Network Afihan Specification

Sipesifikesonu eto imulo nẹtiwọọki Kubernetes pẹlu awọn eroja mẹrin:

  1. podSelector: asọye awọn pods fowo nipasẹ yi eto imulo (afojusun) - beere;
  2. policyTypes: tọkasi iru awọn eto imulo ti o wa ninu eyi: ingress ati / tabi egress - iyan, ṣugbọn Mo ṣeduro ni pato ni pato ni gbogbo awọn ọran;
  3. ingress: asọye laaye ti nwọle ijabọ si awọn pods afojusun - iyan;
  4. egress: asọye laaye ti njade ijabọ lati awọn pods afojusun jẹ iyan.

Apẹẹrẹ ti o ya lati oju opo wẹẹbu Kubernetes (Mo rọpo role on app), fihan bi gbogbo awọn eroja mẹrin ṣe nlo:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo
Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Jọwọ ṣe akiyesi pe gbogbo awọn eroja mẹrin ko ni lati wa ninu. O jẹ dandan nikan podSelector, awọn paramita miiran le ṣee lo bi o ṣe fẹ.

Ti o ba fi silẹ policyTypes, eto imulo yoo jẹ itumọ bi atẹle:

  • Nipa aiyipada, o ti ro pe o asọye ẹgbẹ ingress. Ti eto imulo ko ba sọ eyi ni gbangba, eto naa yoo ro pe gbogbo awọn ijabọ ti ni idinamọ.
  • Iwa ti o wa ni ẹgbẹ egress yoo jẹ ipinnu nipasẹ wiwa tabi isansa ti paramita egress ti o baamu.

Lati yago fun awọn aṣiṣe Mo ṣeduro nigbagbogbo ṣe kedere policyTypes.

Ni ibamu si awọn loke kannaa, ti o ba ti awọn paramita ingress ati / tabi egress ti own, eto imulo yoo sẹ gbogbo awọn ijabọ (wo "Ofin yiyọ" ni isalẹ).

Ilana aiyipada jẹ Gba laaye

Ti ko ba si awọn eto imulo ti wa ni asọye, Kubernetes ngbanilaaye gbogbo awọn ijabọ nipasẹ aiyipada. Gbogbo awọn podu le ṣe paṣipaarọ alaye larọwọto laarin ara wọn. Eyi le dabi atako lati irisi aabo, ṣugbọn ranti pe Kubernetes jẹ apẹrẹ akọkọ nipasẹ awọn olupilẹṣẹ lati jẹ ki ibaraenisepo ohun elo ṣiṣẹ. Awọn eto imulo nẹtiwọki ni a ṣafikun nigbamii.

Awọn aaye orukọ

Awọn aaye orukọ jẹ ilana ifowosowopo Kubernetes. Wọn ṣe apẹrẹ lati ya sọtọ awọn agbegbe mogbonwa lati ara wọn, lakoko ti ibaraẹnisọrọ laarin awọn aaye gba laaye nipasẹ aiyipada.

Bii ọpọlọpọ awọn paati Kubernetes, awọn ilana nẹtiwọọki n gbe ni aaye orukọ kan pato. Ni awọn Àkọsílẹ metadata o le pato aaye wo ni eto imulo jẹ ti:

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

Ti aaye orukọ ko ba ni pato ni pato ninu metadata, eto naa yoo lo aaye orukọ ti o pato ninu kubectl (nipasẹ aiyipada namespace=default):

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

Mo ṣeduro pato awọn namespace kedere, ayafi ti o ba n kọ eto imulo ti o fojusi awọn aaye orukọ pupọ ni ẹẹkan.

Akọkọ ano podSelector ninu eto imulo yoo yan awọn adarọ-ese lati aaye orukọ si eyiti eto imulo naa jẹ (a ko ni iraye si awọn adarọ-ese lati aaye orukọ miiran).

Bakanna, podSelectors ni ingress ati egress ohun amorindun le yan awọn adarọ-ese nikan lati aaye orukọ tiwọn, ayafi ti dajudaju o darapọ wọn pẹlu namespaceSelector (eyi yoo ṣe ijiroro ni apakan “Ṣajọ nipasẹ awọn aaye orukọ ati awọn adarọ-ese”).

Ilana lorukọ Ofin

Awọn orukọ eto imulo jẹ alailẹgbẹ laarin aaye orukọ kanna. Ko le jẹ awọn eto imulo meji pẹlu orukọ kanna ni aaye kanna, ṣugbọn awọn eto imulo le wa pẹlu orukọ kanna ni awọn aye oriṣiriṣi. Eyi wulo nigba ti o ba fẹ tun kan eto imulo kanna kọja awọn aaye lọpọlọpọ.

Mo nifẹ paapaa ọkan ninu awọn ọna sisọ. O ni apapọ orukọ aaye orukọ pẹlu awọn pods ibi-afẹde. Fun apere:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Awọn aami

O le so awọn aami aṣa pọ si awọn nkan Kubernetes, gẹgẹbi awọn adarọ-ese ati awọn aaye orukọ. Awọn aami (awọn akole - afi) jẹ deede ti awọn afi ninu awọsanma. Awọn eto nẹtiwọọki Kubernetes lo awọn akole lati yan awọn podusi eyiti wọn lo:

podSelector:
  matchLabels:
    role: db

… tabi awọn aaye orukọsi eyiti wọn lo. Apẹẹrẹ yii yan gbogbo awọn adarọ-ese ni awọn aaye orukọ pẹlu awọn akole ti o baamu:

namespaceSelector:
  matchLabels:
    project: myproject

Išọra kan: nigba lilo namespaceSelector rii daju pe awọn aaye orukọ ti o yan ni aami to pe ni ninu. Mọ daju pe awọn aaye orukọ ti a ṣe sinu bii default и kube-system, nipa aiyipada ko ni awọn akole ninu.

O le fi aami kun si aaye kan bi eleyi:

kubectl label namespace default namespace=default

Ni akoko kanna, orukọ aaye ni apakan metadata yẹ ki o tọka si orukọ aaye gangan, kii ṣe aami naa:

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

Orisun ati nlo

Awọn eto imulo ogiriina ni awọn ofin pẹlu awọn orisun ati awọn ibi. Awọn ilana nẹtiwọọki Kubernetes jẹ asọye fun ibi-afẹde kan - ṣeto awọn adarọ-ese si eyiti wọn lo - ati lẹhinna ṣeto awọn ofin fun titẹ sii ati/tabi ijabọ egress. Ninu apẹẹrẹ wa, ibi-afẹde ti eto imulo yoo jẹ gbogbo awọn adarọ-ese ni aaye orukọ default pẹlu aami pẹlu bọtini app ati itumo 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo
Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Apakan ingress ninu eto imulo yii, ṣi ijabọ ti nwọle si awọn adarọ-ese afojusun. Ni awọn ọrọ miiran, ingress jẹ orisun ati ibi-afẹde jẹ opin irin ajo ti o baamu. Bakanna, egress jẹ opin irin ajo ati ibi-afẹde ni orisun rẹ.

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Eyi jẹ deede si awọn ofin ogiriina meji: Ingress → Target; Ibi-afẹde → Ilọsiwaju.

Egress ati DNS (pataki!)

Nipa didin awọn ijabọ ti njade, san ifojusi pataki si DNS - Kubernetes lo iṣẹ yii lati ṣe maapu awọn iṣẹ si awọn adirẹsi IP. Fun apẹẹrẹ, eto imulo atẹle kii yoo ṣiṣẹ nitori o ko gba ohun elo laaye balance wọle si 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

O le ṣatunṣe rẹ nipa ṣiṣi iraye si iṣẹ 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

kẹhin ano to ti ṣofo, ati nitori naa o yan ni aiṣe-taara gbogbo awọn podu ni gbogbo awọn aaye orukọ, gbigba balance firanṣẹ awọn ibeere DNS si iṣẹ Kubernetes ti o yẹ (nigbagbogbo nṣiṣẹ ni aaye kube-system).

Ọna yii n ṣiṣẹ, sibẹsibẹ aṣeju iyọọda ati ailewu, nitori pe o gba awọn ibeere DNS laaye lati ṣe itọsọna ni ita iṣupọ.

O le ni ilọsiwaju ni awọn igbesẹ ti o tẹle mẹta.

1. Gba awọn ibeere DNS nikan inu iṣupọ nipa fifi 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

2. Gba awọn ibeere DNS laarin aaye orukọ nikan kube-system.

Lati ṣe eyi o nilo lati fi aami kun si aaye orukọ kube-system: kubectl label namespace kube-system namespace=kube-system - ki o si kọ si isalẹ ni eto imulo lilo 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

3. Awọn eniyan paranoid le lọ paapaa siwaju ati ṣe idinwo awọn ibeere DNS si iṣẹ DNS kan pato ninu kube-system. Abala naa “Àlẹmọ nipasẹ awọn aaye orukọ ATI awọn adarọ-ese” yoo sọ fun ọ bi o ṣe le ṣaṣeyọri eyi.

Aṣayan miiran ni lati yanju DNS ni ipele orukọ. Ni ọran yii, kii yoo nilo lati ṣii fun iṣẹ kọọkan:

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

Sofo podSelector yan gbogbo awọn adarọ-ese ni aaye orukọ.

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ibamu akọkọ ati aṣẹ ofin

Ni awọn firewalls ti aṣa, iṣe (Gba tabi Kọ) lori apo kan jẹ ipinnu nipasẹ ofin akọkọ ti o ni itẹlọrun. Ni Kubernetes, aṣẹ ti awọn eto imulo ko ṣe pataki.

Nipa aiyipada, nigbati ko ba ṣeto awọn eto imulo, awọn ibaraẹnisọrọ laarin awọn adarọ-ese ni a gba laaye ati pe wọn le ṣe paṣipaarọ alaye larọwọto. Ni kete ti o ba bẹrẹ agbekalẹ awọn eto imulo, adarọ-ese kọọkan ti o kan nipasẹ o kere ju ọkan ninu wọn di ipinya ni ibamu si itusilẹ (imọgbọnwa OR) ti gbogbo awọn eto imulo ti o yan. Pods ti ko ni fowo nipasẹ eyikeyi eto imulo wa ni sisi.

O le yi ihuwasi yii pada nipa lilo ofin yiyọ kuro.

Ofin yiyọ kuro (“Kọ”)

Awọn eto imulo ogiriina ni igbagbogbo kọ eyikeyi ijabọ ti ko gba laaye ni gbangba.

Ko si igbese sẹ ni Kubernetes, sibẹsibẹ, ipa ti o jọra le ṣee ṣe pẹlu ilana deede (igbanilaaye) nipa yiyan ẹgbẹ ti o ṣofo ti awọn adarọ-ese (ingress):

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ilana yii yan gbogbo awọn adarọ-ese ni aaye orukọ ati fi silẹ ni aisọye, kọ gbogbo ijabọ ti nwọle.

Ni ọna kanna, o le ni ihamọ gbogbo awọn ijabọ ti njade lati aaye orukọ kan:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Jọwọ ṣe akiyesi pe eyikeyi awọn eto imulo afikun gbigba awọn ijabọ si awọn adarọ-ese ni aaye orukọ yoo gba iṣaaju lori ofin yii (bii lati ṣafikun ofin gbigba laaye ṣaaju ofin sẹ ni iṣeto ogiriina kan).

Gba ohun gbogbo laaye (Eyikeyi-Eyikeyi-Eyikeyi-Gba)

Lati ṣẹda eto imulo Gba Gbogbo laaye, o nilo lati ṣafikun eto imulo Deny loke pẹlu ipin ofo ingress:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

O faye gba wiwọle lati gbogbo awọn adarọ-ese ni gbogbo awọn aaye orukọ (ati gbogbo IP) si eyikeyi podu ni aaye orukọ default. Iwa yii ṣiṣẹ nipasẹ aiyipada, nitorinaa nigbagbogbo ko nilo lati ni asọye siwaju. Sibẹsibẹ, nigbami o le nilo lati mu awọn igbanilaaye kan kuro fun igba diẹ lati ṣe iwadii iṣoro naa.

Ofin le dinku lati gba iwọle si nikan kan pato ti ṣeto ti pods (app:balance) ni aaye orukọ default:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ilana atẹle yii ngbanilaaye gbogbo ifiwọle ati ijabọ ijade, pẹlu iraye si eyikeyi IP ni ita iṣupọ:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo
Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Apapọ Multiple imulo

Awọn eto imulo ti wa ni idapo nipa lilo ọgbọn TABI ni awọn ipele mẹta; Awọn igbanilaaye podu kọọkan ti ṣeto ni ibarẹ pẹlu gbogbo awọn eto imulo ti o kan:

1. Ninu oko from и to Awọn oriṣi awọn eroja mẹta le ṣe asọye (gbogbo eyiti o ni idapo ni lilo OR):

  • namespaceSelector - yan gbogbo aaye orukọ;
  • podSelector - yan awọn ege;
  • ipBlock - yan subnet kan.

Pẹlupẹlu, nọmba awọn eroja (paapaa awọn ti o jọra) ni awọn apakan from/to ko ni opin. Gbogbo wọn ni ao dapọ pẹlu ọgbọn OR.

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

2. Inu awọn eto imulo apakan ingress le ni ọpọlọpọ awọn eroja from (ni idapo pelu mogbonwa OR). Bakanna, apakan egress le ni ọpọlọpọ awọn eroja to (tun ni idapo pelu itusilẹ):

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

3. Awọn eto imulo oriṣiriṣi tun ni idapo pẹlu ọgbọn OR

Ṣugbọn nigbati o ba ṣajọpọ wọn, aropin kan wa lori eyiti tọka si Chris Cooney: Kubernetes le nikan darapọ imulo pẹlu o yatọ si policyTypes (Ingress tabi Egress). Awọn eto imulo ti n ṣalaye ingress (tabi egress) yoo kọ ara wọn kọ.

Ibasepo laarin awọn aaye orukọ

Nipa aiyipada, pinpin alaye laarin awọn aaye orukọ gba laaye. Eyi le ṣe yipada nipasẹ lilo eto imulo atako ti yoo ni ihamọ ijabọ ti njade ati/tabi ti nwọle sinu aaye orukọ (wo “Ofin yiyọ” loke).

Ni kete ti o ba ti dina iwọle si aaye orukọ kan (wo “Ofin yiyọ kuro” loke), o le ṣe awọn imukuro si eto imulo kiko nipa gbigba awọn asopọ lati aaye orukọ kan pato nipa lilo 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Bi abajade, gbogbo awọn adarọ-ese ni aaye orukọ default yoo ni iwọle si awọn podu postgres ni aaye orukọ database. Ṣugbọn kini ti o ba fẹ ṣii iwọle si postgres nikan kan pato pods ni awọn namespace default?

Ṣe àlẹmọ nipasẹ awọn aaye orukọ ati awọn adarọ-ese

Ẹya Kubernetes 1.11 ati giga julọ gba ọ laaye lati darapọ awọn oniṣẹ namespaceSelector и podSelector lilo ogbon ATI. O dabi eleyi:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Kini idi ti eyi tumọ si ATI dipo deede TABI?

ṣe akiyesi pe podSelector ko bẹrẹ pẹlu a hyphen. Ninu YAML eleyi tumo si wipe podSelector ó sì dúró níwájú rÆ namespaceSelector tọka si awọn kanna akojọ ano. Nitorina, won ti wa ni idapo pelu mogbonwa AND.

Ṣafikun-ara kan ṣaaju podSelector yoo ja si ni awọn farahan ti a titun akojọ ano, eyi ti yoo wa ni idapo pelu ti tẹlẹ ọkan namespaceSelector lilo mogbonwa OR.

Lati yan awọn adarọ-ese pẹlu aami kan pato ni gbogbo awọn aaye orukọ, tẹ òfo 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ọpọ aami egbe soke pẹlu I

Awọn ofin fun a ogiriina pẹlu ọpọ ohun (ogun, nẹtiwọki, awọn ẹgbẹ) ti wa ni idapo lilo mogbonwa OR. Ofin atẹle yoo ṣiṣẹ ti orisun apo ba baamu Host_1 TABI Host_2:

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

Ni ilodi si, ni Kubernetes orisirisi awọn aami ninu podSelector tabi namespaceSelector ti wa ni idapo pelu mogbonwa AND.Fun apẹẹrẹ, awọn wọnyi ofin yoo yan pods ti o ni awọn mejeeji aami, role=db И version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

Imọye kanna kan si gbogbo iru awọn oniṣẹ: awọn oluyan ibi-afẹde eto imulo, awọn yiyan adarọ ese, ati awọn yiyan aaye orukọ.

Awọn subnets ati adirẹsi IP (IPBlocks)

Awọn ogiriina lo awọn VLANs, awọn adirẹsi IP, ati awọn subnets lati pin nẹtiwọki kan.

Ni Kubernetes, awọn adiresi IP ni a yàn si awọn adarọ-ese laifọwọyi ati pe o le yipada nigbagbogbo, nitorina a lo awọn aami lati yan awọn adarọ-ese ati awọn aaye orukọ ni awọn eto imulo nẹtiwọki.

Awọn ile-iṣẹ abẹlẹ (ipBlocks) ti wa ni lilo nigba ti iṣakoso ti nwọle (ingress) tabi ti njade (egress) ita (North-South) awọn isopọ. Fun apẹẹrẹ, eto imulo yii ṣii si gbogbo awọn adarọ-ese lati aaye orukọ default wiwọle si Google DNS iṣẹ:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Aṣayan adarọ ese ti o ṣofo ni apẹẹrẹ yii tumọ si “yan gbogbo awọn adarọ-ese ni aaye orukọ.”

Ilana yii gba aaye laaye si 8.8.8.8; wiwọle si eyikeyi miiran IP ti ni idinamọ. Nitorinaa, ni pataki, o ti dina iwọle si iṣẹ Kubernetes DNS inu. Ti o ba tun fẹ ṣi i, tọkasi eyi ni gbangba.

Nigbagbogbo ipBlocks и podSelectors jẹ iyasọtọ ti ara ẹni, nitori awọn adirẹsi IP inu ti awọn pods ko lo ninu ipBlocks. Nipa itọkasi ti abẹnu IP pods, iwọ yoo gba awọn asopọ laaye si / lati awọn pods pẹlu awọn adirẹsi wọnyi. Ni iṣe, iwọ kii yoo mọ iru adiresi IP lati lo, eyiti o jẹ idi ti wọn ko yẹ ki o lo lati yan awọn adarọ-ese.

Gẹgẹbi apẹẹrẹ atako, eto imulo atẹle pẹlu gbogbo awọn IP ati nitorinaa ngbanilaaye iwọle si gbogbo awọn adarọ-ese miiran:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

O le ṣii iwọle si awọn IP ita nikan, laisi awọn adiresi IP inu ti awọn adarọ-ese. Fun apẹẹrẹ, ti subnet ti adarọ-ese rẹ jẹ 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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Awọn ibudo ati awọn ilana

Ni deede awọn adarọ-ese tẹtisi ibudo kan. Eyi tumọ si pe o ko le sọ pato awọn nọmba ibudo ni awọn eto imulo ati fi ohun gbogbo silẹ bi aiyipada. Sibẹsibẹ, o niyanju lati ṣe awọn eto imulo bi ihamọ bi o ti ṣee, nitorina ni awọn igba miiran o tun le pato awọn ebute oko oju omi:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Ṣe akiyesi pe oluyan ports kan si gbogbo awọn eroja ninu awọn Àkọsílẹ to tabi from, eyiti o ni ninu. Lati pato orisirisi awọn ebute oko fun yatọ si tosaaju ti eroja, pin ingress tabi egress sinu orisirisi awọn ipin pẹlu to tabi from ati ninu ọkọọkan forukọsilẹ awọn ebute oko oju omi rẹ:

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

Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo

Iṣiṣẹ ibudo aiyipada:

  • Ti o ba fi asọye ibudo naa silẹ patapata (ports), eyi tumọ si gbogbo awọn ilana ati gbogbo awọn ibudo;
  • Ti o ba fi itumọ ilana naa silẹ (protocol), eyi tumọ si TCP;
  • Ti o ba fi itumọ ibudo silẹ (port), eyi tumọ si gbogbo awọn ibudo.

Iṣe ti o dara julọ: Maṣe gbẹkẹle awọn iye aiyipada, pato ohun ti o nilo ni gbangba.

Jọwọ ṣe akiyesi pe o gbọdọ lo awọn ebute oko oju omi, kii ṣe awọn ebute iṣẹ (diẹ sii lori eyi ni paragi ti nbọ).

Ṣe awọn eto imulo asọye fun awọn adarọ-ese tabi awọn iṣẹ?

Ni deede, awọn adarọ-ese ni Kubernetes wọle si ara wọn nipasẹ iṣẹ kan - iwọntunwọnsi fifuye foju kan ti o ṣe itọsọna ijabọ si awọn adarọ-ese ti o ṣe iṣẹ naa. O le ro pe awọn ilana nẹtiwọki n ṣakoso iraye si awọn iṣẹ, ṣugbọn eyi kii ṣe ọran naa. Awọn eto nẹtiwọọki Kubernetes ṣiṣẹ lori awọn ebute oko oju omi, kii ṣe awọn ibudo iṣẹ.

Fun apẹẹrẹ, ti iṣẹ kan ba tẹtisi ibudo 80, ṣugbọn o darí ijabọ si ibudo 8080 ti awọn adarọ-ese rẹ, o gbọdọ pato 8080 gangan ninu eto imulo nẹtiwọọki.

Iru ẹrọ bẹẹ yẹ ki o gbero suboptimal: ti eto inu ti iṣẹ naa (awọn ebute oko oju omi ti awọn adarọ-ese ti tẹtisi) yipada, awọn eto imulo nẹtiwọọki yoo ni imudojuiwọn.

Titun ti ayaworan ona lilo Service Mesh (fun apẹẹrẹ, wo nipa Istio ni isalẹ - isunmọ. transl.) faye gba o lati bawa pẹlu isoro yi.

Ṣe o jẹ dandan lati forukọsilẹ mejeeji Ingress ati Egress?

Idahun kukuru jẹ bẹẹni, ni ibere fun pod A lati ṣe ibaraẹnisọrọ pẹlu pod B, o gbọdọ gba ọ laaye lati ṣẹda asopọ ti njade (fun eyi o nilo lati tunto eto imulo egress), ati pod B gbọdọ ni anfani lati gba asopọ ti nwọle ( fun eyi, ni ibamu, o nilo eto imulo ingress).

Sibẹsibẹ, ni iṣe, o le gbekele eto imulo aiyipada lati gba awọn asopọ laaye ni ọkan tabi awọn itọnisọna mejeeji.

Ti diẹ ninu awọn podu-orisun yoo yan nipasẹ ọkan tabi diẹ ẹ sii ipè-awọn oloselu, awọn ihamọ ti a fi lelẹ lori rẹ yoo jẹ ipinnu nipasẹ itusilẹ wọn. Ni ọran yii, iwọ yoo nilo lati gba asopọ ni gbangba si adarọ-ese -si adiresi. Ti o ko ba yan adarọ ese nipasẹ eto imulo eyikeyi, ijabọ ti njade (jade) jẹ idasilẹ nipasẹ aiyipada.

Bakanna, ayanmọ ti podu niadiresi, ti yan nipasẹ ọkan tabi diẹ ẹ sii ingress- oselu, yoo wa ni ṣiṣe nipasẹ wọn disjunction. Ni idi eyi, o gbọdọ gba laaye ni gbangba lati gba ijabọ lati ori orisun. Ti o ko ba yan adarọ-ese nipasẹ eyikeyi eto imulo, gbogbo ijabọ ingress fun o jẹ idasilẹ nipasẹ aiyipada.

Wo Stateful tabi Stateless ni isalẹ.

Awọn akọọlẹ

Awọn eto nẹtiwọki Kubernetes ko le wọle ijabọ. Eyi jẹ ki o nira lati pinnu boya eto imulo kan n ṣiṣẹ bi a ti pinnu ati pe o ni idiju itupalẹ aabo pupọ.

Iṣakoso ti ijabọ si awọn iṣẹ ita

Awọn eto nẹtiwọọki Kubernetes ko gba ọ laaye lati pato orukọ-ašẹ ti o ni kikun (DNS) ni awọn apakan egress. Otitọ yii nyorisi aibalẹ pataki nigbati o n gbiyanju lati fi opin si ijabọ si awọn ibi ita ti ko ni adiresi IP ti o wa titi (bii aws.com).

Ṣayẹwo imulo

Awọn ogiriina yoo kilọ fun ọ tabi paapaa kọ lati gba eto imulo ti ko tọ. Kubernetes tun ṣe diẹ ninu ijerisi. Nigbati o ba ṣeto eto imulo nẹtiwọọki nipasẹ kubectl, Kubernetes le kede pe ko tọ ati kọ lati gba. Ni awọn igba miiran, Kubernetes yoo gba eto imulo naa ki o si kun pẹlu awọn alaye ti o padanu. Wọn le rii ni lilo aṣẹ:

kubernetes get networkpolicy <policy-name> -o yaml

Pa ni lokan pe Kubernetes afọwọsi eto ni ko asise ati ki o le padanu diẹ ninu awọn orisi ti awọn aṣiṣe.

Ipaniyan

Kubernetes ko ṣe awọn eto imulo nẹtiwọọki funrararẹ, ṣugbọn o jẹ ẹnu-ọna API kan ti o ṣe aṣoju ẹru iṣakoso si eto abẹlẹ ti a pe ni Interface Networking Container (CNI). Ṣiṣeto awọn eto imulo lori iṣupọ Kubernetes laisi fifun CNI ti o yẹ jẹ kanna bi ṣiṣẹda awọn eto imulo lori olupin iṣakoso ogiriina laisi lẹhinna fifi wọn sori awọn ogiriina. O wa si ọ lati rii daju pe o ni CNI ti o tọ tabi, ninu ọran ti awọn iru ẹrọ Kubernetes, ti gbalejo ninu awọsanma (o le wo atokọ ti awọn olupese nibi - isunmọ. trans.), jeki awọn eto imulo nẹtiwọki ti yoo ṣeto CNI fun ọ.

Ṣe akiyesi pe Kubernetes kii yoo kilọ fun ọ ti o ba ṣeto eto imulo nẹtiwọọki laisi oluranlọwọ CNI ti o yẹ.

Orílẹ̀-èdè Àbí Àìní Orílẹ̀-Èdè?

Gbogbo awọn Kubernetes CNI ti Mo ti ba pade jẹ alaye (fun apẹẹrẹ, Calico nlo Linux conntrack). Eyi ngbanilaaye adarọ ese lati gba awọn idahun lori asopọ TCP ti o bẹrẹ laisi nini lati tun fi idi rẹ mulẹ. Bibẹẹkọ, Emi ko mọ boṣewa Kubernetes kan ti yoo ṣe iṣeduro iṣedede.

To ti ni ilọsiwaju Aabo Afihan Management

Eyi ni diẹ ninu awọn ọna lati mu imudara imulo aabo ni Kubernetes:

  1. Apẹrẹ ayaworan Mesh Iṣẹ nlo awọn apoti ẹgbe lati pese alaye telemetry ati iṣakoso ijabọ ni ipele iṣẹ. Bi apẹẹrẹ a le ya Istio.
  2. Diẹ ninu awọn olutaja CNI ti gbooro awọn irinṣẹ wọn lati lọ kọja awọn ilana nẹtiwọọki Kubernetes.
  3. Tufin Orca Pese hihan ati adaṣe ti awọn eto nẹtiwọọki Kubernetes.

Tufin Orca package n ṣakoso awọn eto nẹtiwọọki Kubernetes (ati pe o jẹ orisun ti awọn sikirinisoti loke).

afikun alaye

ipari

Awọn eto nẹtiwọọki Kubernetes nfunni ni eto awọn irinṣẹ to dara fun pipin awọn iṣupọ, ṣugbọn wọn ko ni oye ati ni ọpọlọpọ awọn arekereke. Nitori idiju yii, Mo gbagbọ pe ọpọlọpọ awọn ilana iṣupọ ti o wa tẹlẹ jẹ buggy. Awọn ojutu to ṣee ṣe si iṣoro yii pẹlu adaṣe adaṣe awọn asọye eto imulo tabi lilo awọn irinṣẹ ipin miiran.

Mo nireti pe itọsọna yii ṣe iranlọwọ lati ṣalaye diẹ ninu awọn ibeere ati yanju awọn ọran ti o le ba pade.

PS lati onitumọ

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun