Kubernetes API server 認證 & 用戶RBAC授權詳解

API Server作為Kubernetes網(wǎng)關千扔,是用戶訪問和管理資源對象的入口阔拳。每一次的訪問請求都需要對訪問者進行合法性的檢驗纱烘,包括身份驗證、資源操作權限驗證驗證等哗脖,通過一系列驗證通過之后才能返回訪問結果盾饮。

用戶可以通過kubectl命令, SDK,或者發(fā)送REST請求來訪問API 懒熙。User和Service Account是兩種不同用于訪問API的方式丘损。

User:

1,Kubernetes不直接管理用戶信息

2工扎,有外部獨立服務(LDAP徘钥,AD)進行管理的用戶,用戶不能通過集群內(nèi)部的 API 來進行管理

3肢娘, 用戶訪問API通過證書的方式進行認證

4呈础, k8s管理員和運維人員通過用戶的形式access kebernetes

ServiceAccount

1,服務賬號是通過Kubernetes API 來管理

2橱健,服務賬號適用于集群內(nèi)部運行的應用程序(pod)而钞,需要通過 API 來完成的操作

3,服務賬戶通過bearer token認證方式訪問API

RBAC授權

RBAC可以對user拘荡,group和serviceaccount進行API訪問權限控制臼节。Role和ClusterRole定義了權限集合,RoleBinding和ClusterRoleBinding用于將Role和ClusterRole上的許可權限綁定到一個珊皿,一組用戶或者一個服務賬號上网缝。

Role- 只能用于授予對某一單一命名空間中資源的訪問權限(rule是通過設定不同API group里的資源讀,寫蟋定,訂閱的權限)

ClusterRole- 可以授予與Role對象相同的權限粉臊,但由于它們屬于集群范圍對象, 也可以使用它們授予對以下幾種資源的訪問權限:

集群范圍資源(例如節(jié)點驶兜,即node)

非資源類型endpoint(例如”/healthz”)

跨所有命名空間的命名空間范圍資源(例如pod扼仲,需要運行命令kubectl get pods --all-namespaces來查詢集群中所有的pod)

RoleBinding- 可以引用在同一命名空間內(nèi)定義的Role對象远寸,在RoleBinding所在的命名空間內(nèi)授予用戶,組屠凶,服務賬戶對所引用的Role中 定義的命名空間資源的訪問權限

ClusterRoleBinding- 在集群級別和所有命名空間中授予用戶驰后,組,服務賬戶所綁定的ClusterRole資源權限阅畴。

實例1:添加一個新用戶并授予只讀權限

添加一個含有只讀權限的用戶通過kubectl訪問API server,首先需要創(chuàng)建一個X509的證書作為訪問API server的認證憑證迅耘,設置這個用戶的credentials和context贱枣,綁定此用戶到只讀權限的ClusterRole。利用這個用戶的context調(diào)用kubectl去操作k8s集群颤专。

1纽哥,利用cfssl這個工具生成證書,具體詳情搜索相關tool適用方法栖秕,這里只列出我個人生成的cert的命令和兩個配置文件sunfuqi.json春塌,ca-config.json

sunfuqi.json
ca-config.json

執(zhí)行命令,這里用到了kubernetes集群的CA證書來生成新用戶sunfuqi的客戶端證書簇捍。

/usr/local/bin/cfssl gencert --ca /etc/kubernetes/pki/ca.crt --ca-key /etc/kubernetes/pki/ca.key --config ca-config.json --profile=kubernetes sunfuqi.json | /usr/local/bin/cfssljson --bare readonly

命令執(zhí)行后會在所在目錄生成三個文件

result

利用文件2,3為kubectl添加crendential

kubectl config set-credentials sunfuqi --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --client-key=/root/users/sunfuqi/sunfuqi-key.pem --client-certificate=/root/users/sunfuqi/sunfuqi.pem

這條命令會在kubectl的配置文件里面添加一個sunfuqi的用戶只壳,并寫入證書的內(nèi)容


為這個用戶sunfuqi創(chuàng)建context,名字叫sunfuqi-context?

kubectl config set-context sunfuqi-context --user=sunfuqi --cluster=kubernetes

創(chuàng)建好后暑塑,通過kubectl命令查看吼句,新用戶的context,你也可以通過查看文件的形式去檢查配置文件($HOME/.kube/config)

kubectl config view

cat /root/.kube/config


kubernetes系統(tǒng)自帶一個readonly的cluster role名字叫做view事格,這里我就不再創(chuàng)建新的role惕艳,直接引用View ClusterRole和user sunfuqi綁定起來, 創(chuàng)建一個ClusterRoleBinding的配置文件, 并執(zhí)行

cluster-role-binding.yaml

用戶和ClusterRole綁定后驹愚,我們就可以使用這個用戶去訪問API server來操作集群了远搪。

切換到sunfuqi-contxt這個上下文環(huán)境, 對集群做操作

result

可以看到通過sunfuqi這個用戶是可以list說有pod的,但是不能刪除逢捺,正好符合我們的預期谁鳍。創(chuàng)建一個新用戶并賦予只讀權限的例子就完成了。


實例2:創(chuàng)建一個service account實例

添加一個service account的用戶劫瞳,并授權這個用戶對services棠耕,pod,PV柠新, ingress等resource有增刪改查的權限窍荧, 創(chuàng)建一個deployment,pod利用這個service account去監(jiān)控service恨憎,如果有有新的service生成蕊退,把這個service加入到ingress的rules里面去郊楣,客戶可以通過ingress controller + 服務名 訪問服務。

創(chuàng)建一個Service Account瓤荔,取名resource-operator

SA

創(chuàng)建好后净蚤,我們查看一下他的信息

detail

可以看到有個Mountable secrets和Tokens的key,后面是引用的secret名字输硝, 這個secret是生成service account的時候自動生成的今瀑, 當一個create一個pod時指定resource-operator這個service account, k8s就會把這個secret mount到pod上的文件系統(tǒng)点把,pod里面的程序可以通過這個secret作為token訪問API server橘荠。 具體查看一下這個secret內(nèi)容

secret

創(chuàng)建新的ClusterRole和ClusterRoleBinding

ClustorRole

目前為止Service Account創(chuàng)建成功并和相應的Role綁定起來了。下面就是自己寫個程序放到容器里去驗證這個service account是否能正常訪問API server去操作集群郎逃。


我這個例子是用python寫的哥童,安裝了kubernetes的python 包,用來監(jiān)控集群的服務褒翰, 如果有新增的服務就會修改ingress配置贮懈, 為這個service配置一個rules。要實現(xiàn)這個目的优训, 我的集群上裝了一個ingress-controller(基于nginx)朵你,并配置了相應的ingress。

程序寫好打成docker image揣非, 具體程序內(nèi)容和打包過程撬呢,不再這里講述。

編寫deployment文件妆兑,并部署

部署

這里設置了容器的serviceAccount 指向上面創(chuàng)建的服務賬戶魂拦,pod部署在指定的node上。

部署完成后查單pod的內(nèi)容搁嗓,正如前面所說這里我們可以看到service account的token被mount到pod指定目錄

pod

去pod上查看一下指定目錄芯勘,發(fā)現(xiàn)里面有3個文件和上面secret的內(nèi)容一樣,pod里面的程序可以通過這個token去訪問API server腺逛。繼續(xù)查看pod的環(huán)境變量荷愕, 可以看到一些集群的信息以變量的形式提供給pod使用。

pod env

刪除一個service來驗證service account能夠準確操作集群棍矛。

ingress

刪除service httpd-svc前安疗, 有兩條paths在rule里面, 刪除httpd-svc 相應的path也被刪掉够委。至此以后不能通過/httpd-svc訪問服務荐类。這里也驗證了service account可以通過pod準確操作集群。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茁帽,一起剝皮案震驚了整個濱河市玉罐,隨后出現(xiàn)的幾起案子屈嗤,更是在濱河造成了極大的恐慌,老刑警劉巖吊输,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶号,死亡現(xiàn)場離奇詭異,居然都是意外死亡季蚂,警方通過查閱死者的電腦和手機茫船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扭屁,“玉大人算谈,你說我怎么就攤上這事》杞粒” “怎么了濒生?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵埋泵,是天一觀的道長幔欧。 經(jīng)常有香客問我,道長丽声,這世上最難降的妖魔是什么礁蔗? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雁社,結果婚禮上浴井,老公的妹妹穿的比我還像新娘。我一直安慰自己霉撵,他們只是感情好磺浙,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徒坡,像睡著了一般撕氧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喇完,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天伦泥,我揣著相機與錄音,去河邊找鬼锦溪。 笑死不脯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的刻诊。 我是一名探鬼主播防楷,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼则涯!你這毒婦竟也來了域帐?” 一聲冷哼從身側響起赘被,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肖揣,沒想到半個月后民假,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡龙优,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年羊异,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彤断。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡野舶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宰衙,到底是詐尸還是另有隱情平道,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布供炼,位于F島的核電站一屋,受9級特大地震影響,放射性物質發(fā)生泄漏袋哼。R本人自食惡果不足惜冀墨,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涛贯。 院中可真熱鬧诽嘉,春花似錦、人聲如沸弟翘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稀余。三九已至悦冀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滚躯,已是汗流浹背雏门。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掸掏,地道東北人茁影。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像丧凤,于是被迫代替她去往敵國和親募闲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容