ref: https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions
本篇文章是一個基礎分享文,整個主軸圍繞於 Authentication 與 Authorization 兩大塊,同時透過這兩大概念的介紹來分享一些會可能會有資安問題的設定
開頭作者探討了 Kubernetes 的架構,並且將 API Server 這個重點核心拿來出探討,提到為了存取 Kubernetes API,使用者必須要經過三個階段的處理,分別是
Authentication, Authorization 以及 Admission Control
接者用一個簡單的流程來說明上述三者的差異,假設今天有一個 Client 想要請求 API Server 幫忙創建一個 Pod 的物件。
首先 API Server 會針對該請求進行 Authentication 的檢查,通常情況下會使用 Certificate, Tokens, Basic Authentication(username/password) 來判別。
如果通過後,則會進入到 Authorization 的階段,該階段要判別發送當前 Request 的 Client 是否擁有創建 Pod 的權限,如果有權限就會把相關操作交給後續的 Admission Control 來處理。
文章中舉了一個名為 AlwaysPullImages 的 Admission Controller,該 Controller 對於一個多用戶的 Kubernetes Cluster 來說特別有用,主要是用來確保使用者 A 想要使用的 Private Image 不能被使用者 B 存取。
試想一個情況,假設今天使用者 A 順利於 NodeA 上抓取了自己的 Private Image,那使用者 B 假如很剛好知道這個 Image 的名稱,是不是有機會就可以不需要相關權限直接使用 NodeA 上的 Image?
所以這個 Admission Controller 就是用來避免這個問題的。
接者作者從 Authentication 與 Authorization 中個挑選一個方式來介紹並且講解這兩者如何結合的。
Authentication 使用的是 Service Account Token,管理會事先於 Kubernetes 內創立一個相關的 Service Account,並且把該 SA(Service Account) 的 Token 給交給 Client(Kubeconfig 也可)
Client 發送 HTTPS 請求到 API Server 的時候就可以夾帶這個 Token 的資訊,這樣 API Server 就會去檢查該 Token 是否存在於 Cluster 內。
事實上當每個 Pod 被創立後, Kubernetes 預設情況下就會將該 namespace 下的 service account 資訊給掛載到該 Pod 內的 "/var/run/secrets/kubernetes.io/serviceaccount" 這個路徑
這樣該 Pod 就可以使用該 Service Account Token 的資訊與 API Server 溝通。
Authorization 則是使用 RBAC 的方式來處理, RBAC 由三個部分組成,分別是 Role(代表可以針對 Cluster 進行什麼樣類型的操作,譬如 create pod, delete pod), Subject(你是誰,譬如 Service Account), RoleBinding(用來將 Role 與 Subject 給綁定)
管理員要創建並且管理這些叢集的話,就要好好的去設計這三個物件的關係,來確保最後的 Client 可以擁有剛剛好符合其需求的權限,千萬不要為了懶散而給予過多權限。
接者作者列舉了五種 Risky permissions 的可能情境
1. Listing secrets
大部分的應用程式開發者都會使用 secret 的物件來管理一些機密資訊,如帳號密碼,憑證等,所以一個擁有 list secrets 的 service account 其實是相對危險的。
非必要的話,不要讓管理員以外的任何使用者有這個權限,特別是使用 ClusterRole/ClusterRoleBinding 時要特別注意
2. Creating a pod with a privileged service account
假設今天有一個攻擊者已經獲得一個可以創建 pod 的 service account,那該攻擊者已經可以很順利的於叢集內創建 Pod 去進行基本操作(譬如挖礦)
如果攻擊者很巧地又知道目標 namespace 內存在一個很強的 service account,它就有辦法讓他創立的 Pod 去使用這個很強的 Service Account 並且進行更多後續操作
3. Impersonating privileged accounts
作者提到 Impersonating 這個 Role 裡面的動作要特別小心使用,擁有這個權限的使用者可以輕鬆化身為其他的使用者/群組
舉例來說,一個擁有 Impersonating -> users/group 的 serviceaccount 是沒有辦法看到任何 secrets 的物件。
但是攻擊者只要使用的時候加上 --as=null --as-group=system:master 則就會變成如 master 般的上帝擁有這些權限
因此這種權限設定上要特別小心
4. Reading a secret – brute-forcing token IDs
5. Creating privileged RoleBindings
後續兩個有興趣的可以參考全文,都是滿有趣的一些想法,值得閱讀擴展自己的認知
「rbac設計」的推薦目錄:
- 關於rbac設計 在 矽谷牛的耕田筆記 Facebook 的精選貼文
- 關於rbac設計 在 矽谷牛的耕田筆記 Facebook 的精選貼文
- 關於rbac設計 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
- 關於rbac設計 在 基于RBAC 权限模型的架构设计 - mrsingsing 的評價
- 關於rbac設計 在 Open Policy Agent 基礎介紹(RBAC + IAM Role 設計) - YouTube 的評價
- 關於rbac設計 在 基于rbac设计的权限管理系统 - GitHub 的評價
- 關於rbac設計 在 Open Policy Agent 基礎介紹(RBAC + IAM Role 設計) - YouTube 的評價
rbac設計 在 矽谷牛的耕田筆記 Facebook 的精選貼文
如果你跟我一樣,是 kubectl 愛好者,對於其他操作介面譬如 k9s 等都不習慣的人,那我認為一定要來瞭解一下 kubectl plugin 的用法
1. kubectl plugin 本身的設計使得大家非常容易的擴充,並不需要修改 kubectl 的任何原始碼或是重新編譯。相反的只需要準備相關的執行檔案,並且依據特定規則命名即可
2. krew 是一套管理 kubectl plugin 的套件,能夠幫你整理目前官方收集的 plugin 並且提供指令讓你去安裝與刪除
3. 本文列出了幾個作者認為好用的指令,譬如 whoami,可以讓你知道你當前透過 KUBECONFIG 連接到遠方 cluster 時是以什麼樣的身份被認證
4. access-matrix 幫你列出目前系統中 RBAC 的相關權限,用一個比較易閱讀的方式呈現
5. neat 是一個清除工具,可以幫忙將 kubectl get pods xxx -o yaml 中那些由 controller 所添加的資源給移除,讓你得到一個乾淨的輸出
6. node-shell 是個非常好用的工具,可以幫你掛載一個 shell 到任意的 k8s node 之中,讓你透過該 shell 來操作該節點
除了這些之外,我認為 ksniff 也是個滿有趣的工具,可以幫忙運行 tcpdump 來錄製封包
如果有興趣的可以直接到 krew 的官方文件去看看目前收錄的 plugin 有哪些,然後可以都玩看看來找到一些對自己工作有幫助的指令
https://www.padok.fr/en/blog/kubectl-plugins
資訊推播頻道 Telegram: https://t.me/technologynote
演講投影片 SlideShare: https://www.slideshare.net/hongweiqiu/presentations
粉絲頁內容索引網站:
https://technologynoteniu.github.io/awesome-notes/
rbac設計 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
這邊跟大家分享一篇關於 Kubernetes 多租戶的相關文章,該文章中探討到底多租戶的定義,以及實現上的難易程度
1. 多租戶可分成軟性與硬性兩種隔離, Kubernetes namespace 可以視為軟性隔離,而硬性隔離則是希望能夠更強力的隔離所有資源,文章中提到了 vClusters 的概念,連結放在最後
2. 作者認為多租戶的 Kubernetes Cluster 實際上也會帶來一些限制,讓某些功能變得不方便使用。
a. 基於 namespace 的租戶隔離方式就只能大家都同樣一個 k8s 版本,同時有一些支援 RBAC 設定的 Helm Chart 可能就不方便使用。
3. 作者這邊反思提出一個問題,為什麼真的需要多租戶的 Kubernetes 叢集,不能夠用多個單一租戶的 Kubernetes 叢集來取代?
a. 真的有這樣的實例,但是其實成本過高且沒效率。
b. 如果公司內每個開發人員都需要一個自已的 k8s來操作測試,規模一大的話你每個月的成本非常可觀,因此如果可以有一個多租戶的 k8s,就可以解決這些問題
4. 多租戶實作上的挑戰,作者這邊列出幾個問題,包含使用者管理,資源分配以及如何隔離
a.基本上每個組織本身都已經有管理使用者的解決方案,譬如 AD/LDAP 等,如果要將這些使用者的認證授權與 kubernetes 整合,推薦使用 dex 這個支持 OpneID/OAtuth2 的解決方案,幫你將 Kubernetes 與外部資料系統整合
b. 底層資源的共享,避免單一租戶過度使用導致其他租戶不能使用。資源包含了運算資源,網路頻寬等。作者列出透過 Resource Quotas 等可以幫忙限制運算資源,但是並沒有說出網路頻寬這部份該怎麼處理。這部份我認為需要導入更多的network qos解決方案來限制,應該會需要cni以及外部交換機路由器等來幫忙
c. 最後則是互動上的隔離,要如何確保這些多租戶不會互相影響彼此,甚至攻擊彼此。這部份可能要從 NetworkPolicy 來處理網路流量,同時透過 vCluster的方式來提供相對於 namespace層級更強烈的隔離,確保彼此不會互相影響。
5. 最後,作者列出了一些關於多租戶的可能解決方案,包含了 kiosk, loft等
結論來說就是,今天你如果有多租戶的需求,請先問自己,你需要什麼等級的多租戶管理,再來則是三個重點問題要先想清楚,你要怎麼處理
1) 如何管理使用者/租戶
2) 系統資源要如何分配與限制
3) 如何真正有效的隔離這些租戶
如果有這方面的需求,可以先看看別的開源軟體怎麼實作,再來思考是否滿足需求,如果要自己實現,有哪些好的設計值得參考!
歡迎留言討論讓大家知道更多關於多租戶的玩法與經驗
https://medium.com/faun/kubernetes-multi-tenancy-a-best-practices-guide-88e37ef2b709
https://loft.sh/blog/introduction-into-virtual-clusters-in-kubernetes/
rbac設計 在 基于rbac设计的权限管理系统 - GitHub 的推薦與評價
基于rbac设计的权限管理系统. Contribute to kingrocy/rbac development by creating an account on GitHub. ... <看更多>
rbac設計 在 基于RBAC 权限模型的架构设计 - mrsingsing 的推薦與評價
在权限设计领域,最常见的权限模型有以下四种:. ACL(Access Control List):访问控制列表 用户-> 权限; RBAC(Role-Based Access Control):基于角色 ... ... <看更多>
相關內容