1.k8s安全框架介紹
- 訪問K8S集群的資源需要過三關:認證、鑒權、准入控制
- 普通用戶若要安全訪問集群API Server,往往需要證書、 Token或者用戶名+密碼;Pod訪問,需要ServiceAccount
- K8S安全控制框架主要由下面3個階段進行控制,每一個階段 都支持插件方式,通過API Server配置來啟用插件。1. Authentication
2. Authorization
3. Admission Control
當kubectl ,ui,程序 等請求某個 k8s 接口,先認證(判斷真偽),鑒權(是否有權限這么做?),
准入控制(能不能個這么干?)
2.認證(Authentication)
三種客戶端身份認證:
- HTTPS 證書認證:基於CA證書簽名的數字證書認證
kube-apiserver
etcd
kubelet 連接kube-apiserver
kube-proxy連接 kube-apiserver
均采用 https傳輸方式
- HTTP Token認證:通過一個Token來識別用戶
客戶端攜帶一個token來請求server端,如果server端含有這個token,那么認證成功否則失敗
- HTTP Base認證:用戶名+密碼的方式認證
比較原始的方式,在k8s中基本很少使用
3.授權鑒權(Authorization)
RBAC(Role-Based Access Control,基於角色的訪問控制):
負責完成授權(Authorization)工作。
根據API請求屬性,決定允許還是拒絕。
- user:用戶名
- group:用戶分組
- extra:用戶額外信息
- API • 請求路徑:例如/api,/healthz • API請求方法:get,list,create,update,patch,watch,delete
- HTTP請求方法:get,post,put,delete
- 資源
- 子資源
- 命名空間
- API組
4.准入控制(Adminssion Control)
Adminssion Control實際上是一個准入控制器插件列表,發送到API Server的請求都需要經過這個列表中的每個准入控制器 插件的檢查,檢查不通過,則拒絕請求。
5.使用RBAC授權
RBAC(Role-Based Access Control,基於角色的訪問控制),允許通過Kubernetes API動態配置策略。
• 角色
- Role:授權特定命名空間的訪問權限
- ClusterRole:授權所有命名空間的訪問權限
• 角色綁定
- RoleBinding:將角色綁定到主體(即subject)
- ClusterRoleBinding:將集群角色綁定到主體
• 主體(subject)
- User:用戶
- Group:用戶組
- ServiceAccount:服務賬號
用戶或者用戶組,服務賬號,與具備某些權限的角色綁定,然后將該角色的權限繼承過來,這一點類似阿里雲的 ram 授權。這里需要注意 定義的角色是 Role作用域只能在指定的名稱空間下有效,如果是ClusterRole可作用於所有名稱空間下。
Rolebinding 和Role 對應,ClusterRoleBinding 和 ClusterRole 對應。
5.RABC示例
示例:為benjamin用戶授權default命名空間Pod讀取權限
1. 用K8S CA簽發客戶端證書
2. 生成kubeconfig授權文件
3. 創建RBAC權限策略
通過ca證書生成自簽證書
mkdir /root/benjamin
sh 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 > benjamin-csr.json <<EOF { "CN": "benjamin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem -ca-key=/opt/kubernetes/ssl/ca-key.pem -config=ca-config.json -profile=kubernetes benjamin-csr.json | cfssljson -bare benjami
通過指定的ca配置生成 benjamin-key.pem benjamin.pem
生成kubeconfig授權文件
cd /root/benjamin
sh config.sh
kubectl config set-cluster kubernetes \ --certificate-authority=/opt/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://192.168.31.63:6443 \ --kubeconfig=benjamin.kubeconfig # 設置客戶端認證 kubectl config set-credentials benjamin \ --client-key=benjamin-key.pem \ --client-certificate=benjamin.pem \ --embed-certs=true \ --kubeconfig=benjamin.kubeconfig # 設置默認上下文 kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=benjamin \ --kubeconfig=benjamin.kubeconfig # 設置當前使用配置 kubectl config use-context kubernetes --kubeconfig=benjamin.kubeconfig
執行 config.sh 生成benjamin.kubeconfig
創建RABC授權
kind
驗證
將master節點的kubectl 命令分發到node節點
scp /usr/bin/kubectl 192.168.31.65:/usr/bin/
如果不指定 kubeconfig 文件的時候發現 查看不了
指定授權后的kubeconfig文件 可以查看你default名稱空間下的 pod資源
查看default 名稱空間下pod的日志發現也是不可以
但是卻不能訪問非 default 名稱空間下的pod,和所有名稱空間下的其他資源,因為授權查看的資源只有default名稱空間下的pod資源。
增加權限驗證
根據上面的rabc.yaml 增加resources 列表 查看pod日志和查看service的權限
重新應用配置 kubectl apply -f rabc.yaml
重新配置后:
可以查看default 空間下pod日志
可以查看default空間下service
如何讓自定義授權文件成為默認文件?
cp benjamin.kubeconfig /root/.kube/config
如果沒有 .kube 目錄就創建一個,這樣就會讀取默認配置文件 /root/.kube/config
6.官網鏈接
https://kubernetes.io/docs/reference/access-authn-authz/rbac/