一 Kubernetes訪問 1.1 Kubernetes交互 與Kubernetes交互通常有kubectl、客戶端(Dashboard)、REST API請求。 1.2 API訪問流程 用戶使用kubectl、客戶端(Web)、或者REST請求訪問API的時候,Kubernetes內部服務或外部 ...
一 Kubernetes訪問
1.1 Kubernetes交互
與Kubernetes交互通常有kubectl、客戶端(Dashboard)、REST API請求。
1.2 API訪問流程
用戶使用kubectl、客戶端(Web)、或者REST請求訪問API的時候,Kubernetes內部服務或外部訪問都可獲得授權來訪問API。當一個請求達到API的時候,通常會經過以下階段:
1.3 安裝傳輸
通常在Kubernetes集群中,API在埠443上提供服務。且通常為自簽名的證書,在$USER/.kube/config中包含API伺服器證書的根證書,該證書在配置時用於代替系統預設根證書。因此需要自定義配置證書時,可將證書寫入$USER/.kube/config。當使用kube-up.sh創建集群時,此證書會自動寫入$USER/.kube/config。如果群集有多個用戶,則創建者需要與其他用戶共用證書。
1.4 Authentication
建立TLS後,HTTP請求將進行身份驗證,API伺服器可配置為運行一個或多個身份驗證器模塊。
身份驗證步驟的輸入是整個HTTP請求,但是,它通常只檢查標頭和/或客戶端證書。
身份驗證模塊包括客戶端證書,Password和Plain Tokens,Bootstrap Tokens和JWT令牌(用於服務帳戶)。
可以指定多個驗證模塊,在這種情況下,每個驗證模塊都按順序嘗試,直到其中一個成功。
如果請求無法通過身份驗證,則會被HTTP狀態碼401拒絕。否則,用戶將被認證為特定username用戶。
提示:雖然Kubernetes usernames用於訪問控制決策和請求日誌記錄,但它沒有user對象,也沒有在其對象庫中存儲用戶名或有關用戶的其他信息。
1.5 Authorization
請求被認證為來自特定用戶後,必須授權該請求。
請求必須包括請求者的用戶名,請求的操作以及受操作影響的對象。如果現有策略聲明用戶有權完成請求的操作,則授權該請求。
Kubernetes使用API伺服器授權API請求,同時支持多種授權模塊,如ABAC模式,RBAC模式和Webhook模式。管理員創建集群時,已配置了應在API伺服器中使用的授權模塊。如果配置了多個授權模塊,Kubernetes將檢查每個模塊,如果任何模塊授權該請求,則該請求可以繼續。如果所有模塊拒絕該請求,則拒絕該請求(HTTP狀態代碼403)。
示例1:zhangsan
1 { 2 "apiVersion": "abac.authorization.kubernetes.io/v1beta1", 3 "kind": "Policy", 4 "spec": { 5 "user": "zhangsan", 6 "namespace": "projectCaribou", 7 "resource": "pods", 8 "readonly": true 9 } 10 }
解釋:如上所示zhangsan具備的策略,代表zhangsan只能在projectCaribou命名空間中讀取Pod。
請求操作:
1 { 2 "apiVersion": "authorization.k8s.io/v1beta1", 3 "kind": "SubjectAccessReview", 4 "spec": { 5 "resourceAttributes": { 6 "namespace": "projectCaribou", 7 "verb": "get", 8 "group": "unicorn.example.org", 9 "resource": "pods" 10 } 11 } 12 }
解釋:如上是get pods操作將被允許,但不能create或update projectCaribou,因為沒有得到授權。
1.6 授權審查屬性
Kubernetes在接受到請求時,將對以下屬性進行審查:
- user:身份驗證時提供的user字元串;
- group:經過身份驗證的用戶所屬的組名稱列表;
- extra:由身份驗證層提供的任意字元串鍵到字元串值的映射;
- API:請求是否是針對API資源;
- Request path:到其他non-resource的endpoint,如/api或/healthz)的路徑;
- API request verb:API請求的動作,如 get, list, create, update, patch, watch, proxy, redirect, delete, 和deletecollection;
- HTTP request verb:HTTP請求的動作,如 get, post, put, 和 delete 用於 non-resource 的請求;
- Resource:正在訪問的資源的ID或名稱(僅限資源請求),對於使用get,update和patch,和delete動詞的資源請求,您必須提供資源名稱。
- Subresource:正在訪問的子資源(僅限資源請求);
- Namespace:要訪問的對象的名稱空間(僅適用於命名空間資源請求);
- API group:正在訪問的API組(僅限資源請求)。空字元串表示核心API組。
1.7 請求動作
二 授權模塊
2.1 授權模塊介紹
Node:一種特殊用途的授權程式,它根據計劃運行的pod為kubelet授予許可權。
ABAC:基於屬性的訪問控制(ABAC)定義了一種訪問控制範例,通過使用將屬性組合在一起的策略向用戶授予訪問許可權。策略可以使用任何類型的屬性(用戶屬性,資源屬性,對象,環境屬性等)。
RBAC:基於角色的訪問控制(RBAC)是一種根據企業中各個用戶的角色來管理對電腦或網路資源的訪問的方法。在此上下文中,訪問是單個用戶執行特定任務的能力,例如查看,創建或修改文件。
- 當指定的RBAC(基於角色的訪問控制)使用rbac.authorization.k8s.io API組來驅動授權決策時,允許管理員通過Kubernetes API動態配置許可權策略。
- 要啟用RBAC,請啟動apiserver --authorization-mode=RBAC。
Webhook:WebHook是一個HTTP回調:發生某些事情時發生的HTTP POST; 通過HTTP POST進行簡單的事件通知。實現WebHooks的Web應用程式會在發生某些事情時將消息發佈到URL。
2.2 授權模塊配置
需要在策略配置中包括一個flag作為標識,指明需要使用的授權模塊:
- --authorization-mode=ABAC:基於屬性的訪問控制(ABAC)模式允許您使用本地文件配置策略。
- --authorization-mode=RBAC:基於角色的訪問控制(RBAC)模式允許您使用Kubernetes API創建和存儲策略。
- --authorization-mode=Webhook:WebHook是一種HTTP回調模式,允許您使用遠程REST端點管理授權。
- --authorization-mode=Node:節點授權是一種特殊用途的授權模式,專門授權由kubelet發出的API請求。
- --authorization-mode=AlwaysDeny:該標誌阻止所有請求。僅將此標誌用於測試。
- --authorization-mode=AlwaysAllow:該標誌允許所有請求。僅在您不需要API請求的授權時才使用此標誌。
提手:可以選擇多個授權模塊,按順序檢查模塊,以便較早的模塊具有更高的優先順序來允許或拒絕請求。
2.3 API Server埠和IP
請求到達API server後,預設情況下,Kubernetes API伺服器在2個埠上提供HTTP服務:
- localhost port:
- 用於測試和引導,以及主節點的其他組件(scheduler, controller-manager)與API通信;
- 沒有TLS;
- 預設為埠8080,由--insecure-port標誌控制;
- 預設IP為localhost,由--insecure-bind-address標誌控制;
- 請求繞過身份驗證(authentication )和授權模塊(authorization );
- 由admission控制模塊處理的請求;
- 需要擁有主機訪問許可權。
- Secure Port:
- 推薦使用;
- 使用TLS。由--tls-cert-file標誌設置證書和--tls-private-key-file標誌設置key。
- 預設是埠6443,由--secure-port標誌控制;
- 預設IP是第一個非localhost網路介面,由--bind-address標誌控制;
- 請求由身份驗證(authentication )和授權模塊(authorization )處理。
- 由admission控制模塊處理的請求。
三 驗證方式
3.1 認證類型
從版本1.7開始,Dashboard支持基於以下內容的用戶身份驗證:
Authorization:Bearer <token>:每個請求都傳遞給Dashboard的標頭。從1.6版開始支持。具有最高優先順序。如果存在,則不會顯示登錄界面。
Bearer Token:可以在Dashboard 登錄界面上使用的token。
Username/password:可在Dashboard 登錄界面上使用用戶名/密碼。
Kubeconfig:可在Dashboard 登錄界面上使用的Kubeconfig文件。
提示:登錄界面已在1.7版中引入,如果您使用的是最新推薦的安裝,則預設情況下將啟用登錄功能。若手動配置證書,則需要傳遞--tls-cert-file和--tls-cert-key標誌到dashboard。HTTPS端點將在Dashboard容器的8443埠上暴露,可以通過提供--port標誌進行修改。
Skip選項將設置dashboard使用dashboard服務帳戶的許可權。Skip自1.10.1開放,但預設情況下禁用按鈕。使用--enable-skip-login標誌顯示它。
3.2 Authorization header
在通過HTTP方式訪問Dashboard時,使用Authorization header是使Dashboard充當用戶的唯一方法。
提示:由於普通HTTP流量容易受到MITM攻擊,因此存在一些風險。
要使Dashboard使用Authorization header,需要將Authorization: Bearer <token>每個請求傳遞到Dashboard。可以通過在Dashboard前配置反向代理來實現。Proxy將負責身份提供者的身份驗證,並將請求標頭中生成的令牌傳遞給Dashboard。
註意:需要正確配置Kubernetes API伺服器才能接受這些令牌。
註意:如果通過apiserver代理訪問儀錶板,則授權標頭將不起作用。無論是kubectl proxy和API Server的方式將無法正常工作。這是因為一旦請求到達API伺服器,所有其他標頭都將被刪除。
3.3 Bearer Token
每個服務帳戶都有一個帶有有效承載令牌的機密,可用於登錄儀錶板。
1 [root@master ~]# kubectl -n kube-system get secret #查看secret中令牌
提示:所有類型為'kubernetes.io/service-account-token'的機密信息都允許登錄,它們具有不同的許可權。
1 [root@master ~]# kubectl -n kube-system describe secrets replicaset-controller-token-vv8fd 2 #獲取replicaset-controller-token-vv8fd的令牌
手動創建一個最高許可權名為的admin的ServiceAccount,並綁定名為cluster-admin的ClusterRole角色(該角色擁有集群最高許可權)。
1 [root@master ~]# cd dashboard/ 2 [root@master dashboard]# vi admin-token.yml 3 kind: ClusterRoleBinding 4 apiVersion: rbac.authorization.k8s.io/v1beta1 5 metadata: 6 name: admin 7 annotations: 8 rbac.authorization.kubernetes.io/autoupdate: "true" 9 roleRef: 10 kind: ClusterRole 11 name: cluster-admin 12 apiGroup: rbac.authorization.k8s.io 13 subjects: 14 - kind: ServiceAccount 15 name: admin 16 namespace: kube-system 17 --- 18 apiVersion: v1 19 kind: ServiceAccount 20 metadata: 21 name: admin 22 namespace: kube-system 23 labels: 24 kubernetes.io/cluster-service: "true" 25 addonmanager.kubernetes.io/mode: Reconcile 26 [root@master dashboard]# kubectl create -f admin-token.yml 27 [root@master dashboard]# kubectl get secret -n kube-system | grep admin 28 admin-token-6s8zx kubernetes.io/service-account-token 3 94s 29 [root@master dashboard]# kubectl describe secret/admin-token-6s8zx -n kube-system #查看所創建的token 30 [root@master dashboard]# kubectl -n kube-system get secret admin-token-6s8zx -o jsonpath={.data.token} | base64 -d #直接獲取
提示:Bearer Token認證方式本質上是通過ServiceAccount的身份認證加上Bearer token請求API server的方式實現。
3.4 Username/password
預設情況下禁用基本身份驗證,而建議使用授權模式RBAC和--basic-auth-file標誌配置Kubernetes API伺服器。若未配置API伺服器會自動回退到匿名用戶,也不會使用Username/password的方式,使用匿名用戶後無法檢查提供的憑據是否有效。
可通過--authentication-mode=basic標誌開啟儀錶板等等基本身份驗證功能。預設情況下,它設置為--authentication-mode=token。
1 [root@master ~]# echo "admin,admin,1" >> /etc/kubernetes/basic_auth_file.cvs #創建用戶和密碼 2 [root@master ~]# vi /etc/kubernetes/manifests/kube-apiserver.yaml 3 …… 4 - command: 5 - --authorization-mode=basic 6 - --basic-auth-file=/etc/kubernetes/basic_auth_file #追加 7 ……
提示:前面為用戶,後面為密碼,數字為用戶ID,多個用戶不可重覆。
若有多個master,以上操作在所有master上執行。
3.5 Kubeconfig
kubeconfig file只支持由--authentication-mode標誌指定的身份驗證,目前不支持外部身份提供程式或基於證書的身份驗證。
kubeconfig的認證可以讓擁有該kubeconfig的用戶只擁有一個或幾個命名空間的操作許可權,這相比與上面的token的方式更加的精確和安全。
1 [root@master ~]# kubectl -n kube-system get secret admin-token-6s8zx -o jsonpath={.data.token} | base64 -d 2 eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi02czh6eCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNkYzY0ZTQzLTkxY2ItMTFlOS04OTkzLTAwMGMyOWZhN2E3OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.gEy5jU9Ur6xCnF1QYDTpk5zJ-Vkxh-R3TOj_Pn5B0BytSQYXjDRAgzG6BEPUYtz77Jh32fMoA8VVS1HiybhHWe9TYKgGqDhJQ-TBTlSkbWJsAsIkD3yvd2MS9W1kIWMRLowy0vtjgn4yqxVt0l_rZPM3UcuxL_aPZq3-1-kbMVO-Ysq6x2YoxL__ju6OcIeXD_56WdYbS9VsGQKg4aJHb2NMPaQw0A4S3CClqoESzUlVMS2lUms7xCOvOlZi0-r2cSlNbdetVjhfHBAFj8XAkDxAEpalc_eOk1aBxqbvUtapzBp7wBAEPTbhp5NmqMFKcUruo4Ab59TE0bPO836Hhg 3 [root@master ~]# vi admin_kubeconfig 4 …… 5 token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi02czh6eCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNkYzY0ZTQzLTkxY2ItMTFlOS04OTkzLTAwMGMyOWZhN2E3OSIsInN1YiI6In-N5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.gEy5jU9Ur6xCnF1QYDTpk5zJ-Vkxh-R3TOj_Pn5B0BytSQYXjDRAgzG6BEPUYtz77Jh32fMoA8VVS1HiybhHWe9TYKgGqDhJQ-TBTlSkbWJsAsIkD3yvd2MS9W1kIWMRLowy0vtjgn4yqxVt0l_rZPM3UcuxL_aPZq3-1-kbMVO-Ysq6x2YoxL__ju6OcIeXD_56WdYbS9VsGQKg4aJHb2NMPaQw0A4S3CClqoESzUlVMS2lUms7xCOvOlZi0-r2cSlNbdetVjhfHBAFj8XAkDxAEpalc_eOk1aBxqbvUtapzBp7wBAEPTbhp5NmqMFKcUruo4Ab59TE0bPO836Hhg #追加3.3所創建的具有最高許可權的token
將admin_kubeconfig導出,然後登錄界面的時候在Kubeconfig方式中可以選擇admin_kubeconfig文件即可。
註意:部署生成的 kubeconfig 文件中沒有 token 欄位,需要手動添加該欄位。
本質上,dashboard只支持兩種方法,一種是token,一種是user/password。kubeconfig只是提供了一種便利,並不是一個新的認證方式,如果要用kubeconfig,要麼使用username/password,要麼使用token。
提示:手動創建kubeconfig可參考:https://jimmysong.io/kubernetes-handbook/guide/kubectl-user-authentication-authorization.html
kubeconfig文件詳解參考:https://jimmysong.io/kubernetes-handbook/guide/authenticate-across-clusters-kubeconfig.html。
四 創建管理登錄
如果是在測試環境中,或不考慮安全性的情況之下。可以考慮讓外部用戶直接點擊skip進入到dashboard,並且擁有所有的許可權。可以通過將cluster-admin這個擁有全集群最高許可權的ClusterRole綁定到預設使用的ServiceAccount。
4.1 開啟skip
1 [root@master ~]# cd dashboard/ 2 [root@master dashboard]# vi kubernetes-dashboard.yaml 3 …… 4 args: 5 - --auto-generate-certificates 6 - --enable-skip-login 7 ……
4.2 創建管理員yaml文件
1 [root@master ~]# cd dashboard/ 2 [root@master dashboard]# vi dashboard-admin.yaml 3 apiVersion: rbac.authorization.k8s.io/v1beta1 4 kind: ClusterRoleBinding 5 metadata: 6 name: kubernetes-dashboard 7 labels: 8 k8s-app: kubernetes-dashboard 9 roleRef: 10 apiGroup: rbac.authorization.k8s.io 11 kind: ClusterRole 12 name: cluster-admin 13 subjects: 14 - kind: ServiceAccount 15 name: kubernetes-dashboard 16 namespace: kube-system 17 [root@master dashboard]# kubectl create -f dashboard-admin.yaml
選擇跳過。
參考文檔:
https://jimmysong.io/posts/user-authentication-in-kubernetes/
https://zhangchenchen.github.io/2017/08/17/kubernetes-authentication-authorization-admission-control/