一蟆淀、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文件測試:
4.5赛惩、添加service權(quán)限哀墓,修改此配置
4.6、添加apps和deployment權(quán)限
4.7喷兼、官方示例參考
4.8篮绰、查看所有API接口
4.9、不添加kubeconfig文件直接執(zhí)行kubectl命令
五季惯、授權(quán)一個應(yīng)用程序(pod)訪問apiserver流程
一吠各、kubernetes安全框架
k8s安全控制框架主要由下面三個階段進(jìn)行控制,每一個階段都支持插件方式勉抓,通過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)證:通過一個Token來識別用戶
c、HTTP?Base認(rèn)證:用戶名+密碼的方式認(rèn)證
2.2垛贤、授權(quán):Authorization
RBAC(Role-BasedAccess Control焰坪,基于角色的訪問控制):負(fù)責(zé)完成授權(quán)(Authorization)工作。
RBAC根據(jù)API請求屬性聘惦,決定允許還是拒絕
比較常見的授權(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
實際上是一個準(zhǔn)入控制插件列表剂跟,發(fā)送到API?Server的請求都需要經(jīng)過這個列表中的每個準(zhǔn)入控制器插件的檢查减途,檢查不通過,則拒絕請求曹洽。
準(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動態(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ù)賬號
四智听、案例:為指定用戶授權(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)制部署考赛,一般會放到一個單獨的目錄:TLS/kubernetes/ca.pem或者其他后綴 和 ca-key.pem
需要單獨安裝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
會生成qj-key.pem和qj.pem兩個文件
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
會生成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? ?此時會報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文件測試:
# 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)一個應(yīng)用程序(pod)訪問apiserver流程
1阐肤、創(chuàng)建一個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}')