1. 程式人生 > >Kubernetes API訪問鑑權之Basic模式

Kubernetes API訪問鑑權之Basic模式

Kubernetes 支援多種模式的API訪問鑑權方式。包括私鑰+證書模式,Basic 使用者名稱密碼模式,Bearer Token 模式等。其中最常用的是基於ServiceAccount的私鑰+證書模式。不過另外兩種模式也在支援範疇,所以我們也瞭解一下,方便特殊場景下的使用。

Basic使用者鑑權

首先,我們在API服務端的 /etc/kubernetes/ 目錄下新建一個 users.csv 檔案,內容如下:

[[email protected] kubernetes]# cat users.csvpass123,jemy,1007,"developer"

然後在 APIServer 的啟動命令列選項中加入選項

--basic-auth-file=/etc/kubernetes/users.csv

我們在叢集外的一個客戶端設定下訪問叢集的Basic賬號資訊,主要需要使用者名稱,密碼,叢集ca證書以及叢集的 API Server 服務地址。

$ kubectl config set-credentials jemy --username jemy --password pass123User "jemy" set.
$ kubectl config set-cluster k8s-learning --server https://10.8.1.72:6444 --certificate-authority /etc/kubernetes/pki/env-jxx/ca.pem
$ kubectl config set-context k8s-learning-ctx --cluster k8s-learning --user jemy$ kubectl config use-context k8s-learning-ctx

然後,我們嘗試直接訪問nodes命令,會發現報錯如下:

$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "jemy" cannot list nodes at the cluster scope

這種錯誤表示許可權驗證通過了但是沒有任何的許可權。如果是許可權驗證不通過,報錯如下:

$ kubectl get nodeserror: You must be logged in to the server (Unauthorized)

上面的這個問題主要是由K8S的訪問許可權管理模式決定的。K8S的資源訪問許可權的基本處理流程分為三步:

  1. Authentication 許可權驗證,簡單來說就是檢查所使用的API的使用者許可權是否存在,比如使用者名稱密碼是否正確,就是一個登陸許可權而已

  2. Authorization 授權驗證,簡單來說就是檢查這個使用者許可權是否擁有操作K8S資源的許可權,對哪些資源有操作許可權,只要存在一個資源的操作許可權正確,就允許通過

  3. Admission Control 准入控制,簡單來說就是檢查這個使用者對這些資源的具體操作許可權是否合法,存在一個不合法則全部拒絕操作

為了讓這個使用者能夠訪問叢集資源,我們給這個普通的使用者jemy授權一個系統內建的ClusterRole:cluster-admin

$ kubectl create clusterrolebinding cluster-admin-for-jemy --clusterrole cluster-admin --user jemyclusterrolebinding.rbac.authorization.k8s.io/cluster-admin-for-jemy created

然後再執行上面的 kubectl get nodes 即可發現節點。

$ kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION10.8.1.75   Ready     <none>    23d       v1.11.010.8.1.76   Ready     <none>    23d       v1.11.0

我們使用 kubectl get clusterrole cluster-admin -o yaml 看下這個內建的 cluster-admin 定義:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: 2018-08-27T01:31:58Z
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "43"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/cluster-admin
  uid: fd9b31a4-a998-11e8-811b-569fbff0044d
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'- nonResourceURLs:
  - '*'
  verbs:
  - '*'

這個 ClusterRole 裡面定義了所有資源的訪問,配置等操作許可權。

為了瞭解許可權控制,我們可以建立一個自己的ClusterRole,只允許讀取節點和列舉節點資訊。

先把剛剛的ClusterRoleBinding刪除

$ kubectl delete  clusterrolebinding cluster-admin-for-jemy 

然後先建立我們自己的 ClusterRole

$ kubectl create clusterrole my-cluster-admin --resource nodes --verb 'get,list'clusterrole.rbac.authorization.k8s.io/my-cluster-admin created

重新建立繫結

$ kubectl create clusterrolebinding cluster-admin-for-jemy --clusterrole my-cluster-admin --user jemyclusterrolebinding.rbac.authorization.k8s.io/cluster-admin-for-jemy created

讀取某個節點資訊,對應get操作

$ kubectl get nodes 10.8.1.75NAME        STATUS    ROLES     AGE       VERSION10.8.1.75   Ready     <none>    23d       v1.11.0

獲取節點的列表,對應list操作

$ kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION10.8.1.75   Ready     <none>    23d       v1.11.010.8.1.76   Ready     <none>    23d       v1.11.0

如果獲取其他的資源比如 Pods,就會失敗

$ kubectl get pods
Error from server (Forbidden): pods is forbidden: User "jemy" cannot list pods in the namespace "default"

在上面的例子中,基本介紹了普通使用者在K8S中的使用方法,這裡有個小的問題,如果我們改變這個使用者名稱字,需要同步叢集和客戶端的哪些資訊呢?

  1. 改變 /etc/kubernetes/users.csv 中的使用者名稱 jemy 為 jemygraw,並scp到各個API Server的節點

  2. 重啟APIServer伺服器

  3. 修改客戶端~/.kube/config 裡面定義users 的地方,把裡面的 username 改為 jemygraw

  4. 在叢集中使用 kubectl edit clusterrolebinding cluster-admin-for-jemy,把裡面定義subjects的地方kind:User的節點裡面的name改為 jemygraw 即可

  5. 然後客戶端使用kubectl get nodes 就可以了

這個過程可以自行驗證下,順便再熟悉下上面的操作流程。

參考文件:

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

相關推薦

Kubernetes API訪問Basic模式

Kubernetes 支援多種模式的API訪問鑑權方式。包括私鑰+證書模式,Basic 使用者名

AWS V4ElasticSearch

背景 Amazon簽名版本4是將身份驗證資訊新增到HTTP傳送的AWS請求的過程。為了安全起見,大多數對AWS的請求必須使用訪問金鑰進行簽名,該訪問金鑰由訪問金鑰ID和祕密訪問金鑰組成。 在使用AWS的ElasticSearch服務時需要對請求鑑權,需要將你的aws_a

Android學習記錄(十三) httpdigest填坑6.0。

背景: android 6.0.1 的手機發現使用webdav下載檔案實效,httpclient.execute get的時候出現: CrashHandler: java.lang.ArrayInde

IdentityServer4(7)- 使用客戶端認證控制API訪問(客戶端授權模式

一.前言 目前官方的文件和Demo以及一些相關元件全部是.net core 1.1的,應該是因為目前IdentityServer4目前最新版本只是2.0.0 rc1的原因,官方文件和Demo還沒來更新。我準備使用的是.net core 2.0 所支援的IdentityServer4 2.0.0,官方文件及De

java建立elasticsearch5.X的Client,兩種模式

  java連線客戶端主要為兩種方式,一種是沒有鑑權,一種是叢集通過search-guard新增ssl鑑權。 無

介面sign簽名校驗與JWT驗證

需求描述:   專案裡的幾個Webapi介面需要進行鑑權,同介面可被小程式或網頁呼叫,小程式裡沒有使用者登入的概念,網頁裡有使用者登入的概念,對於呼叫方來源是小程式的情況下進行放權,其他情況下需要有身份驗證。也就是說給所有小程式請求進行放行,給網頁請求進行jwt身份驗證。由於我的小程式沒有使用者登入的功能,所

【Gin-API系列】Gin中介軟體訪問(五)

在完成中介軟體的介紹和日誌中介軟體的程式碼後,我們的程式已經基本能正常跑通了,但如果要上生產,還少了一些必要的功能,例如鑑權、異常捕捉等。本章我們介紹如何編寫鑑權中介軟體。 > 鑑權訪問,說白了就是給使用者的請求增加一些限制條件,過濾掉不符合要求的請求。完善的鑑權模組可以讓我們的服務跑得更加安全,特別

資料和安全訪問授權與方式

訪問授權(Authorization) 最靈活的保護你應用資料安全的方式是通過訪問控制列表(Access Control List),通常簡稱為「ACL 機制」。ACL 背後的機制是將每個操作授權給一部分 使用者(User)或者 角色(Role),只允許這些使用者或角色執行這

kubernetes使用http rest api訪問叢集

系列目錄 在Kubernetes叢集中,API Server是叢集管理API的入口,由執行在Master節點上的一個名為kube-apiserver的程序提供的服務。 使用者進入API可以通過kubectl、客戶端庫或者http rest,User 或者 Service Account可以被授權進入API

kubernetes使用http rest api訪問叢集使用postman工具訪問 apiserver

系列目錄 前面一節我們介紹了使用curl命令列工具訪問apiserver,命令列工具快速高效,但是對於輸出非常長的內容檢視不是特別方便,尤其終端介面輸入的東西非常多的時候,過長的內容不是特別容易通過滾動快速定位到本次輸出內容的開始部分.也不便於複製到網頁線上json格式化工具裡檢視.命令列輸入過長的內容也

Kubernetes K8SRBAC詳解

  Kubernetes K8S之鑑權概述與RBAC詳解   K8S認證與授權   認證「Authentication」 認證有如下幾種方式: 1、HTTP Token認證:通過一個Token來識別合法使用者。 HTTP Token的認證是用一個很長的特殊編碼方式的並且難以

五指cms 欄目訪問限和內容訪問限-提醒模式配置

五指cms wuzhicms系統模式:沒有權限時直接提醒手動模式:可以在模版中,隱藏沒有權限訪問的內容。靈活性更高。 在模版中可以取到變量:$access_authority2種值:true or false為true時,有權限為false時,無權限<div class="content-p"&

How to setup Assigned Access in Windows 10 (Kiosk Mode) 設置分配的訪問限(Kiosk模式)

win tar mode ctr assigned all oos rsquo eve Let’s say you’re building some sort of ingenious mechanical contraption to be dis

MongoDB最簡單的入門教程五-通過Restful API訪問MongoDB

rest creat 操作 database internal 進行 作用 shu 公眾 通過前面四篇的學習,我們已經在本地安裝了一個MongoDB數據庫,並且通過一個簡單的Spring boot應用的單元測試,插入了幾條記錄到MongoDB中,並通過MongoDB Com

認證API許可權控制在微服務架構中的設計與實現

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第一篇,本系列預計四篇文章講解微服務下的認證鑑權與API許可權控制的實現。 1. 背景 最近在做許可權相關服務的開發,在系統微服務化後,原有的單體應用是基於session的安全許可權方式,不能滿足現有的微服務架構的認

認證API許可權控制在微服務架構中的設計與實現(四)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的完結篇,前面三篇已經將認證鑑權與API許可權控制的流程和主要細節講解完。本文比較長,對這個系列進行收尾,主要內容包括對授權和鑑權流程之外的endpoint以及Spring Security過濾器部分踩坑的經歷。歡迎閱讀本系列

認證API許可權控制在微服務架構中的設計與實現(三)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第三篇,本文重點講解token以及API級別的鑑權。本文對涉及到的大部分程式碼進行了分析,歡迎訂閱本系列文章。 1. 前文回顧 在開始講解這一篇文章之前,先對之前兩篇文章進行回憶下。在第一篇 認證鑑權與AP

HA模式下的java api訪問要點

在非HA架構的HDFS中,客戶端要通過java介面呼叫HDFS時一般是在JobRunner的類中按照下面的方式: 因為nodename只有一個節點所以會在程式碼中顯式的指明要連線哪一個節點;但是在HA模式下有兩臺namenode節點,並不能按照這種方式,而是下面的方式: 其中的ns就是namese

Java API 訪問HA模式下的HDFS叢集

在使用Hadoop Java API訪問HDFS叢集時,在建立FileSystem物件時,直接指定NameNode的IP以及埠號即可。但是在HA模式下,訪問HDFS叢集卻有一些不同,需要指定NameSpace和主備NameNode的IP以及埠等資訊,具體操作方式見如下程式碼: Configura

大資料hbase(一) --- HBase介紹,特性,安裝部署,shell命令,client端與hbase的互動過程,程式設計API訪問hbase實現百萬寫入

一、HBase介紹 ---------------------------------------------- 1.基於hadoop的資料庫,具有分散式,可伸縮的大型資料儲存 2.用於對資料的隨機訪問,實時讀寫 3.巨大的表,十億行*百萬列