第15章 Kubernetes 安全認證

一. Kubernetes的安全框架

? 訪問K8S集群的資源(API訪問)需要過三關:認證、鑒權彰触、準入控制
? 普通用戶若要安全訪問集群API Server,往往需要證書、Token
或者用戶名+密碼;Pod訪問荞雏,需要ServiceAccount
? K8S安全控制框架主要由下面3個階段進行控制,每一個階段都
支持插件方式,通過API Server配置來啟用插件凤优。

  1. Authentication
  2. Authorization
  3. Admission Control


    image.png

二. 傳輸安全過三關

傳輸安全過三關:認證悦陋,授權,準入控制
傳輸安全: 告別8080筑辨,迎接6443

1. 認證

三種客戶端身份認證:
? HTTPS 證書認證: 基于CA證書簽名的數(shù)字證書認證
? HTTP Token認證: 通過一個Token來識別用戶
? HTTP Base認證: 用戶名+密碼的方式認證

2. 授權

RBAC(Role-Based Access Control俺驶,基于角色的訪問控制):負責完成授權(Authorization)工作。


image.png

3. 準入控制

Adminssion Control實際上是一個準入控制器插件列表棍辕,發(fā)送到API Server的請求都需要經過這個列表中的每個準入控制器 插件的檢查暮现,檢查不通過,則拒絕請求楚昭。
1.11版本以上推薦使用的插件:

--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds, ResourceQuota

三. RBAC核心概念

RBAC(Role-Based Access Control栖袋,基于角色的訪問控制),允許通過Kubernetes API動態(tài)配置策略抚太。


image.png

1. 角色(Role)

角色(Role):
(1). Role:授權特定命名空間的訪問權限
(2). ClusterRole:授權所有命名空間的訪問權限

2. 主體(subject)

主體(subject):
(1). User:用戶
(2). Group:用戶組
(3). ServiceAccount:服務賬號

3. 角色綁定(RoleBinding)

角色綁定(RoleBinding):
(1). RoleBinding:將角色綁定到主體(即subject)
(2). ClusterRoleBinding:將集群角色綁定到主體

四. RBAC授權普通用戶

RBAC授權普通用戶對命名空間訪問權限控制
需求:liuzhousheng用戶訪問進來塘幅,對ctnrs命名空間只有讀取pod的權限:

1. 創(chuàng)建ctnrs命名空間

# kubectl create ns ctnrs
# kubectl run nginx --image=nginx --replicas=3 -n ctnrs

2. 創(chuàng)建角色

創(chuàng)建只有讀取pod權限的角色pod-reader-role

# cat rbac-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ctnrs
  name: pod-reader-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

# kubectl create -f rbac-role.yaml
# kubectl get role -n ctnrs
NAME              AGE
pod-reader-role   53s

3. 用戶主體角色綁定

創(chuàng)建rolebinding,主體角色綁定尿贫,這里的subjects主體對象是user, 名為liuzhousheng, 將其綁定到pod-reader-role角色晌块。

# cat rbac-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-rolebinding
  namespace: ctnrs
subjects:
- kind: User
  name: liuzhousheng # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader-role # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io


# kubectl create -f rbac-rolebinding.yaml
# kubectl get role,rolebinding -n ctnrs
NAME                                             AGE
role.rbac.authorization.k8s.io/pod-reader-role   5m5s

NAME                                                          AGE
rolebinding.rbac.authorization.k8s.io/read-pods-rolebinding   87s

4. 創(chuàng)建認證證書

通過kube-apiserver 讀取pod 信息,得使用kube-apiserver 部署時的根證書頒發(fā)證書

# mkdir liuzhousheng && cd liuzhousheng
# cp  /usr/local/src/k8s/kube-apiserver/{ca.pem,ca-key.pem,ca-config.json} ./
# cat rbac-user.sh
#!/bin/bash
cat > liuzhousheng-csr.json <<EOF
{
  "CN": "liuzhousheng",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing"
    }
  ]
}
EOF
###簽發(fā)一個客戶端證書,注意要指定根證書
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes liuzhousheng-csr.json | cfssljson -bare liuzhousheng

#-----------------------------------
##生成配置文件帅霜,使用配置文件連接集群

#配置集群匆背,這里的ca.pem為集群ca證書
kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=https://10.40.6.175:6443 \
  --kubeconfig=liuzhousheng-kubeconfig

#客戶端證書配置
kubectl config set-credentials liuzhousheng \
  --client-key=liuzhousheng-key.pem \
  --client-certificate=liuzhousheng.pem \
  --embed-certs=true \
  --kubeconfig=liuzhousheng-kubeconfig

#配置上下文
kubectl config set-context default \
  --cluster=kubernetes \
  --user=liuzhousheng \
  --kubeconfig=liuzhousheng-kubeconfig

kubectl config use-context default --kubeconfig=liuzhousheng-kubeconfig
# bash rbac-user.sh

生成liuzhousheng-kubeconfig配置文件,使用此配置連接集群讀取資源
# kubectl --kubeconfig=liuzhousheng-kubeconfig get pod -n ctnrs
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dbddb74b8-dfj29   1/1     Running   0          74m
nginx-dbddb74b8-jqc7r   1/1     Running   0          74m
nginx-dbddb74b8-zlkvj   1/1     Running   0          74m

沒權限讀取service
# kubectl --kubeconfig=liuzhousheng-kubeconfig get svc -n ctnrs
Error from server (Forbidden): services is forbidden: User "liuzhousheng" cannot list resource "services" in API group "" in the namespace "ctnrs"

五. RBAC授權ServiceAccount

RBAC授權ServiceAccount訪問命名空間權限身冀,之前有部署過kubernetes UI钝尸,訪問地址:https://NodeIP:30899,使用token登錄搂根,獲取之前對token 值珍促。

# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kubernetes-dashboard   NodePort    10.0.0.198   <none>        443:30899/TCP            25d

# kubectl get secret -n kube-system
NAME                               TYPE                                  DATA   AGE
dashboard-admin-token-tbszw        kubernetes.io/service-account-token   3      25d

# kubectl describe secret dashboard-admin-token-tbszw -n kube-system

1. 創(chuàng)建ServiceAccount

創(chuàng)建 pod-reader-sa ServiceAccount。

# cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader-sa
  namespace: ctnrs

# kubectl create -f sa.yaml
# kubectl get sa -n ctnrs
NAME            SECRETS   AGE
pod-reader-sa   1         40s

2. 創(chuàng)建角色

創(chuàng)建只有讀取ctnrs命名空間pod權限的角色 pod-reader-role剩愧。

# cat rbac-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ctnrs
  name: pod-reader-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

# kubectl create -f rbac-role.yaml
# kubectl get role -n ctnrs
NAME              AGE
pod-reader-role   53s

3. ServiceAccount主體角色綁定

將pod-reader-sa ServiceAccount主體綁定到角色pod-reader-role猪叙。

# cat sa-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: sa-read-pods-rolebinding
  namespace: ctnrs
subjects:
- kind: ServiceAccount
  name: pod-reader-sa  #serviceaccount name
roleRef:
  kind: Role
  name: pod-reader-role  #授權角色名
  apiGroup: rbac.authorization.k8s.io

# kubectl create -f  sa-rolebinding.yaml
# kubectl get sa -n ctnrs
NAME            SECRETS   AGE
pod-reader-sa   1         7m16s

查看pod-reader-sa ServiceAccount 的token值,使用此token登錄k8s UI, 只能查看ctnrs命名空間的Pod仁卷。
kubectl describe secret pod-reader-sa -n ctnrs

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末穴翩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锦积,更是在濱河造成了極大的恐慌芒帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丰介,死亡現(xiàn)場離奇詭異背蟆,居然都是意外死亡鉴分,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門带膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志珍,“玉大人,你說我怎么就攤上這事垛叨÷着矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵点额,是天一觀的道長舔株。 經常有香客問我,道長还棱,這世上最難降的妖魔是什么载慈? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮珍手,結果婚禮上办铡,老公的妹妹穿的比我還像新娘。我一直安慰自己琳要,他們只是感情好寡具,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稚补,像睡著了一般童叠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上课幕,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天厦坛,我揣著相機與錄音,去河邊找鬼乍惊。 笑死杜秸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的润绎。 我是一名探鬼主播撬碟,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莉撇!你這毒婦竟也來了呢蛤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤稼钩,失蹤者是張志新(化名)和其女友劉穎顾稀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝撑,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡静秆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巡李。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抚笔。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侨拦,靈堂內的尸體忽然破棺而出殊橙,到底是詐尸還是另有隱情,我是刑警寧澤狱从,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布膨蛮,位于F島的核電站,受9級特大地震影響季研,放射性物質發(fā)生泄漏敞葛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一与涡、第九天 我趴在偏房一處隱蔽的房頂上張望惹谐。 院中可真熱鬧,春花似錦驼卖、人聲如沸氨肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎囚。三九已至,卻和暖如春桥胞,著一層夾襖步出監(jiān)牢的瞬間恳守,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工埠戳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留井誉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓整胃,卻偏偏與公主長得像颗圣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屁使,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容