摘要:介紹我們想要啥結束多簡單,別整那么多沒用的。創建密鑰對私鑰加密總結核心代碼已經可用,不過為了更方便使用還需要進一步梳理,敬請期待。鑒權僅是其其中一個功能,定位是一個極簡的管理平臺。
kubernetes集群三步安裝概述
kubernetes server account的token很容易獲取,但是User的token非常麻煩,本文給出一個極簡的User token生成方式,讓用戶可以一個http請求就能獲取到。
token主要用來干啥官方dashboard登錄時需要。 如果通過使用kubeconfig文件登錄而文件中又沒有token的話會失敗,現在大部分文章都介紹使用service account的token來登錄dashboard,能通,不過有問題:
第一:綁定角色時要指定類型是service account:
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount # 這里不是User類型 name: kubernetes-dashboard namespace: kube-system
第二:要理解kubeconfig里是解析證書把CN作為用戶名的,這時service account即便與CN一樣那還是兩個賬戶,綁定角色時還需要綁定兩次,有點像把service account給"人"用, 所以把service account的token扔給某個開發人員去用往往不合適,service account token更多時候是給程序用的。
想直接調用https的,沒有token就會:
[root@iZj6cegflzze2l7fpcqoerZ ssl]# curl https://172.31.12.61:6443/api/v1/namespaces/default/pods --insecure { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "pods is forbidden: User "system:anonymous" cannot list resource "pods" in API group "" in the namespace "default"", "reason": "Forbidden", "details": { "kind": "pods" }, "code": 403 }
因為沒有任何認證信息,所以匿名(anonymous)用戶沒有任何權限
加了token是這樣的:
[root@iZj6cegflzze2l7fpcqoerZ ssl]# curl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkNnYzRPVEV5TlRVM0VnWm5hWFJvZFdJIn0.eyJpc3MiOiJodHRwczovL2RleC5leGFtcGxlLmNvbTo4MDgwIiwic3ViIjoiQ2djNE9URXlOVFUzRWdabmFYUm9kV0kiLCJhdWQiOiJleGFtcGxlLWFwcCIsImV4cCI6MTU1MTA5NzkwNiwiaWF0IjoxNTUwNzM3OTA2LCJlbWFpbCI6ImZodGpvYkBob3RtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiZGV2Il0sIm5hbWUiOiJmYW51eCJ9.ZqKn461UW0aGtyjyqu2Dc5tiUzC-6eYLag542d3AvklUdZuw8i9XwyaUg_f1OAj0ZsEcOybOe9_PeGMaUYzU0OvlKPY-q2zbQVC-m6u6sQw6ZXx8pi0W8k4wQSJnMaOLddCfurlYufmr8kScDBQlnKapSR0F9mJzvpKkHD-XNshQKWhX3n03g7OfFgb4RuhLjKDNQnoGn7DfBNntibHlF9sPo0jC5JjqTZaGvoGmiRE4PAXwxA-RJifsWDNf_jW8lrDiY4NSO_3O081cia4N1GKht51q9W3eaNMvFDD9hje7abDdZoz9KPi2vc3zvgH7cNv0ExVHKaA0-dwAZgTx4g" -k https://172.31.12.61:6443/api/v1/namespaces/default/pods { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "pods is forbidden: User "https://dex.example.com:8080#fanux" cannot list resource "pods" in API group "" in the namespace "default"", "reason": "Forbidden", "details": { "kind": "pods" }, "code": 403 }
看,雖然還是403 但是已經有了用戶信息,只要給該用戶授權就可正常訪問了,如何授權下文介紹
token種類介紹token的生成方式有很多,主要分成三種:
service account token 這個創建service account就有,存在secret里 獲取比較簡單,但是要區分好 User 和 service account區別
普通的token,這種token就是個普通的字符串,一般是自己寫一個認證的web hook, k8s認證時調用這個hook 查詢token是否有效,比較low
基于openid的jwt(josn web token) 這種token,認證中心把用戶信息放在json里,用私鑰加密,k8s拿到token后用公鑰解密,只要解密成功token就是合法的而且能拿到用戶信息,不需要再像認證中心請求
基于openid的jwt是本文介紹的重點。
社區用的比較多的就是dex,是一個比較完整的實現,但是對于不熟悉該技術的朋友來說還是有點門檻的,容易繞進去。 而且還存在一些使用不方便的問題。
如依賴復雜,首先得需要一個真正的用戶管理程序,如ldap 或者一個auth2服務端,這還可以接受,關鍵是認證時可能需要依賴瀏覽器進行跳轉授權,這在十分多的場景里就變的十分尷尬,就比如我們的場景壓根沒有
界面,這樣生成token就成了一個大問題。 其次集成到別的系統中時往往用戶已經登錄過了,所以需要一個二次授權的過程才能拿到token,依賴過重導致系統難以設計。
然而如果不是集成到別的系統中,比如從0開發一個完成的PaaS平臺那使用dex還是一個完美的方案。
所以我們實現了一個簡單粗暴的方案,完全解放了這個過程, 只care最核心的東西。
sealyun fist介紹我們想要啥?
input:
{ "User": "fanux", "Group": ["sealyun", "develop"] }
output:
eyJhbGciOiJSUzI1NiIsImtpZCI6IkNnYzRPVEV5TlRVM0VnWm5hWFJvZFdJIn0.eyJpc3MiOiJodHRwczovL2RleC5leGFtcGxlLmNvbTo4MDgwIiwic3ViIjoiQ2djNE9URXlOVFUzRWdabmFYUm9kV0kiLCJhdWQiOiJleGFtcGxlLWFwcCIsImV4cCI6MTU1MTA5NzkwNiwiaWF0IjoxNTUwNzM3OTA2LCJlbWFpbCI6ImZodGpvYkBob3RtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiZGV2Il0sIm5hbWUiOiJmYW51eCJ9.ZqKn461UW0aGtyjyqu2Dc5tiUzC-6eYLag542d3AvklUdZuw8i9XwyaUg_f1OAj0ZsEcOybOe9_PeGMaUYzU0OvlKPY-q2zbQVC-m6u6sQw6ZXx8pi0W8k4wQSJnMaOLddCfurlYufmr8kScDBQlnKapSR0F9mJzvpKkHD-XNshQKWhX3n03g7OfFgb4RuhLjKDNQnoGn7DfBNntibHlF9sPo0jC5JjqTZaGvoGmiRE4PAXwxA-RJifsWDNf_jW8lrDiY4NSO_3O081cia4N1GKht51q9W3eaNMvFDD9hje7abDdZoz9KPi2vc3zvgH7cNv0ExVHKaA0-dwAZgTx4g
結束,多簡單,別整那么多沒用的。
所以為了實現上面的功能,我們開發了 fist, fist的auth模塊把dex里最核心的token生成功能以及jwt功能實現了。
sealyun fist/auth 使用教程 安裝部署生成證書
# mkdir /etc/kubernetes/pki/fist # cd /etc/kubernetes/pki/fist # sh gencert.sh # 腳本內容內代碼
啟動fist auth模塊
kubectl create -f deploy/fist-auth.yaml
修改k8s apiserver啟動參數
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- command: - kube-apiserver - --oidc-issuer-url=https://fist.sealyun.svc.cluster.local:8080 - --oidc-client-id=example-app - --oidc-ca-file=/etc/kubernetes/pki/fist/ca.pem - --oidc-username-claim=name - --oidc-groups-claim=groups獲取及使用 token
獲取token
curl https://fist.sealyun.svc.cluster.local:8080/token?user=fanux&group=sealyun,develop --cacert ca.pem
使用token
直接curl加bare token 見上文
加入到kubeconfig中:
kubectl config set-credentials --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkNnYzRPVEV5TlRVM0VnWm5hWFJvZFdJIn0.eyJpc3MiOiJodHRwczovL2RleC5leGFtcGxlLmNvbTo4MDgwIiwic3ViIjoiQ2djNE9URXlOVFUzRWdabmFYUm9kV0kiLCJhdWQiOiJleGFtcGxlLWFwcCIsImV4cCI6MTU1MTEwMDI5MywiaWF0IjoxNTUwNzQwMjkzLCJlbWFpbCI6ImZodGpvYkBob3RtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiZGV2Il0sIm5hbWUiOiJmYW51eCJ9.OAK4oIYqJszm1EACYW2neXTo738RW9kXFOIN5bOT4Z2CeKAvYqyOVKCWZf04xX45jwT78mATR3uas2YvRooDXlvxaD3K43ls4KBSG-Ofp-ynqlcVTpD3sUDqyux2iieNv4N6IyCv11smrU0lIlkrQC6oyxzTGae1FrJVGc5rHNsIRZHp2WrQvw83uLn_elHgUfSlsOq0cPtVONaAQWMAMi2DX-y5GCNpn1CDvudGJihqsTciPx7bj0AOXyiOznWhV186Ybk-Rgqn8h0eBaQhFMyNpwVt6oIP5pvJQs0uoODeRv6P3I3-AjKyuCllh9KDtlCVvSP4WtMUTfHQN4BigQ kubernetes-admin
然后.kube/config 文件里的 user.client-certifacate-data 和 client-key-data就可以刪了,再執行kubectl會:
[root@iZj6cegflzze2l7fpcqoerZ ~]# kubectl get pod Error from server (Forbidden): pods is forbidden: User "https://dex.example.com:8080#fanux" cannot list resource "pods" in API group "" in the namespace "default"
說明新用戶成功了
授權
[root@iZj6cegflzze2l7fpcqoerZ ~]# cat rolebind.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-secrets-global subjects: - kind: User name: "https://dex.example.com:8080#fanux" # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-admin # 超級用戶給他 apiGroup: rbac.authorization.k8s.io
創建個role binding即可:
[root@iZj6cegflzze2l7fpcqoerZ ~]# kubectl --kubeconfig /etc/kubernetes/admin.conf create -f rolebind.yaml # 用管理員的kubeconfig clusterrolebinding.rbac.authorization.k8s.io/read-secrets-global created [root@iZj6cegflzze2l7fpcqoerZ ~]# kubectl get pod # 有權限訪問pod了 No resources found.原理介紹 jwt原理
https://fist.sealyun.cluster.local:8080 k8s jwt server | /.well-known/openid-configuration | |------------------------------------------------>| k8s通過此url發現一些信息,最重要的就是用于校驗token公鑰的地址 | discover info | |<------------------------------------------------| | /keys | |------------------------------------------------>| 上一步拿到地址,這一步獲取到公鑰 | public keys | |<------------------------------------------------| | |
discoer info 是個json:
{ "issuer": "https://accounts.google.com", "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth", "token_endpoint": "https://oauth2.googleapis.com/token", "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo", "revocation_endpoint": "https://oauth2.googleapis.com/revoke", "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs", "response_types_supported": [ "code", "token", "id_token", "code token", "code id_token", "token id_token", "code token id_token", "none" ], ...
public keys也是個json 類似:
{ "keys": [ { "e": "AQAB", "kty": "RSA", "alg": "RS256", "n": "3MdFK4pXPvehMipDL_COfqn6o9soHgSaq_V1o8U_5gTZ-j9DxO9PV7BVncXBgHFctnp3JQ1QTDF7txeHeuLOS4KziRw5r4ohaj2WoOTqXh7lqVMR2YDAcBK46asS177NpkQ1CqHIsy3kNfqhXLwTaKfdlwdA_XUfRbKORWbq0kDxV35egx35nHl5qJ6aP6fcpsnnPvHf7KWO0zkdvwuR-IX79HjqUAEg5UERd5FK4y06PRbxuXHjAgVhHu_sk4reNXNp1HRuTYtQ26DFbVaIjsWb8-nQC8-7FkTjlw9FteAwLVGOm9sTLFp73jAf0pWLh7sJ02pBxZKjsxLO1Lvg7w", "use": "sig", "kid": "7c309e3a1c1999cb0404ab7125ee40b7cdbcaf7d" }, { "alg": "RS256", "n": "2K7epoJWl_B68lRUi1txaa0kEuIK4WHiHpi1yC4kPyu48d046yLlrwuvbQMbog2YTOZdVoG1D4zlWKHuVY00O80U1ocFmBl3fKVrUMakvHru0C0mAcEUQo7ItyEX7rpOVYtxlrVk6G8PY4EK61EB-Xe35P0zb2AMZn7Tvm9-tLcccqYlrYBO4SWOwd5uBSqc_WcNJXgnQ-9sYEZ0JUMhKZelEMrpX72hslmduiz-LMsXCnbS7jDGcUuSjHXVLM9tb1SQynx5Xz9xyGeN4rQLnFIKvgwpiqnvLpbMo6grhJwrz67d1X6MwpKtAcqZ2V2v4rQsjbblNH7GzF8ZsfOaqw", "use": "sig", "kid": "7d680d8c70d44e947133cbd499ebc1a61c3d5abc", "e": "AQAB", "kty": "RSA" } ] }
所以fist只需要實現這兩個url 和 用私鑰匙加密用戶信息生成token即可。
創建密鑰對:
key, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { log.Fatalf("gen rsa key: %v", err) } priv = jose.JSONWebKey{ Key: key, KeyID: "Cgc4OTEyNTU3EgZnaXRodWI", Algorithm: "RS256", Use: "sig", } pub = jose.JSONWebKey{ Key: key.Public(), KeyID: "Cgc4OTEyNTU3EgZnaXRodWI", Algorithm: "RS256", Use: "sig", }
私鑰加密:
tok := idTokenClaims{ Issuer: "https://dex.example.com:8080", Subject: "Cgc4OTEyNTU3EgZnaXRodWI", Audience: "example-app", Expiry: time.Now().Add(time.Hour * 100).Unix(), IssuedAt: time.Now().Unix(), Email: "fhtjob@hotmail.com", EmailVerified: &ev, Groups: []string{"dev"}, Name: "fanux", } payload, err := json.Marshal(&tok) if err != nil { return } var idToken string if idToken, err = signPayload(&Priv, signingAlg, payload); err != nil { return總結
fist核心代碼已經可用,不過為了更方便使用還需要進一步梳理,敬請期待。 鑒權僅是其其中一個功能,fist定位是一個極簡的k8s管理平臺。
探討可加QQ群:98488045
公眾號:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27701.html
摘要:去中心化應用程序的常見設計不僅依賴于以太坊區塊鏈,還依賴于層。每個用戶的所有登錄操作在以太坊區塊鏈上變得不可公開。用于驗證用戶身份的機制與以太坊用于保證以太坊區塊鏈安全性的機制相同。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 去中心化應用程序(DApp)的常見設計不僅依賴于以太坊區塊鏈,還依賴于API層。在這種情況下,DApp通過用戶的以太坊帳戶與智能合約進行交互,并通過...
摘要:的安全性不好,攻擊者可以通過獲取本地進行欺騙或者利用進行攻擊。 好久沒寫博客了,因為最近公司要求我學spring cloud ,早點將以前軟件遷移到新的架構上。所以我那個拼命的學吶,總是圖快,很多關鍵的筆記沒有做好記錄,現在又遺忘了很多關鍵的技術點,極其罪惡! 現在想一想,還是踏踏實實的走比較好。這不,今天我冒了個泡,來補一補前面我所學所忘的知識點。 想要解鎖更多新姿勢?請訪問我的博客...
摘要:此信息可以通過數字簽名進行驗證和信任。用途授權和安全傳輸信息的結構通常由兩部分組成令牌的類型,即,以及正在使用的散列算法,例如或。加密的數據簽名應用知道了的用途后,我們就開始針對授權來結合做簡單的實現。 JWT簡介 官方是這樣介紹的: JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact a...
摘要:頭部需要一個頭部,用于描述關于該的最基本的信息,例如其類型以及簽名所用的算法等。簽發者需要準備一個可以確認自己身份的字符串,這個字符串我們稱之為。 什么是 jwt ? JWT 全稱叫 JSON Web Token, 是一個非常輕巧的規范。這個規范允許我們使用 JWT 在用戶和服務器之間傳遞安全可靠的信息。 jwt 使用場景 jwt 用圖廣泛,例如授權、鑒權等。具體一點的話,假如我們有一...
閱讀 3453·2019-08-30 15:44
閱讀 798·2019-08-30 13:46
閱讀 2058·2019-08-30 11:05
閱讀 3332·2019-08-29 18:32
閱讀 2155·2019-08-29 13:56
閱讀 1296·2019-08-29 12:57
閱讀 757·2019-08-28 18:21
閱讀 1734·2019-08-26 12:16