十七、k8s安全框架

一、kubernetes安全框架

二、認(rèn)證、授權(quán)、準(zhǔn)入控制

三、基于角色的權(quán)限訪問控制:RBAC

四、案例:為指定用戶授權(quán)訪問不同命名空間權(quán)限

4.1、用k8s CA簽發(fā)客戶端證書

4.2、生成kubeconfig授權(quán)文件

4.3、創(chuàng)建RBAC權(quán)限策略

4.4、指定kubeconfig文件測(cè)試:

4.5、添加service權(quán)限,修改此配置

4.6、添加apps和deployment權(quán)限

4.7、官方示例參考

4.8、查看所有API接口

4.9、不添加kubeconfig文件直接執(zhí)行kubectl命令

五、授權(quán)一個(gè)應(yīng)用程序(pod)訪問apiserver流程



一、kubernetes安全框架

k8s安全控制框架主要由下面三個(gè)階段進(jìn)行控制,每一個(gè)階段都支持插件方式,通過api?server配置來啟用插件。

1、鑒權(quán):Authentication

2、授權(quán):Authorization

3、準(zhǔn)入控制:Admission?Control

客戶端要想訪問k8s集群api?server,一般需要證書、token或用戶名+密碼;如果Pod訪問,需要ServiceAccount。

二、認(rèn)證、授權(quán)、準(zhǔn)入控制

2.1?鑒權(quán):Authentication

三種客戶端身份認(rèn)證:

a、HTTPS證書認(rèn)證:?基于CA證書簽名的數(shù)字證書認(rèn)證

b、HTTP?Token認(rèn)證:通過一個(gè)Token來識(shí)別用戶

c、HTTP?Base認(rèn)證:用戶名+密碼的方式認(rèn)證

2.2、授權(quán):Authorization

RBAC(Role-BasedAccess Control,基于角色的訪問控制):負(fù)責(zé)完成授權(quán)(Authorization)工作。

RBAC根據(jù)API請(qǐng)求屬性,決定允許還是拒絕

比較常見的授權(quán)維度:

a、user:用戶名

b、group:用戶分組

c、資源,如pod、deployment

d、資源操作方法:get, list, create, update, patch, watch, delete

e、命名空間

f、API組

2.3?準(zhǔn)入控制:Admission?Control

實(shí)際上是一個(gè)準(zhǔn)入控制插件列表,發(fā)送到API?Server的請(qǐng)求都需要經(jīng)過這個(gè)列表中的每個(gè)準(zhǔn)入控制器插件的檢查,檢查不通過,則拒絕請(qǐng)求。

準(zhǔn)入控制插件列表:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

三、基于角色的權(quán)限訪問控制:RBAC

RBAC(Roke-Based?Access?Control,基于角色的訪問控制),允許通過kubernetes?API動(dòng)態(tài)配置策略(立即生效)。

角色:

1、Role:授權(quán)特定命名空間的訪問權(quán)限

2、ClusterRole:授權(quán)所有命名空間的訪問權(quán)限

角色綁定:

1、RoleBinding:將角色綁定到主體(即subject)

2、ClusterRoleBinding:將集群角色綁定到主體

主體:

1、User:?用戶

2、Group:?用戶組

3、?ServiceAccount:服務(wù)賬號(hào)

四、案例:為指定用戶授權(quán)訪問不同命名空間權(quán)限

示例:為qj用戶授權(quán)default命名空間pod讀取權(quán)限

4.1、用k8s?CA簽發(fā)客戶端證書

CA指的是k8s的根證書。

kubeadmin部署,目錄是:/etc/kubernetes/pki/ca.crt? 和 ca.key

二進(jìn)制部署,一般會(huì)放到一個(gè)單獨(dú)的目錄:TLS/kubernetes/ca.pem或者其他后綴 和 ca-key.pem

需要單獨(dú)安裝cfssl、 cfssl-certinfo、cfssljson等 命令

vi cert.sh

cat > ca-config.json << EOF

{

? "signing": {

? ? "default": {

? "expiry": "87600h"

? },

? "profiles": {

? ? "kubernetes": {

? "usages": [

? ? "signing",

"key encipherment",

"server auth",

"client auth"

? ],

? "expiry": "87600h"

}

? }

}

}

EOF

cat > qj-csr.json <<EOF

{

? "CN": "qj",

? "hosts": [],

? "key": {

? ? "algo": "rsa",

"size": 2048

? },

? "names": [

? ? {

? "C": "CN",

? "ST": ""BeiJing,

? "L": "BeiJing",

? "O": "k8s",

? "OU": "System"

}

? ]

}

EOF

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes qj-csr.json | cfssljson -bare qj

注:

CN字段代表用戶名

O字段代表用戶組名

#?bash cert.sh

會(huì)生成qj-key.pem和qj.pem兩個(gè)文件

4.2、生成kubeconfig授權(quán)文件

#?vi? kubeconfig.sh

kubectl config set-cluster kubernetes \

? --certificate-authority=/etc/kubernetes/pki/ca.crt \

? --embed-certs=true \

? --server=https://192.168.2.153:6443 \

? --kubeconfig=qj.kubeconfig

#設(shè)置客戶端認(rèn)證

kubectl config set-credentials qj \

? --client-key=qj-key.pem \

? --client-certificate=qj.pem \

? --embed-certs=true \

? --kubeconfig=qj.kubeconfig

#設(shè)置默認(rèn)上下文

kubectl config set-context kubernetes \

? --cluster=kubernetes \

? --user=qj \

? --kubeconfig=qj.kubeconfig

#設(shè)置當(dāng)前使用配置

kubectl config use-context kubernetes --kubeconfig=qj.kubeconfig

#?bash? kubeconfig.sh

會(huì)生成qj.kubeconfig文件。


4.3、創(chuàng)建RBAC權(quán)限策略

拷貝qj.kubeconfig文件到遠(yuǎn)程主機(jī)。

# scp qj.kubeconfig root@x.x.x.x:~

在遠(yuǎn)程主機(jī)執(zhí)行kubectl命令:

# kubectl get pods? --kubeconfig=qj.kubeconfig? ?此時(shí)會(huì)報(bào)qj賬戶無法列出默認(rèn)命名空間pods,即沒有權(quán)限


創(chuàng)建RBAC權(quán)限策略

# vi rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

namespace: default

name: pod-server

rule:

- apiGroups: [""] #API組

? resources: ["pods"] #資源

? verbs: ["get","watch","list"] #操作方法

---

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

name: read-pods

namespace: default

subjects:

- kind: User #主體

? name: qj #用戶名

? apiGroup: rbac.authorization.k8s.io

roleRef:

kind: Role #綁定角色

name: pod-reader #綁定的角色名稱

apiGroup: rbac.authorization.k8s.io

# kubectl apply -f?rbac.yaml

4.4、# 指定kubeconfig文件測(cè)試:

# kubectl get pods --kubeconfig=./qj.kubeconfig

4.5、# 添加service權(quán)限,修改此配置:

#?kubectl apply -f?rbac.yaml

4.6、# 添加apps和deployment權(quán)限

#?kubectl apply -f?rbac.yaml

4.7、# 官方示例參考:

https://kubernetes.io/docs/reference/access-authn-authz/rbac/

4.8、查看所有API接口:

# kubectl api-resources? ?《紅框重表示API組,只有v1的表示為核心組,留空 。如apps/v1表示組為apps組》

4.9、不添加kubeconfig文件直接執(zhí)行kubectl命令

放在家目錄如:/root

# mkdir /root/.kube

# mv qj.kubeconfig /root/.kube/config

# kubectl get pod,svc

五、授權(quán)一個(gè)應(yīng)用程序(pod)訪問apiserver流程

1、創(chuàng)建一個(gè)serviceaccount

2、創(chuàng)建role規(guī)則

3、role綁定serviceaccount

subjects:

- king: ServiceAccount

name: nfs-client-provisioner


六、獲取token

# kubectl get sa

#kubectl get secret

七、管理員權(quán)限組

獲取權(quán)限組:


獲取管理員權(quán)限組,默認(rèn)的管理員權(quán)限組:

賦管理員權(quán)限,可以直接使用:

# kubectl create serviceaccount dashboard-admin -n kube-system

# kubectl create clusterrolebinding dashboard-admin --cluserrrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

#kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret |awk '/dashboard-admin/{print $1}')


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容