Pag-unawa sa mga opsyon sa patakaran sa network gamit ang Calico

Pag-unawa sa mga opsyon sa patakaran sa network gamit ang Calico

Ang Calico network plugin ay nagbibigay ng malawak na hanay ng mga patakaran sa network na may pinag-isang syntax upang protektahan ang mga host ng hardware, virtual machine at pod. Maaaring ilapat ang mga patakarang ito sa loob ng isang namespace o maging mga patakaran sa pandaigdigang network na nalalapat sa endpoint ng host (upang protektahan ang mga application na direktang tumatakbo sa host - ang host ay maaaring isang server o isang virtual machine) o endpoint ng workload (upang protektahan ang mga application na tumatakbo sa mga container o naka-host na virtual machine). Binibigyang-daan ka ng mga patakaran ng Calico na maglapat ng mga hakbang sa seguridad sa iba't ibang punto sa landas ng isang packet gamit ang mga opsyon gaya ng preDNAT, unraracked, at applyOnForward. Ang pag-unawa sa kung paano gumagana ang mga opsyong ito ay makakatulong na mapabuti ang seguridad at pagganap ng iyong pangkalahatang system. Ipinapaliwanag ng artikulong ito ang kakanyahan ng mga opsyon sa patakaran ng Calico na ito (preDNAT, unraracked at applyOnForward) na inilapat sa mga endpoint ng host, na may diin sa kung ano ang nangyayari sa mga path processing ng packet (mga iptabels chain).

Ipinapalagay ng artikulong ito na mayroon kang pangunahing pag-unawa sa kung paano gumagana ang mga patakaran sa network ng Kubernetes at Calico. Kung hindi, inirerekomenda naming subukan ito pangunahing tutorial sa patakaran sa network ΠΈ tutorial sa proteksyon ng host gamit ang Calico bago basahin ang artikulong ito. Inaasahan din namin na magkakaroon ka ng pangunahing pag-unawa sa gawain iptables sa linux.

kalenkor patakaran sa pandaigdigang network nagbibigay-daan sa iyong maglapat ng isang hanay ng mga panuntunan sa pag-access ayon sa mga label (sa mga pangkat ng mga host at workload/pod). Ito ay lubhang kapaki-pakinabang kung gagamit ka ng magkakaibang mga sistema nang magkasama - mga virtual machine, isang sistema nang direkta sa hardware, o isang kubernetes na imprastraktura. Bilang karagdagan, maaari mong protektahan ang iyong cluster (node) gamit ang isang hanay ng mga patakarang deklaratibo at ilapat ang mga patakaran sa network sa papasok na trapiko (halimbawa, sa pamamagitan ng serbisyo ng NodePorts o External IPs).

Sa isang pangunahing antas, kapag ikinonekta ng Calico ang isang pod sa network (tingnan ang diagram sa ibaba), ikinokonekta nito ito sa host gamit ang isang virtual Ethernet interface (veth). Ang trapikong ipinadala ng pod ay dumarating sa host mula sa virtual na interface na ito at pinoproseso sa parehong paraan na parang nagmula ito sa isang pisikal na interface ng network. Bilang default, pinangalanan ng Calico ang mga interface na ito ng caliXXX. Dahil ang trapiko ay dumarating sa pamamagitan ng virtual na interface, ito ay dumaan sa mga iptable na parang ang pod ay isang hop ang layo. Samakatuwid, kapag ang trapiko ay dumating sa/mula sa isang pod, ito ay ipinapasa mula sa punto ng view ng host.

Sa isang Kubernetes node na tumatakbo sa Calico, maaari mong imapa ang isang virtual na interface (veth) sa isang workload gaya ng sumusunod. Sa halimbawa sa ibaba, makikita mo na ang veth#10 (calic1cbf1ca0f8) ay konektado sa cnx-manager-* sa calico-monitoring namespace.

[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
...

[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m                            ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...

Pag-unawa sa mga opsyon sa patakaran sa network gamit ang Calico

Dahil ang Calico ay gumagawa ng veth interface para sa bawat workload, paano ito nagpapatupad ng mga patakaran? Upang gawin ito, lumilikha ang Calico ng mga kawit sa iba't ibang mga kadena ng landas sa pagproseso ng packet gamit ang mga iptable.

Ang diagram sa ibaba ay nagpapakita ng mga chain na kasangkot sa packet processing sa iptables (o ang netfilter subsystem). Kapag dumating ang isang packet sa pamamagitan ng network interface, dumaan muna ito sa PREROUTING chain. Ang isang desisyon sa pagruruta ay ginawa, at batay dito, ang packet ay dumadaan sa alinman sa INPUT (itinuro sa mga proseso ng host) o FORWARD (itinuro sa isang pod o isa pang node sa network). Mula sa lokal na proseso, dumaan ang packet sa OUTPUT at pagkatapos ay POSTROUTING chain bago ibinaba ang cable.

Tandaan na ang pod ay isa ring panlabas na entity (nakakonekta sa veth) sa mga tuntunin ng pagproseso ng iptables. Ibuod natin:

  • Ang ipinasa na trapiko (nat, niruruta o papunta/mula sa isang pod) ay dumadaan sa PREROUTING - FORWARD - POSTROUTING chain.
  • Ang trapiko sa proseso ng lokal na host ay dumadaan sa PREROUTING - INPUT chain.
  • Ang trapiko mula sa proseso ng lokal na host ay dumadaan sa OUTPUT - POSTROUTING chain.

Pag-unawa sa mga opsyon sa patakaran sa network gamit ang Calico

Nagbibigay ang Calico ng mga opsyon sa patakaran na nagbibigay-daan sa iyong maglapat ng mga patakaran sa lahat ng chain. Sa pag-iisip na iyon, tingnan natin ang iba't ibang opsyon sa configuration ng patakaran na available sa Calico. Ang mga numero sa listahan ng mga opsyon sa ibaba ay tumutugma sa mga numero sa diagram sa itaas.

  1. Patakaran sa endpoint (pod) ng workload
  2. Patakaran sa endpoint ng host
  3. Opsyon na ApplyOnForward
  4. Patakaran sa PreDNAT
  5. Hindi Sinusubaybayang Patakaran

Magsimula tayo sa pamamagitan ng pagtingin sa kung paano inilalapat ang mga patakaran sa mga endpoint ng workload (mga Kubernetes pod o OpenStack VM), at pagkatapos ay tingnan ang mga opsyon sa patakaran para sa mga endpoint ng host.

Mga Endpoint sa Workload

Patakaran sa Endpoint ng Workload (1)

Isa itong opsyon para protektahan ang iyong mga kubernetes pod. Sinusuportahan ng Calico ang pagtatrabaho sa Kubernetes NetworkPolicy, ngunit nagbibigay din ito ng mga karagdagang patakaran - Calico NetworkPolicy at GlobalNetworkPolicy. Gumagawa ang Calico ng chain para sa bawat pod (workload) at mga hook sa INPUT at OUTPUT chain para sa workload sa filter table ng FORWARD chain.

Mga Endpoint ng Host

Host Endpoint Policy (2)

Bilang karagdagan sa CNI (container network interface), ang mga patakaran ng Calico ay nagbibigay ng kakayahang protektahan ang host mismo. Sa Calico, maaari kang lumikha ng host endpoint sa pamamagitan ng pagtukoy ng kumbinasyon ng host interface at, kung kinakailangan, mga numero ng port. Ang pagpapatupad ng patakaran para sa entity na ito ay nakakamit gamit ang isang filter na talahanayan sa INPUT at OUTPUT chain. Tulad ng makikita mo mula sa diagram, (2) nalalapat ang mga ito sa mga lokal na proseso sa node/host. Ibig sabihin, kung gagawa ka ng patakaran na nalalapat sa endpoint ng host, hindi ito makakaapekto sa trapiko papunta/mula sa iyong mga pod. Ngunit nagbibigay ito ng isang interface/syntax para sa pagharang ng trapiko para sa iyong host at mga pod gamit ang mga patakaran ng Calico. Lubos nitong pinapasimple ang proseso ng pamamahala ng mga patakaran para sa isang magkakaibang network. Ang pag-configure ng mga patakaran sa endpoint ng host upang mapahusay ang seguridad ng cluster ay isa pang mahalagang kaso ng paggamit.

ApplyOnForward Policy (3)

Available ang opsyong ApplyOnForward sa patakaran ng Calico global network upang payagan ang mga patakarang mailapat sa lahat ng trapikong dumadaan sa endpoint ng host, kabilang ang trapikong ipapasa ng host. Kabilang dito ang trapikong ipinapasa sa lokal na pod o saanman sa network. Kinakailangan ng Calico na i-enable ang setting na ito para sa mga patakarang gumagamit ng PreDNAT at hindi sinusubaybayan, tingnan ang mga sumusunod na seksyon. Bilang karagdagan, maaaring gamitin ang ApplyOnForward upang subaybayan ang trapiko ng host sa mga kaso kung saan ginagamit ang isang virtual na router o software NAT.

Tandaan na kung kailangan mong ilapat ang parehong patakaran sa network sa parehong mga proseso ng host at pod, hindi mo kailangang gamitin ang opsyon na ApplyOnForward. Ang kailangan mo lang gawin ay gumawa ng label para sa kinakailangang hostendpoint at workload endpoint (pod). Ang Calico ay sapat na matalino upang ipatupad ang patakaran batay sa mga label, anuman ang uri ng endpoint (hostendpoint o workload).

Patakaran sa PreDNAT (4)

Sa Kubernetes, maaaring ilantad ang mga port ng entity ng serbisyo gamit ang opsyong NodePorts o, opsyonal (kapag gumagamit ng Calico), sa pamamagitan ng pag-advertise sa mga ito gamit ang mga opsyon sa Cluster IP o External IPs. Binabalanse ng Kube-proxy ang papasok na trapiko na nakatali sa isang serbisyo sa mga pod ng kaukulang serbisyo gamit ang DNAT. Dahil dito, paano mo ipapatupad ang mga patakaran para sa trapikong dumarating sa NodePorts? Upang matiyak na ang mga patakarang ito ay inilalapat bago ang trapiko ay naproseso ng DNAT (na isang pagmamapa sa pagitan ng host:port at kaukulang serbisyo), nagbibigay ang Calico ng parameter para sa globalNetworkPolicy na tinatawag na "preDNAT: true."

Kapag pinagana ang pre-DNAT, ipinapatupad ang mga patakarang ito sa (4) sa diagram - sa mangle table ng PREROUTING chain - kaagad bago ang DNAT. Ang karaniwang pagkakasunud-sunod ng mga patakaran ay hindi sinusunod dito, dahil ang paglalapat ng mga patakarang ito ay nangyayari nang mas maaga sa landas ng pagproseso ng trapiko. Gayunpaman, iginagalang ng mga patakaran ng preDNAT ang pagkakasunud-sunod ng aplikasyon sa kanilang mga sarili.

Kapag gumagawa ng mga patakaran gamit ang pre-DNAT, mahalagang maging maingat sa trapikong gusto mong iproseso at payagan ang karamihan na tanggihan. Ang trapikong minarkahan bilang 'payagan' sa patakarang pre-DNAT ay hindi na susuriin ng patakaran sa hostendpoint, habang ang trapikong nabigo sa patakarang pre-DNAT ay magpapatuloy sa mga natitirang chain.
Ginawa itong mandatory ng Calico na paganahin ang opsyon na applyOnForward kapag gumagamit ng preDNAT, dahil sa kahulugan ay hindi pa napili ang patutunguhan ng trapiko. Maaaring idirekta ang trapiko sa proseso ng host, o maaari itong ipasa sa isang pod o ibang node.

Hindi Sinusubaybayan na Patakaran (5)

Ang mga network at application ay maaaring magkaroon ng malaking pagkakaiba sa pag-uugali. Sa ilang matinding kaso, maaaring makabuo ang mga application ng maraming panandaliang koneksyon. Maaari itong maging sanhi ng conntrack (isang pangunahing bahagi ng Linux networking stack) na maubusan ng memorya. Ayon sa kaugalian, upang patakbuhin ang mga ganitong uri ng application sa Linux, kailangan mong manu-manong i-configure o i-disable ang conntrack, o magsulat ng mga panuntunan sa iptables upang i-bypass ang conntrack. Ang hindi sinusubaybayang patakaran sa Calico ay isang mas simple at mas mahusay na opsyon kung gusto mong iproseso ang mga koneksyon sa lalong madaling panahon. Halimbawa, kung gumagamit ka ng napakalaking memcache o bilang karagdagang sukatan ng proteksyon laban sa DDOS.

Basahin mo ito blog post (O aming pagsasalin) para sa higit pang impormasyon, kabilang ang mga pagsubok sa pagganap gamit ang hindi sinusubaybayang patakaran.

Kapag itinakda mo ang opsyong "doNotTrack: true" sa Calico globalNetworkPolicy, ito ay magiging isang **untracked** policy at inilapat nang maaga sa pipeline ng pagproseso ng packet ng Linux. Sa pagtingin sa diagram sa itaas, ang mga hindi sinusubaybayang patakaran ay inilalapat sa PREROUTING at OUTPUT chain sa raw table bago magsimula ang pagsubaybay sa koneksyon (conntrack). Kapag ang isang packet ay pinahihintulutan ng hindi sinusubaybayang patakaran, ito ay minarkahan upang huwag paganahin ang pagsubaybay sa koneksyon para sa packet na iyon. Ibig sabihin:

  • Ang hindi sinusubaybayang patakaran ay inilalapat sa bawat packet na batayan. Walang konsepto ng koneksyon (o daloy). Ang kakulangan ng mga koneksyon ay may ilang mahahalagang kahihinatnan:
  • Kung gusto mong payagan ang trapiko ng kahilingan at pagtugon, kailangan mo ng panuntunan para sa papasok at papalabas (dahil karaniwang gumagamit ang Calico ng conntrack upang markahan ang trapiko ng pagtugon bilang pinapayagan).
  • Ang hindi sinusubaybayang patakaran ay hindi gumagana para sa mga Kubernetes workload (pods), dahil sa kasong ito ay walang paraan upang masubaybayan ang papalabas na koneksyon mula sa pod.
  • Hindi gumagana nang tama ang NAT sa mga hindi sinusubaybayang packet (dahil iniimbak ng kernel ang NAT mapping sa conntrack).
  • Kapag dumaan sa panuntunang "payagan ang lahat" sa hindi sinusubaybayang patakaran, ang lahat ng packet ay mamarkahan bilang hindi sinusubaybayan. Ito ay halos palaging hindi kung ano ang gusto mo, kaya mahalagang maging masyadong mapili tungkol sa mga packet na pinapayagan ng hindi sinusubaybayang mga patakaran (at payagan ang karamihan sa trapiko na dumaan sa mga normal na sinusubaybayang patakaran).
  • Ang mga hindi sinusubaybayang patakaran ay inilalapat sa pinakasimula ng packet processing pipeline. Napakahalaga nitong maunawaan kapag gumagawa ng mga patakaran ng Calico. Maaari kang magkaroon ng patakaran sa pod na may order:1 at isang hindi sinusubaybayang patakaran na may order:1000. Hindi mahalaga. Ilalapat ang patakarang Hindi Sinusubaybayan bago ang patakaran para sa pod. Iginagalang lamang ng mga hindi sinusubaybayang patakaran ang pagkakasunud-sunod ng pagpapatupad.

Dahil ang isa sa mga layunin ng patakaran ng doNotTrack ay upang ipatupad ang patakaran nang maaga sa pipeline ng pagproseso ng packet ng Linux, ginagawang mandatoryo ng Calico na tukuyin ang opsyon na applyOnForward kapag gumagamit ng doNotTrack. Sa pagtukoy sa diagram sa pagpoproseso ng packet, tandaan na ang patakarang hindi sinusubaybayan (5) ay inilalapat bago ang anumang mga desisyon sa pagruruta. Maaaring idirekta ang trapiko sa proseso ng host, o maaari itong ipasa sa isang pod o ibang node.

Mga resulta ng

Tiningnan namin ang iba't ibang opsyon sa patakaran (Host endpoint, ApplyOnForward, preDNAT, at Untracked) sa Calico at kung paano inilalapat ang mga ito sa path ng pagpoproseso ng packet. Ang pag-unawa sa kung paano gumagana ang mga ito ay nakakatulong sa pagbuo ng epektibo at ligtas na mga patakaran. Sa Calico maaari kang gumamit ng isang pandaigdigang patakaran sa network na nalalapat sa isang label (isang pangkat ng mga node at pod) at maglapat ng mga patakaran na may iba't ibang mga parameter. Nagbibigay-daan ito sa mga propesyonal sa seguridad at disenyo ng network na maginhawang protektahan ang "lahat" (mga uri ng endpoint) nang sabay-sabay gamit ang isang wika ng patakaran na may mga patakaran sa Calico.

Pasasalamat: Nais kong magpasalamat Sean Crampton ΠΈ Alexa Pollitta para sa kanilang pagsusuri at mahalagang impormasyon.

Pinagmulan: www.habr.com

Magdagdag ng komento