Kubernetes CKA課程筆記 78

Secure Cluster — 實際設定Cluster的Network Policies

ZONGRU Li
Dec 9, 2021

要模擬Network Policies設定,首先要有可以示範的Pods

所以首先要先建立3個Deployments元件,分別定義以下Pods的建立:

前端,後端,DB

並且分別都建立各兩個replicas,並且都在myapp這個NameSpace內所以是:

之後會建立適合的Network Policies來做出Pods間溝通的限制

1.建立三個Deployments:

  • 第一步先把剛剛說的NameSpace先建出來
  • 我也忘了之前有沒建過myapp這個名稱的,先確認:
  • 接著建立前端Deploymentyaml檔:
簡單用個node來當前端,並且特地開個PORT:3000,等等實驗用!
  • 接著就是後端:
  • 最後就是DB:
redis預設PORT=6379
  • 以上就建立好三個(前端,後端,DB)的Deployment設定檔
  • 接著就是直接apply建立:

2.確認當前上述Pods之間的溝通(Default Network Policies=All Allowed):

  • 為了確認,我們需要知道每個Pod的IP位置,所以先拿到:
拿到每個Pods的IP位置!
  • 為了接下來操作方便
  • 先切換預設的kubectl指令作用在myapp這個NameSpace
kubectl config set-context --current --namespace myapp
切換指令預設執行的NameSpace
  • 所以現在執行kubectl指令都會看到myapp這個NameSpace內容:
  • 接著我們該如何確認Pods之間的溝通呢?
  • 要透過類似telnet來完成確認到PORT
  • 這邊用到的工具則是netcat(nc),執行:
kubectl exec {發動的Pod名稱} -- sh -c "{執行指令,這邊會是nc -v IP PORT}"
  • 其中-v是指更多輸出訊息
確認其中一個backend Pod可以打到其中一個DB的6379 PORT
  • 其他Pods間的溝通確認:
前端打DB也通!
前端打到後端(記得後端開的是80 PORT喔!)
甚至DB打到後端也通!

3.規劃並建立Network Policies的Configuration YAML檔:

  • 這邊初步規劃兩個Network Policies,如下紅框部分:
在前端與DB上分別建立Network Policies
  • 首先來寫寫前端的Network Policy:
大致寫法如左邊所示,參考右邊當初backend宣告的Deployment元件來設定
  • 同理接著寫DBNetworkPolicy:
撰寫內容如左邊所示,參考到中間右邊DB與後端當初的Deployment設定
  • 另外針對上面DBNetworkPolicy特別注意到:
我同時宣告了Ingress與Egress,但是Egress沒有詳細設定"to"的部分
  • 上面宣告了Egress,但是沒有實際給定"to"設定,就意味著發起"出去全擋"

另外這邊還有特別重要的概念:

  • Egress是限制Pod”發起”出去的(outgoing traffic)的請求
  • 所以當後端發動請求到DB,此時DB端接到後還能夠給出去Response
  • (因為是後端”發起”,但是後端沒有限制其”發起”的Egress條件)

4.執行apply Policies:

  • 並執行以下指令來確認現在有哪些NetworkPolicies,執行:
kubectl get networkpolicy
  • 接著就是再次用netcat(nc)指令再次確認目前是否有被檔:
  • 首先理論上應該要通的後端到DB:
後端到DB:有通!
前端到後端:也有通!
  • 在來試試應該不會通的部分:
DB打到後端:不通!
前端打DB:不通!
  • 所以當今天駭客駭入一個前端Pod後,因為有設置NetworkPolicies
NetworkPolicy
  • 他將不能透過這個前端Pod再隨意入侵到其他Pods
  • 止步於NetworkPolicy有開放的,才能連過去
透過NetworkPolicy設定,阻擋駭客

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet