Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Шарҳ. тарҷума.: Муаллифи мақола, Реувен Ҳаррисон, таҷрибаи беш аз 20 сол дар таҳияи нармафзор дорад ва имрӯз CTO ва ҳаммуассиси Туфин, ширкатест, ки қарорҳои идоракунии сиёсати амниятро эҷод мекунад. Дар ҳоле ки ӯ сиёсатҳои шабакаи Кубернетесро ҳамчун як воситаи хеле пурқувват барои сегментатсияи шабака дар кластер медонад, вай инчунин боварӣ дорад, ки татбиқи онҳо дар амал чандон осон нест. Ин мавод (хеле ҳаҷм) барои баланд бардоштани сатҳи огоҳии мутахассисон аз ин масъала ва кӯмак ба онҳо дар сохтани конфигуратсияҳои зарурӣ пешбинӣ шудааст.

Имрӯз, бисёре аз ширкатҳо барои иҷрои барномаҳои худ Kubernetes-ро бештар интихоб мекунанд. Таваҷҷӯҳ ба ин нармафзор он қадар зиёд аст, ки баъзеҳо Kubernetes-ро "системаи нави оператсионии маркази додаҳо" меноманд. Оҳиста-оҳиста, Kubernetes (ё k8s) ҳамчун як ҷузъи муҳими тиҷорат қабул карда мешавад, ки ташкили равандҳои тиҷоратии баркамол, аз ҷумла амнияти шабакаро талаб мекунад.

Барои мутахассисони амният, ки аз кор бо Кубернетес ба ҳайрат меоянд, ваҳйи воқеӣ метавонад сиёсати пешфарзии платформа бошад: ҳама чизро иҷозат диҳед.

Ин дастур ба шумо дар фаҳмидани сохтори дохилии сиёсатҳои шабака кӯмак мекунад; фаҳмед, ки чӣ тавр онҳо аз қоидаҳои брандмауэрҳои муқаррарӣ фарқ мекунанд. Он инчунин баъзе домҳоро фаро мегирад ва тавсияҳо медиҳад, ки барои бехатарии барномаҳо дар Kubernetes кӯмак расонанд.

Сиёсати шабакаи Kubernetes

Механизми сиёсати шабакаи Kubernetes ба шумо имкон медиҳад, ки ҳамкории барномаҳои дар платформа ҷойгиршуда дар қабати шабакаро идора кунед (севум дар модели OSI). Сиёсати шабакавӣ баъзе хусусиятҳои пешрафтаи деворҳои замонавӣ, аз қабили иҷрои OSI Layer 7 ва ошкор кардани таҳдидҳо надоранд, аммо онҳо сатҳи асосии амнияти шабакаро таъмин мекунанд, ки нуқтаи ибтидоии хуб аст.

Сиёсати шабакавӣ иртибот байни подкҳоро назорат мекунад

Сарбории корӣ дар Кубернетес дар байни подкҳо тақсим карда мешавад, ки аз як ё якчанд контейнерҳои якҷоя ҷойгиршуда иборатанд. Кубернетес ба ҳар як подк суроғаи IP таъин мекунад, ки аз дигар подкҳо дастрас аст. Сиёсати шабакаи Kubernetes ҳуқуқҳои дастрасӣ ба гурӯҳҳои подкҳоро ҳамон тавре муқаррар мекунад, ки гурӯҳҳои амниятӣ дар абр барои назорати дастрасӣ ба мисолҳои мошини виртуалӣ истифода мешаванд.

Муайян кардани сиёсати шабакавӣ

Мисли дигар захираҳои Kubernetes, сиёсатҳои шабакавӣ дар YAML муайян карда шудаанд. Дар мисоли зер, ариза balance дастрасӣ ба postgres:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: balance
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

(Шарҳ. тарҷума.: ин скриншот, ба монанди ҳама скриншотҳои шабеҳи минбаъда, на бо истифода аз асбобҳои аслии Kubernetes, балки бо истифода аз асбоби Tufin Orca, ки аз ҷониби ширкати муаллифи мақолаи аслӣ таҳия шудааст ва дар охири мавод зикр шудааст, сохта шудааст.)

Барои муайян кардани сиёсати шабакаи худ, ба шумо дониши асосии YAML лозим аст. Ин забон ба абзор асос ёфтааст (бо фосилаҳо, на ҷадвалҳо нишон дода шудааст). Элементи дохилшуда ба наздиктарин унсури дар боло ҷойгиршуда тааллуқ дорад. Унсури нави рӯйхат бо дефис оғоз мешавад, ҳама унсурҳои дигар шакл доранд арзиши калидӣ.

Сиёсатро дар YAML тавсиф карда, истифода баред кубектлбарои сохтани он дар кластер:

kubectl create -f policy.yaml

Мушаххасоти сиёсати шабака

Мушаххасоти сиёсати шабакаи Kubernetes чор унсурро дар бар мегирад:

  1. podSelector: pods таъсиргузори аз ин сиёсат муайян мекунад (ҳадафҳо) - зарур;
  2. policyTypes: нишон медиҳад, ки кадом намуди сиёсатҳо ба ин дохил мешаванд: воридшавӣ ва/ё баромадан - ихтиёрӣ, аммо ман тавсия медиҳам, ки онро дар ҳама ҳолатҳо ба таври возеҳ нишон диҳед;
  3. ingress: муайян мекунад, ки иҷозат дода мешавад воридшаванда трафик ба подкҳои мақсаднок - ихтиёрӣ;
  4. egress: муайян мекунад, ки иҷозат дода мешавад баромадкунанда трафик аз қуттиҳои мақсаднок ихтиёрӣ аст.

Намуна аз вебсайти Kubernetes гирифта шудааст (ман иваз кардам role ба app), нишон медиҳад, ки чӣ тавр ҳамаи чор унсур истифода мешаванд:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:    # <<<
    matchLabels:
      app: db
  policyTypes:    # <<<
  - Ingress
  - Egress
  ingress:        # <<<
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:         # <<<
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният
Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Лутфан қайд кунед, ки ҳамаи чор унсур набояд дохил карда шаванд. Ин танҳо ҳатмист podSelector, параметрхои дигарро мувофики хохиш истифода бурдан мумкин аст.

Агар тарк кунед policyTypes, сиёсат чунин маънидод карда мешавад:

  • Бо нобаёнӣ, тахмин карда мешавад, ки он тарафи вурудро муайян мекунад. Агар сиёсат инро ба таври возеҳ баён накунад, система фикр мекунад, ки ҳама трафик манъ аст.
  • Рафтор дар тарафи баромад бо мавҷудият ё набудани параметри мувофиқи баромад муайян карда мешавад.

Барои роҳ надодан ба хатогиҳо ман тавсия медиҳам онро ҳамеша равшан баён кунед policyTypes.

Мувофики мантики боло, агар параметрхое ingress ва / ё egress партофта шуда бошад, сиёсат тамоми трафикро рад мекунад (нигаред ба "Қоидаи тозакунӣ" дар зер).

Сиёсати пешфарз Иҷозат аст

Агар ягон сиёсат муайян карда нашавад, Kubernetes ба таври нобаёнӣ ба ҳама трафик иҷозат медиҳад. Ҳама поддонҳо метавонанд дар байни худ озодона маълумот мубодила кунанд. Ин метавонад аз нуқтаи назари амният мухолифат кунад, аммо дар хотир доред, ки Kubernetes дар ибтидо аз ҷониби таҳиягарон барои фароҳам овардани ҳамкории барномаҳо тарҳрезӣ шудааст. Сиёсати шабака дертар илова карда шуд.

Фазои номҳо

Фазоҳои номҳо механизми ҳамкории Kubernetes мебошанд. Онҳо барои ҷудо кардани муҳити мантиқӣ аз ҳамдигар тарҳрезӣ шудаанд, дар ҳоле ки муоширати байни фосилаҳо ба таври нобаёнӣ иҷозат дода мешавад.

Мисли аксари ҷузъҳои Kubernetes, сиёсатҳои шабакавӣ дар фазои мушаххас зиндагӣ мекунанд. Дар блок metadata шумо метавонед муайян кунед, ки сиёсат ба кадом фазо тааллуқ дорад:

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

Агар фазои ном дар метамаълумот ба таври возеҳ нишон дода нашавад, система фазои номеро, ки дар kubectl нишон дода шудааст (ба таври пешфарз) истифода мебарад namespace=default):

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

Ман тавсия медиҳам фазои номро ба таври возеҳ муайян кунед, агар шумо сиёсатеро нанависед, ки дар як вақт якчанд фазои номҳоро ҳадаф қарор диҳад.

Асосӣ element podSelector дар сиёсат подкҳоро аз фазои ном, ки сиёсат ба он тааллуқ дорад, интихоб мекунад (ба он дастрасӣ ба подкҳо аз фазои номи дигар манъ аст).

Ба ҳамин монанд, podSelectors дар блокҳои дохилшавӣ ва баромад метавонад танҳо подкҳоро аз фазои номи худ интихоб кунад, ба шарте ки шумо онҳоро бо онҳо якҷоя накунед namespaceSelector (дар ин бора дар боби "Филтр аз рӯи фазоҳои номҳо ва қуттиҳо" муҳокима карда мешавад).

Қоидаҳои номгузории сиёсат

Номҳои сиёсат дар як фазои ном беназиранд. Дар як фазо ду сиёсат бо як ном вуҷуд дошта наметавонад, аммо дар ҷойҳои гуногун сиёсатҳо бо ҳамон ном вуҷуд доранд. Ин вақте муфид аст, ки шумо мехоҳед як сиёсатро дар ҷойҳои сершумор дубора татбиқ кунед.

Ба ман махсусан яке аз усулҳои номгузорӣ маъқул аст. Он аз омезиши номи фазои номҳо бо қуттиҳои мақсаднок иборат аст. Барои намуна:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres  # <<<
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Тамғакоғазҳо

Шумо метавонед тамғакоғазҳои фармоиширо ба объектҳои Kubernetes, аз қабили pods ва фазои номҳо часпонед. Нишонҳо (нишонаҳо - барчаспҳо) муодили тегҳо дар абр мебошанд. Сиёсати шабакаи Kubernetes барои интихоб тамғакоғазҳоро истифода мебарад қуттиҳоки ба онҳо муроҷиат мекунанд:

podSelector:
  matchLabels:
    role: db

… ё фазои номҳоки ба онхо мурочиат мекунанд. Ин мисол ҳамаи подкҳоро дар фазои номҳо бо тамғакоғазҳои мувофиқ интихоб мекунад:

namespaceSelector:
  matchLabels:
    project: myproject

Як огоҳӣ: ҳангоми истифода namespaceSelector боварӣ ҳосил кунед, ки фазои номҳое, ки шумо интихоб мекунед, дорои тамғаи дуруст мебошанд. Огоҳ бошед, ки фазои номҳои дарунсохт ба монанди default и kube-system, ба таври нобаёнӣ тамғакоғазҳоро дар бар намегирад.

Шумо метавонед ба чунин фосила нишона илова кунед:

kubectl label namespace default namespace=default

Дар айни замон, фазои номҳо дар бахш metadata бояд ба номи воқеии фазо ишора кунад, на ба нишона:

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

Сарчашма ва макони таъинот

Сиёсати брандмауэр аз қоидаҳо бо манбаъҳо ва самтҳо иборат аст. Сиёсати шабакаи Kubernetes барои ҳадаф муайян карда мешавад - маҷмӯи подкҳо, ки ба онҳо татбиқ мешаванд - ва сипас қоидаҳоро барои трафики воридшавӣ ва/ё баромад муқаррар мекунанд. Дар мисоли мо, ҳадафи сиёсат ҳамаи подкҳо дар фазои номҳо хоҳад буд default бо нишона бо калид app ва маъно db:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: db   # <<<
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният
Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Зеркумита ingress дар ин сиёсат трафики воридотӣ ба подкӯҳҳои мақсаднокро мекушояд. Ба ибораи дигар, воридшавӣ сарчашма ва ҳадаф ҳадафи мувофиқ аст. Ба ҳамин монанд, баромадан макон ва ҳадаф манбаи он аст.

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Ин ба ду қоидаҳои брандмауэр баробар аст: Ingress → Target; Ҳадаф → Хуруҷ.

Хуруҷ ва DNS (муҳим!)

Бо маҳдуд кардани трафики баромад, ба DNS диққати махсус диҳед - Kubernetes ин хидматро барои харитаи хидматҳо ба суроғаҳои IP истифода мебарад. Масалан, сиёсати зерин кор намекунад, зеро шумо ба барнома иҷозат надодаед balance дастрасӣ ба 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Шумо метавонед онро тавассути кушодани дастрасӣ ба хидмати 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Унсури охирин to холист ва аз ин рӯ бавосита интихоб мекунад ҳама паҳлӯҳо дар ҳама фазои номҳо, имкон медихад balance дархостҳои DNS ба хидмати мувофиқи Kubernetes ирсол кунед (одатан дар фазо кор мекунад kube-system).

Бо вуҷуди ин, ин усул кор мекунад аз ҳад зиёд иҷозатдиҳанда ва ноамнӣ, зеро он имкон медиҳад, ки дархостҳои DNS берун аз кластер равона карда шаванд.

Шумо метавонед онро дар се қадами пайдарпай такмил диҳед.

1. Танҳо ба дархостҳои DNS иҷозат диҳед дар дохили кластер бо илова кардан 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

2. Ба дархостҳои DNS танҳо дар фазои ном иҷозат диҳед kube-system.

Барои ин ба шумо лозим аст, ки ба фазои ном нишона илова кунед kube-system: kubectl label namespace kube-system namespace=kube-system - ва онро дар сиёсати истифода нависед 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

3. Одамони параноид метавонанд боз ҳам бештартар раванд ва дархостҳои DNS-ро бо хидмати мушаххаси DNS маҳдуд кунанд kube-system. Бахши "Филтр аз рӯи фазоҳои номҳо ВА подкҳо" ба шумо мегӯяд, ки чӣ гуна ба ин ноил шудан мумкин аст.

Варианти дигар ин ҳалли DNS дар сатҳи фазои ном аст. Дар ин ҳолат, онро барои ҳар як хидмат кушодан лозим нест:

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

Холӣ podSelector ҳамаи подкҳоро дар фазои ном интихоб мекунад.

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Бозии аввал ва тартиби қоида

Дар брандмауэрҳои муқаррарӣ амал (Иҷозат додан ё Инкор кардан) дар баста аз рӯи қоидаи аввалине, ки он қонеъ мекунад, муайян карда мешавад. Дар Кубернетес тартиби сиёсат аҳамият надорад.

Бо нобаёнӣ, вақте ки ҳеҷ гуна сиёсат муқаррар карда нашудааст, иртибот байни подкҳо иҷозат дода мешавад ва онҳо метавонанд озодона маълумот мубодила кунанд. Пас аз он ки шумо таҳияи сиёсатҳоро оғоз мекунед, ҳар як паҳлӯе, ки ба ҳадди аққал яке аз онҳо таъсир мерасонад, мувофиқи тақсимоти (ё мантиқии Ё) ҳамаи сиёсатҳое, ки онро интихоб кардаанд, ҷудо мешаванд. Подҳо, ки ба ягон сиёсат таъсир нарасонанд, кушода боқӣ мемонанд.

Шумо метавонед ин рафторро бо истифода аз қоидаҳои рахнакунӣ тағир диҳед.

Қоидаи ҷудокунӣ ("Рад кардан")

Сиёсати брандмауэр одатан ҳама гуна трафикро, ки ба таври возеҳ иҷозат дода намешавад, рад мекунад.

Дар Кубернетес ягон амали радкунӣ вуҷуд надорад, аммо, таъсири шабеҳро бо сиёсати муқаррарӣ (иҷозатдиҳанда) тавассути интихоби гурӯҳи холии қаҳваҳои манбаъ (дохилшавӣ) ба даст овардан мумкин аст:

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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Ин сиёсат ҳамаи подкҳоро дар фазои ном интихоб мекунад ва вурудро номуайян мегузорад ва ҳама трафики воридотро рад мекунад.

Ба ҳамин монанд, шумо метавонед тамоми трафики содиротӣ аз фазои номро маҳдуд кунед:

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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Лутфан, қайд кунед ҳама гуна сиёсатҳои иловагие, ки имкон медиҳанд трафик ба поддонҳо дар фазои номҳо аз ин қоида бартарӣ дошта бошанд (монанди илова кардани қоидаи иҷозат пеш аз қоидаи радкунӣ дар конфигуратсияи девор).

Ба ҳама чиз иҷозат диҳед (Ягон-Ягон-Ягон-Иҷозат)

Барои эҷод кардани сиёсати Иҷозат додан ба ҳама, шумо бояд сиёсати Инкорро дар боло бо унсури холӣ илова кунед ingress:

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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Он имкон медиҳад, ки дастрасӣ аз ҳама паҳлӯҳо дар ҳама фазоҳои номҳо (ва ҳама IP) ба ягон подкӯҳ дар фазои номҳо default. Ин рафтор бо нобаёнӣ фаъол аст, аз ин рӯ одатан минбаъд муайян кардан лозим нест. Бо вуҷуди ин, баъзан ба шумо лозим меояд, ки баъзе иҷозатҳои мушаххасро барои ташхиси мушкилот муваққатан ғайрифаъол кунед.

Қоидаро метавон маҳдуд кард, то дастрасӣ танҳо ба маҷмӯи мушаххаси гулҳо (app:balance) дар фазои ном default:

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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Сиёсати зерин имкон медиҳад, ки ҳама трафики вуруд ва баромад, аз ҷумла дастрасӣ ба ҳама гуна IP берун аз кластер:

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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният
Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Якҷоя кардани сиёсатҳои сершумор

Сиёсатҳо бо истифода аз мантиқи ё дар се сатҳ муттаҳид карда мешаванд; Иҷозатҳои ҳар як поддон мувофиқи тақсимоти ҳама сиёсатҳое, ки ба он таъсир мерасонанд, муқаррар карда мешаванд:

1. Дар сахрохо from и to Се намуди элементҳоро метавон муайян кард (ҳамаи онҳо бо истифода аз OR якҷоя карда мешаванд):

  • namespaceSelector — тамоми фазои номро интихоб мекунад;
  • podSelector — порчаҳоро интихоб мекунад;
  • ipBlock — зершабакаро интихоб мекунад.

Ғайр аз он, шумораи элементҳо (ҳатто якхела) дар зерфаслҳо from/to маҳдуд нест. Ҳамаи онҳо бо 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

2. Дар дохили бахши сиёсат ingress метавонад унсурҳои зиёде дошта бошад from (бо OR мантиқӣ якҷоя карда мешавад). Ба ҳамин монанд, бахш egress метавонад унсурҳои зиёдеро дар бар гирад to (инчунин бо дизюнксия якҷоя карда шудааст):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
  - from:
    - podSelector:
        matchLabels:
          app: admin
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

3. Сиёсатҳои гуногун инчунин бо OR мантиқӣ якҷоя карда мешаванд

Аммо ҳангоми якҷоя кардани онҳо, як маҳдудият вуҷуд дорад, ки дар он ишора кард Крис Куни: Kubernetes метавонад танҳо сиёсатҳоро бо гуногун муттаҳид созад policyTypes (Ingress ё Egress). Сиёсатҳое, ки воридшавӣ (ё баромадан)-ро муайян мекунанд, якдигарро аз нав менависанд.

Муносибати байни фазоҳои ном

Бо нобаёнӣ, мубодилаи маълумот байни фазоҳои номҳо иҷозат дода мешавад. Инро бо истифода аз сиёсати радкунӣ, ки трафики содиротӣ ва/ё воридотро ба фазои ном маҳдуд мекунад, тағир додан мумкин аст (ниг. "Қоидаи хориҷшавӣ" дар боло).

Пас аз он ки шумо дастрасӣ ба фазои номро масдуд кардед (ниг. ба "Қоидаи хориҷшавӣ" дар боло), шумо метавонед бо иҷозати пайвастшавӣ аз фазои номи мушаххас бо истифода аз сиёсати радкунӣ истисноҳо кунед. 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Дар натиҷа, ҳамаи подкҳо дар фазои номҳо default ба подаҳо дастрасӣ пайдо мекунанд postgres дар фазои ном database. Аммо чӣ мешавад, агар шумо хоҳед, ки дастрасӣ ба онро кушоед postgres танҳо pods мушаххас дар фазои ном default?

Аз рӯи фазоҳои номҳо ва қуттиҳо филтр кунед

Версияи Kubernetes 1.11 ва навтар ба шумо имкон медиҳад, ки операторҳоро якҷоя кунед namespaceSelector и podSelector бо истифода аз мантиқии ВА. Чунин ба назар мерасад:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: database.postgres
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: postgres
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          namespace: default
      podSelector: # <<<
        matchLabels:
          app: admin
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Чаро ин ба ҷои OR муқаррарӣ ҳамчун ВА тафсир карда мешавад?

дар назар гиред, ки podSelector бо дефис сар намешавад. Дар YAML ин маънои онро дорад podSelector ва дар назди ӯ истода namespaceSelector ба ҳамон унсури рӯйхат муроҷиат кунед. Аз ин рӯ, онҳо бо мантиқии ВА муттаҳид мешаванд.

Илова кардани дефис пеш podSelector боиси пайдоиши элементи нави рӯйхат мегардад, ки бо унсури қаблӣ якҷоя карда мешавад namespaceSelector бо истифода аз OR мантиқӣ.

Барои интихоби қуттиҳои дорои тамғаи мушаххас дар ҳама фазои номҳо, холӣ ворид кунед 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

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Якчанд тамғакоғазҳо бо I муттаҳид мешаванд

Қоидаҳои брандмауэр бо якчанд объектҳо (хостҳо, шабакаҳо, гурӯҳҳо) бо истифода аз OR мантиқӣ якҷоя карда мешаванд. Қоидаи зерин кор хоҳад кард, агар манбаи баста мувофиқат кунад Host_1 Ё Host_2:

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

Баръакс, дар Кубернетес тамғакоғазҳои гуногун дар podSelector ё namespaceSelector бо мантиқии ВА муттаҳид карда мешаванд. Масалан, қоидаи зерин подкладҳоро интихоб мекунад, ки ҳарду нишона доранд, role=db И version=v2:

podSelector:
  matchLabels:
    role: db
    version: v2

Ҳамин мантиқ ба ҳамаи намудҳои операторҳо дахл дорад: интихобкунандагони ҳадафҳои сиёсат, интихобкунандагони подкӯҳҳо ва интихобкунандагони фазои ном.

Зершабакаҳо ва суроғаҳои IP (IPBlocks)

Сипар деворҳо VLAN, суроғаҳои IP ва зершабакаҳоро барои сегменти шабака истифода мебаранд.

Дар Kubernetes, суроғаҳои IP ба pods ба таври худкор таъин карда мешаванд ва метавонанд зуд-зуд иваз карда шаванд, аз ин рӯ тамғакоғазҳо барои интихоби pods ва фазои номҳо дар сиёсатҳои шабака истифода мешаванд.

Зершабакаҳо (ipBlocks) ҳангоми идоракунии пайвастҳои берунӣ (шимолу ҷануб) истифода мешаванд. Масалан, ин сиёсат барои ҳама паҳлӯҳо аз фазои номҳо мекушояд default дастрасӣ ба хидмати Google DNS:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-dns
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    ports:
    - protocol: UDP
      port: 53

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Селектори қуттии холӣ дар ин мисол маънои "ҳама подкастҳоро дар фазои ном интихоб кунед" -ро дорад.

Ин сиёсат танҳо дастрасӣ ба 8.8.8.8 иҷозат медиҳад; дастрасӣ ба ҳама гуна IP дигар манъ аст. Ҳамин тавр, аслан шумо дастрасӣ ба хидмати дохилии Kubernetes DNS-ро бастаед. Агар шумо то ҳол мехоҳед онро кушоед, инро ба таври возеҳ нишон диҳед.

одатан ipBlocks и podSelectors ҳамдигарро истисно мекунанд, зеро суроғаҳои IP-и дохилии pods дар ipBlocks. Бо нишон додани қуттиҳои дохилии IP, шумо воқеан ба пайвастшавӣ ба/аз pods бо ин суроғаҳо иҷозат медиҳед. Дар амал, шумо намедонед, ки кадом суроғаи IP-ро истифода бурдан лозим аст, бинобар ин онҳо набояд барои интихоби pods истифода шаванд.

Ҳамчун мисол, сиёсати зерин ҳамаи IP-ҳоро дар бар мегирад ва аз ин рӯ, дастрасӣ ба ҳама подкастҳои дигарро иҷозат медиҳад:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Шумо метавонед дастрасиро танҳо ба IP-ҳои беруна кушоед, ба истиснои суроғаҳои IP-и дохилии pods. Масалан, агар зершабакаи подтаи шумо 10.16.0.0/14 бошад:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-any
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.16.0.0/14

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Портҳо ва протоколҳо

Одатан поддонҳо як портро гӯш мекунанд. Ин маънои онро дорад, ки шумо наметавонед рақамҳои портро дар сиёсатҳо муайян кунед ва ҳама чизро ҳамчун пешфарз гузоред. Бо вуҷуди ин, тавсия дода мешавад, ки сиёсатҳоро то ҳадди имкон маҳдуд кунед, аз ин рӯ дар баъзе ҳолатҳо шумо метавонед портҳоро муайян кунед:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
      - port: 443      # <<<
        protocol: TCP  # <<<
      - port: 80       # <<<
        protocol: TCP  # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Дар хотир доред, ки интихобкунанда ports ба хамаи элементхои блок дахл дорад to ё from, ки дар бар мегирад. Барои муайян кардани портҳои гуногун барои маҷмӯи гуногуни элементҳо, тақсим кунед ingress ё egress ба якчанд зерфаслҳо бо to ё from ва дар ҳар як бақайдгирии портҳои шумо:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default.postgres
  namespace: default
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: indexer
    ports:             # <<<
     - port: 443       # <<<
       protocol: TCP   # <<<
  - from:
    - podSelector:
        matchLabels:
          app: admin
    ports:             # <<<
     - port: 80        # <<<
       protocol: TCP   # <<<
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
  - Ingress

Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният

Амали порти пешфарз:

  • Агар шумо таърифи портро комилан тарк кунед (ports), ин маънои ҳама протоколҳо ва ҳама портҳоро дорад;
  • Агар шумо таърифи протоколро (protocol), ин маънои TCP;
  • Агар шумо таърифи портро (port), ин маънои ҳамаи портҳоро дорад.

Таҷрибаи беҳтарин: Ба арзишҳои пешфарз такя накунед, он чизеро, ки ба шумо лозим аст, дақиқ муайян кунед.

Лутфан қайд кунед, ки шумо бояд бандарҳои хидматрасониро истифода баред, на портҳои хидматӣ (бештар дар ин бора дар сархати оянда).

Оё сиёсатҳо барои pods ё хидматҳо муайян карда шудаанд?

Одатан, подкладҳо дар Кубернетес тавассути хидмат ба ҳамдигар дастрасӣ пайдо мекунанд - мувозинати сарбории маҷозӣ, ки трафикро ба подкҳое, ки хидматро амалӣ мекунанд, равона мекунад. Шумо шояд фикр кунед, ки сиёсати шабакавӣ дастрасӣ ба хидматҳоро назорат мекунад, аммо ин тавр нест. Сиёсати шабакавии Kubernetes на дар портҳои хидматрасонӣ, балки дар бандарҳои pod кор мекунад.

Масалан, агар хадамот ба порти 80 гӯш диҳад, аммо трафикро ба порти 8080-и подкҳои худ равона кунад, шумо бояд дар сиёсати шабака дақиқ 8080-ро муайян кунед.

Чунин механизмро бояд ғайримуқаррарӣ ҳисоб кард: агар сохтори дохилии хидмат (бандарҳои онҳо гӯш мекунанд) тағир ёбад, сиёсати шабака бояд нав карда шавад.

Равиши нави меъморӣ бо истифода аз Service Mesh (масалан, дар бораи Истио дар зер нигаред - тақрибан тарҷума.) ба шумо имкон медиҳад, ки бо ин мушкилот мубориза баред.

Оё ба қайд гирифтани ҳам Ingress ва Egress зарур аст?

Ҷавоби кӯтоҳ бале ин аст, ки барои муошират кардани pod A бо pod B, ба он бояд иҷозат дода шавад, ки пайвасти содиротӣ эҷод кунад (барои ин шумо бояд сиёсати баромадро танзим кунед) ва pod B бояд пайвасти даромадро қабул кунад ( барои ин, мутаносибан, ба шумо сиёсати дохилшавӣ лозим аст).

Аммо, дар амал, шумо метавонед ба сиёсати пешфарз такя кунед, то ба пайвастшавӣ дар як ё ду самт иҷозат диҳед.

Агар баъзе под-манбаъ як ё якчанд интихоб карда мешавад баромадан-сиёсатмадорон, махдудиятхое, ки ба он мукаррар карда мешаванд, бо дизюнксияи онхо муайян карда мешавад. Дар ин ҳолат, ба шумо лозим меояд, ки ба таври возеҳ пайвастшавӣ ба pod -ба адресат. Агар поддон бо ягон сиёсат интихоб нашавад, трафики баромади (баромади) он ба таври нобаёнӣ иҷозат дода мешавад.

Ба хамин тарик, такдири подсуроға, аз ҷониби як ё якчанд интихобшуда воридшавӣ-сиёсатмадорон, аз рУи дизюнксияашон муайян карда мешавад. Дар ин ҳолат, шумо бояд ба таври возеҳ иҷозат диҳед, ки трафикро аз поди манбаъ қабул кунад. Агар поддон аз рӯи ягон сиёсат интихоб нашавад, ҳама трафики воридшавӣ барои он ба таври нобаёнӣ иҷозат дода мешавад.

Дар поён нигаред.

Гузоришҳо

Сиёсати шабакаи Kubernetes наметавонанд трафикро сабт кунанд. Ин муайян кардани он ки оё сиёсат мувофиқи пешбинишуда кор мекунад ё не, душвор мегардонад ва таҳлили амниятро хеле мушкил мекунад.

Назорати трафик ба хидматҳои беруна

Сиёсати шабакаи Kubernetes ба шумо имкон намедиҳад, ки дар қисматҳои баромад номи домени пурраи тахассусиро (DNS) муайян кунед. Ин далел ҳангоми кӯшиши маҳдуд кардани трафик ба самтҳои беруна, ки суроғаи IP-и собит надоранд (масалан aws.com) боиси нороҳатии назаррас мегардад.

Санҷиши сиёсат

Firewallҳо шуморо огоҳ мекунанд ё ҳатто қабули сиёсати нодурустро рад мекунанд. Кубернетес инчунин баъзе санҷишҳоро анҷом медиҳад. Ҳангоми муқаррар кардани сиёсати шабака тавассути kubectl, Кубернетес метавонад эълом кунад, ки он нодуруст аст ва қабули онро рад кунад. Дар ҳолатҳои дигар, Кубернетес сиёсатро мегирад ва онро бо тафсилоти гумшуда пур мекунад. Онҳоро бо истифода аз фармон дидан мумкин аст:

kubernetes get networkpolicy <policy-name> -o yaml

Дар хотир доред, ки системаи тасдиқи Kubernetes беэътибор нест ва метавонад баъзе намуди хатоҳоро аз даст диҳад.

Иҷрокунӣ

Kubernetes худ сиёсати шабакаро амалӣ намекунад, балки танҳо як шлюзи API мебошад, ки бори назоратро ба системаи асосие бо номи Интерфейси Шабакаи Контейнерӣ (CNI) вогузор мекунад. Муқаррар кардани сиёсатҳо дар кластери Kubernetes бидуни таъини CNI мувофиқ бо эҷоди сиёсатҳо дар сервери идоракунии брандмауэр бе насби онҳо дар брандмауэрҳо баробар аст. Ин ба шумо вобаста аст, ки шумо CNI-и муносиб дошта бошед ё дар мавриди платформаҳои Kubernetes, дар абр ҷойгир карда шудааст. (шумо метавонед рӯйхати провайдерҳоро бинед дар ин ҷо — тахминан. транс.), сиёсатҳои шабакаро фаъол созед, ки CNI-ро барои шумо муқаррар мекунанд.

Дар хотир доред, ки Kubernetes шуморо огоҳ намекунад, агар шумо сиёсати шабакаро бе ёрдамчии мувофиқи CNI муқаррар кунед.

Давлатдор ё бидуни шаҳрвандӣ?

Ҳама CNI-ҳои Kubernetes, ки ман дучор шудаам, ҳолати мушаххас доранд (масалан, Calico Linux conntrack -ро истифода мебарад). Ин ба поддон имкон медиҳад, ки посухҳоро дар пайвасти TCP, ки оғоз кардааст, бидуни барқарорсозии он қабул кунад. Аммо, ман стандарти Kubernetes-ро намедонам, ки ҳолати давлатиро кафолат медиҳад.

Идоракунии пешрафтаи сиёсати амният

Инҳоянд баъзе роҳҳои беҳтар кардани татбиқи сиёсати амният дар Кубернетес:

  1. Намунаи меъмории Service Mesh контейнерҳои паҳлӯиро барои таъмини телеметрия ва назорати трафик дар сатҳи хидматрасонӣ истифода мебарад. Ба сифати мисол мо метавонем Истио.
  2. Баъзе аз фурӯшандагони CNI асбобҳои худро барои гузаштан аз сиёсати шабакаи Kubernetes васеъ кардаанд.
  3. Туфин Орка Намоиш ва автоматизатсияи сиёсатҳои шабакаи Kubernetes -ро таъмин мекунад.

Бастаи Tufin Orca сиёсатҳои шабакаи Kubernetes -ро идора мекунад (ва манбаи скриншотҳои дар боло овардашуда мебошад).

маълумоти иловагӣ

хулоса

Сиёсати шабакаи Kubernetes маҷмӯи хуби абзорҳоро барои сегментатсия кардани кластерҳо пешниҳод мекунад, аммо онҳо интуитивӣ нестанд ва нозукиҳои зиёд доранд. Аз сабаби ин мураккабӣ, ман боварӣ дорам, ки бисёре аз сиёсатҳои кластерии мавҷуда хато мекунанд. Роҳҳои имконпазири ин мушкилот автоматикунонии таърифҳои сиёсат ё истифодаи дигар абзорҳои сегментатсияро дар бар мегиранд.

Ман умедворам, ки ин дастур барои равшан кардани баъзе саволҳо ва ҳалли мушкилоте, ки шумо дучор мешавед, кӯмак мекунад.

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ