Kubernetes CKA課程筆記 77

Secure Cluster — Control Traffic with Network Policies

ZONGRU Li
Dec 8, 2021

K8s Cluster運行一段時間後,上面已經佈滿許多的Pod

但是在進行資安稽核後得到評估可能有Cluster淪陷的風險

原因是hacker若成功駭入其中一個Pod

就可以透過這個Pod,再駭入其他所有的Pods:

當駭客成功駭進一個Pod內,即表示其他Pod也同時淪陷!

Control Traffic with Network Policies:

  • 預設Pods之間的溝通都是允許的(如下圖)
  • 也就是沒有規則限制Pods之間的溝通
  • K8s則提供一種元件來限制Pods之間的溝通 — NetworkPolicies
  • NetworkPolicies用來限制Pod本身的IPPORT層級的進出入,如下圖
  • NetworkPolicy可由yaml檔來定義
  • 但是實現NetworkPolicy實際上是CNI應用程式 — 我們裝的就是weavenet
  • weavenet是為NetWork Plugin,其控管網路規則
  • 所以透過NetworkPolicy的定義,weavenet則依據規則做網路限制
  • 但是有一個重點是:
  • 不是所有的CNI NetWork Plugin都能支援NetworkPolicy
  • 例如另一個常見的CNINetWork Plugin — flannel
  • flannel就沒辦法配合NetworkPolicy
  • 所以若真有需要再Cluster內部建立Pods間的網路限制
  • 就要特別挑選要安裝的CNI NetWork Plugin

如何建立NetworkPolicy元件?

Network Policy Component
  • 首先要先決定到這個NetworkPolicy是為誰而定的
  • 基本是透過Label決定:
圖上兩個Pods都帶有label為app : mysql,所以這個NetworkPolicy都會生效
  • 其中若是podSelector為空值(如下圖)
  • 則表示該NetworkPolicy生效於所有該NameSpace的全部Pods
podSelector為空值,則表示該NameSpace所有Pods都生效
  • 當然上圖也可以更改另一個NameSpace
  • 使上述空值的podSelector規則生效於另一個NameSpace
  • 接著則是有哪些規則可以定義!?
  • 基本有兩個:
  • 1.進來的(Incoming rules = Ingress)規則,定義誰可以進到這個Pod
  • 2.出去的(Outgoing rules = Egress)規則,定義誰可以離開這個Pod
  • 首先簡單Ingress範例如下:
  • 並且一般來說僅限定某個特殊PORT可供取用,mysql通常開3306
  • 也就是單一個規則會有兩個限制(1.label ,2.PORT)
  • 如上規則下,有一個phpPod沒有帶app: backend label,則會:
  • 除非規則異動為如下
  • php Pod就能夠透過3306 PORT進到mysqlPod內:
  • 接著輪到簡單Egress範例要求如下圖依樣,允許連接到兩個不同DB系統:
  • 則對應的設定如下圖:
記得這個是為app: backend標籤的Pod設的
  • 另外不管進還出的NetworkPolicy,都要特別注意的點是:
特別注意NameSpace!!以上都在相同NameSpace所以生效!
  • 若考量到兩種DBPods
  • 都跟backendPod不同NameSpace的狀況,如何設定?
  • 其實依樣看該NetworkPolicy是為誰而設定的為出發點:
在myapp這個NameSpace中label是app: bankend的Pod設立的規則!
  • 並且完整的設定方式如下:
透過NameSpace本身有自動產生的label,可以用來設定選擇
  • 同理我們也可以手動自己給NameSpace增設label來使用!
  • 上面圖上就簡單使用預設會自動產生的label來設定!
  • 另外要特別注意兩個設定區塊:
  • 1.podSelector區塊
  • 2.namespaceSelector區塊
  • 以下圖來說,這部分還算好理解:
對應的egress或ingress規則上,podSelector與namespaceSelector兩個都符合才成立
  • 但是考量到有一種疏忽的狀況,將會造成整個規則改變如下:
此時不管事podSelector部分符合,或只有namespaceSelector部分符合,即成立
  • 如上圖狀況來說
  • 第二個label條件為NameSpace名為database的Pods全都符合
  • 亦即該條件過於簡單
  • 如上例子的問題,所以在設定時,要格外注意syntax(語法)

同時設定進/出的規則:

  • 另外ingressegress規則是可以同時設定的,參考下面:
  • 實際條件設定在其下方:
  • 其中上半部達成的條件示意圖如下:
  • 再加上下半部egress條件得到如下示意圖:

如何設置廣域的規則(Deny/Allow All Traffic):

  • 比如今天資安決定所有Pod不能有任何外部請求進去,則可以這樣設:
podSelector為空,表示全部Pods都要遵守這個規則
  • 另外也有反過來,允許全部的Traffic,則要改為如下設定:
全部不擋!
  • 上述設定方式也可同理方式套用在egress設定

小總結:

  • 經過上面各種NetworkPolicy設定
  • 就可以知道如何根據需求定義適當的規則
  • 例如我只想針對特定NameSpace裡面的Pods禁止隨意地連線
  • 就可以照上面範例進行設定

下一篇就快速Demo如上的NetworkPolicy設定

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet