主頁 > 作業系統 > 033.Kubernetes集群安全-API Server認證及授權

033.Kubernetes集群安全-API Server認證及授權

2020-09-25 07:26:23 作業系統

一 Kubernetes集群安全

1.1 安全機制

Kubernetes通過一系列機制來實作集群的安全控制,其中包括API Server的認證授權、準入控制機制及保護敏感資訊的Secret機制等,集群的安全性主要有如下目標:
  1. 保證容器與其所在宿主機的隔離,
  2. 限制容器給基礎設施或其他容器帶來的干擾,
  3. 最小權限原則—合理限制所有組件的權限, 確保組件只執行它被授權的行為, 通過限制單個組件的能力來限制它的權限范圍,
  4. 明確組件間邊界的劃分,
  5. 劃分普通用戶和管理員的角色,
  6. 在必要時允許將管理員權限賦給普通用戶,
  7. 允許擁有Secret資料(Keys、 Certs、 Passwords) 的應用在集群中運行,

二 API Server認證管理

2.1 認證安全

Kubernetes集群中所有資源的訪問和變更都是通過Kubernetes API Server的RESTAPI來實作的,因此集群安全的關鍵點就在于如何識別并認證客戶端身份(Authentication),以及隨后訪問權限的授權(Authorization)環節, Kubernetes集群提供了3種級別的客戶端身份認證方式,
  1. HTTPS證書認證:此方式最嚴格,基于CA根證書簽名的雙向數字證書認證方式,
  2. HTTP Token認證:通過一個Token來識別合法用戶,
  3. HTTP Base認證:通過用戶名+密碼的方式認證,

2.2 HTTPS認證原理

此方式需要有一個CA證書,CA是PKI系統中通信雙方都信任的物體,被稱為可信第三方(TrustedThirdParty,TTP),CA作為可信第三方的重要條件之一就是CA的行為具有非否認性,作為第三方而不是簡單的上級,就必須能讓信任者有追究自己責任的能力, CA通過證書證實他人的公鑰資訊,證書上有CA的簽名,用戶如果因為信任證書而有了損失,則證書可以作為有效的證據用于追究CA的法律責任,正是因為CA承擔責任的承諾,所以CA也被稱為可信第三方, 在很多情況下,CA與用戶是相互獨立的物體,CA作為服務提供方,有可能因為服務質量問題(例如,發布的公鑰資料有錯誤)而給用戶帶來損失,在證書中系結了公鑰資料和相應私鑰擁有者的身份資訊,并帶有CA的數字簽名;在證書中也包含了CA的名稱,以便于依賴方找到CA的公鑰,驗證證書上的數字簽名, CA認證涉及諸多概念,比如根證書、自簽名證書、密鑰、私鑰、加密演算法及HTTPS等, 如下大致為SSL協議的流程,在Kubernetes CA中認證大概包含下面幾個步驟: clipboard
  1. HTTPS通信雙方的服務器端向CA機構申請證書,CA機構是可信的第三方機構,它可以是一個公認的權威企業,也可以是企業自身,企業內部系統一般都用企業自身的認證系統,CA機構下發根證書、服務端證書及私鑰給申請者,
  2. HTTPS通信雙方的客戶端向CA機構申請證書,CA機構下發根證書、客戶端證書及私鑰給申請者,
  3. 客戶端向服務器端發起請求,服務端下發服務端證書給客戶端,客戶端接收到證書后,通過私鑰解密證書,并利用服務器端證書中的公鑰認證證書資訊比較證書里的訊息,例如,比較域名和公鑰與服務器剛剛發送的相關訊息是否一致,如果一致,則客戶端認可這個服務器的合法身份,
  4. 客戶端發送客戶端證書給服務器端,服務端在接收到證書后,通過私鑰解密證書,獲得客戶端證書公鑰,并用該公鑰認證證書資訊,確認客戶端是否合法,
  5. 客戶端通過隨機密鑰加密資訊,并發送加密后的資訊給服務端,在服務器端和客戶端協商好加密方案后,客戶端會產生一個隨機的密鑰,客戶端通過協商好的加密方案加密該隨機密鑰,并發送該隨機密鑰到服務器端,服務器端接收這個密鑰后,雙方通信的所有內容都通過該隨機密鑰加密,

上述是雙向認證SSL協議的具體通信程序,這種情況要求服務器和用戶雙方都有證書,單向認證SSL協議則不需要客戶端擁有CA證書,對于上面的步驟,只需將服務器端驗證客戶證書的程序去掉,之后協商對稱密碼方案和對稱通話密鑰時,服務器發送給客戶的密碼沒被加密即可,

2.3 HTTP Token認證原理

HTTP Token的認證是用一個很長的特殊編碼方式的并且難以被模仿的字串—Token來表明客戶身份的一種方式,在通常情況下,Token是一個很復雜的字串,比如我們用私鑰簽名一個字串后的資料就可以被當作一個Token,此外,每個Token對應一個用戶名,存盤在API Server能訪問的一個檔案中,當客戶端發起API呼叫請求時,需要在HTTP Header里放入Token,這樣一來,API Server就能識別合法用戶和非法用戶了,

2.4 HTTP Base認證原理

通常,HTTP是無狀態的,瀏覽器和Web服務器之間可以通過Cookie來進行身份識別,桌面應用程式(比如新浪桌面客戶端、SkyDrive客戶端、命令列程式)一般不會使用Cookie,若需要與Web服務器之間通信并且進行認證,則需要使用HTTP Base認證,這種認證方式是把“用戶名+冒號+密碼”用BASE64演算法進行編碼后的字串放在HTTP Request中的Header Authorization域里發送給服務端,服務端在收到后進行解碼,獲取用戶名及密碼,然后進行用戶身份鑒權,

三 API Server授權管理

3.1 授權管理概述

當客戶端發起API Server呼叫時,API Server內部要先進行用戶認證,然后執行用戶授權流程,即通過授權策略來決定一個API呼叫是否合法,對合法用戶進行授權并且隨后在用戶訪問時進行鑒權,是權限與安全系統的重要一環, 授權就是授予不同的用戶不同的訪問權限, API Server目前支持以下幾種授權策略(通過API Server的啟動引數“--authorization-mode”設定):
  1. AlwaysDeny:表示拒絕所有請求,一般用于測驗,
  2. AlwaysAllow:允許接收所有請求,如果集群不需要授權流程,則可以采用該策略,這也是Kubernetes的默認配置,
  3. ABAC(Attribute-BasedAccessControl):基于屬性的訪問控制,表示使用用戶配置的授權規則對用戶請求進行匹配和控制,
  4. Webhook:通過呼叫外部REST服務對用戶進行授權,
  5. RBAC:Role-BasedAccessControl,基于角色的訪問控制,
  6. Node:是一種專用模式,用于對kubelet發出的請求進行訪問控制,
API Server在接收到請求后,會讀取該請求中的資料,生成一個訪問策略物件,如果在該請求中不帶某些屬性(如Namespace),則這些屬性的值將根據屬性型別的不同,設定不同的默認值(例如,為字串型別的屬性設定一個空字串;為布爾型別的屬性設定false;為數值型別的屬性設定0),然后將這個訪問策略物件和授權策略檔案中的所有訪問策略物件逐條匹配,如果至少有一個策略物件被匹配,則該請求被鑒權通過,否則終止API呼叫流程,并回傳客戶端的錯誤呼叫碼,

四 ABAC授權模式

4.1 ABAC授權策略

在API Server啟用ABAC模式時,需要指定授權策略檔案的路徑和名稱(--authorization-policy-file=SOME_FILENAME),授權策略檔案里的每一行都以一個Map型別的JSON物件進行設定,這被稱為“訪問策略物件”,通過設定訪問策略物件中的apiVersion、kind、spec屬性來確定具體的授權策略, 其中,apiVersion當前版本為abac.authorization.kubernetes.io/v1beta1;kind被設定為Policy;spec指詳細的策略設定,包括主題屬性、資源屬性、非資源屬性這三個欄位,
  • 主體屬性
    • user(用戶名):字串型別,該字串型別的用戶名來源于Token檔案(--token-auth-file引數設定的檔案)或基本認證檔案中用戶名稱段的值,
    • group(用戶組):在被設定為“system:authenticated”時表示匹配所有已認證的請求,在被設定為“system:unauthenticated”時表示匹配所有未認證的請求,
  • 資源屬性
    • API Group(API組):字串型別,表明匹配哪些API Group,例如extensions或*(表示匹配所有API Group),
    • namespace(命名空間):字串型別,表明該策略允許訪問某個Namespace的資源,例如kube-system或*(表示匹配所有Namespace),
    • resource(資源):字串型別,API資源物件,例如pods或*(表示匹配所有資源物件),
  • 非資源屬性
    • nonResourcePath(非資源物件類路徑):非資源物件類的URL路徑,例如/version或/apis,*表示匹配所有非資源物件類的請求路徑,也可以設定為子路徑,/foo/*表示匹配所有/foo路徑下的所有子路徑,
    • readonly(只讀標識):布爾型別,當它的值為true時,表明僅允許GET請求通過,

4.2 ABAC授權演算法

API Server進行ABAC授權的演算法為:在API Server收到請求之后,首先識別出請求攜帶的策略物件的屬性,然后根據在策略檔案中定義的策略對這些屬性進行逐條匹配,以判定是否允許授權,如果有至少一條匹配成功,那么這個請求就通過了授權(不過還是可能在后續其他授權校驗中失敗), 常見的策略配置如下:
  • 要允許所有認證用戶做某件事,可以寫一個策略,將group屬性設定為system:authenticated,
  • 要允許所有未認證用戶做某件事,可以把策略的group屬性設定為system:unauthenticated,
  • 要允許一個用戶做任何事,將策略的API Group、namespace、resource和nonResourcePath屬性設定為“*”即可,

4.3 使用kubectl授權機制

kubectl使用API Server的/api和/apis端點來獲取版本資訊,要驗證kubectlcreate/update命令發送給服務器的物件,kubectl需要向OpenAPI進行查詢,對應的URL路徑為/openapi/v2, 當使用ABAC授權模式時,下列特殊資源必須顯式地通過nonResourcePath屬性進行設定:
  • API版本協商程序中的/api、/api/*、/apis、和/apis/*,
  • 使用kubectlversion命令從服務器獲取版本時的/version,
  • create/update操作程序中的/swaggerapi/*,
在使用kubectl操作時,如果需要查看發送到API Server的HTTP請求,則可以將日志級別設定為8,

4.4 常見ABAC示例

更多ABAC參考:《附007.Kubernetes ABAC授權》,

五 RBAC授權模式

見《附006.Kubernetes RBAC授權》

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/123983.html

標籤:Linux

上一篇:Maven+Nexus環境實作Java打包環境部署

下一篇:集群應用系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more