k8s安全機制


1.k8s安全框架介紹

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

      2. Authorization

      3. Admission Control

image.png

當kubectl ,ui,程序 等請求某個 k8s 接口,先認證(判斷真偽),鑒權(是否有權限這么做?),

准入控制(能不能個這么干?)

image.png

 

 

2.認證(Authentication)

三種客戶端身份認證:

  • HTTPS 證書認證:基於CA證書簽名的數字證書認證

      kube-apiserver      

      etcd  

      kubelet 連接kube-apiserver

      kube-proxy連接 kube-apiserver

      均采用 https傳輸方式

image.png

image.png

image.png

image.png

  • 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的請求都需要經過這個列表中的每個准入控制器 插件的檢查,檢查不通過,則拒絕請求。

image.png

 

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 對應。

image.png

 

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

image.png

執行 config.sh 生成benjamin.kubeconfig

創建RABC授權

 

kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata:  namespace: default  name: pod-reader rules: - apiGroups: [""]  resources: ["pods"]  verbs: ["get", "watch", "list"]  ---  kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:  name: read-pods  namespace: default subjects: - kind: User  name: benjamin  apiGroup: rbac.authorization.k8s.io roleRef:  kind: Role  name: pod-reader  apiGroup: rbac.authorization.k8s.io

 

image.png

 

驗證

將master節點的kubectl 命令分發到node節點

scp /usr/bin/kubectl 192.168.31.65:/usr/bin/

如果不指定 kubeconfig 文件的時候發現 查看不了

image.png

 

指定授權后的kubeconfig文件 可以查看你default名稱空間下的 pod資源

image.png

查看default 名稱空間下pod的日志發現也是不可以

image.png

但是卻不能訪問非 default 名稱空間下的pod,和所有名稱空間下的其他資源,因為授權查看的資源只有default名稱空間下的pod資源。

image.png

 

image.png

 

增加權限驗證

根據上面的rabc.yaml 增加resources 列表 查看pod日志和查看service的權限

image.png

重新應用配置  kubectl  apply -f rabc.yaml

 

重新配置后:

可以查看default 空間下pod日志

image.png

可以查看default空間下service

image.png

 

如何讓自定義授權文件成為默認文件?

 cp benjamin.kubeconfig /root/.kube/config

如果沒有  .kube 目錄就創建一個,這樣就會讀取默認配置文件  /root/.kube/config 

image.png

6.官網鏈接

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM