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的生成方式有很多,主要分成三种: 1. service account token 这个创建service account就有,存在secret里 获取比较简单,但是要区分好 User 和 service account区别 2. 普通的token,这种token就是个普通的字符串,一般是自己写一个认证的web hook, k8s认证时调用这个hook 查询token是否有效,比较low 3. 基于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:

结束,多简单,别整那么多没用的。

所以为了实现上面的功能,我们开发了 fist, fist的auth模块把dex里最核心的token生成功能以及jwt功能实现了。

生成证书

# 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

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.

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管理平台。

kube获得token_kubernetes用户使用token安全认证教程相关推荐

  1. kubernetes用户使用token安全认证教程

    kubernetes server account的token很容易获取,但是User的token非常麻烦,本文给出一个极简的User token生成方式,让用户可以一个http请求就能获取到. to ...

  2. 快速理解 session/token/cookie 认证方式

    #目录 文章目录 #cookie Web Application 一般以 HTTP 协议作为传输协议, 但 HTTP 协议是无状态的. 也就是说 server-side 与 client-side 一 ...

  3. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  4. 使用 AngularJS NodeJS 实现基于token 的认证应用(转)

    认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构 ...

  5. JWT-基于token的认证方式

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  6. 使用 做签名的post_ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebServ ...

  7. JWT(Json web token)认证详解

    JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...

  8. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...

  9. 【java】基于JWT的token身份认证方案

    1.概述 转载:基于JWT的token身份认证方案 2.使用JSON Web Token的好处 2.1 性能问题 验证信息可以由前端保存,后端不需要为保存token消耗内存.JWT方式将用户状态分散到 ...

最新文章

  1. ***检测与防护(IDS/IPS)
  2. 开发检测MySQL主从同步插件
  3. Linux文件系统属性权限chattr与lsattr命令
  4. 【VMware虚拟化解决方案】VMware VSphere 5.1配置篇
  5. 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
  6. transformer xl在文本生成上面的应用
  7. 李想当年是被赶出汽车之家?真相了...
  8. Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存
  9. php点击按钮变文字,点击按钮文字变成input框,点击保存变成文字的实现代码
  10. 如何正确获取安卓内置SD卡的路径
  11. PHP多国语言开发:CodeIgniter 2PHP框架中的多国语言,语言包(i18n)库
  12. 故障分析 | 使用--force批量导入数据导致部分数据丢失的问题
  13. JAVA储存_关于JAVA数据储存
  14. quasar使用keep alive警告 Component inside <Transition> renders non-element root node
  15. vue-fullcalendar 日历插件
  16. 文章翻译:Recommending items to more than a billion people(面向十亿级用户的推荐系统)...
  17. 案例|全球蛙,如何从山西“跳”到全国?
  18. 随机过程 更新过程(下)
  19. RTKLIB 2.4.2(p12)与RTKLIB 2.4.3(b34)功能对比分析---RTKLIB学习系列文章(一)
  20. 数据可视化——子图的绘制及坐标轴共享

热门文章

  1. ios 更新尺寸调用什么方法_iOS开发经验总结(上)
  2. RHCSA8.0模拟题
  3. 【阿里云在线编程】 53.Tom跳方格
  4. 2022年全球与中国合金电阻市场现状及未来发展趋势
  5. js前端json格式化排版
  6. android 中的设计模式
  7. 如何设计微博点赞功能数据库?
  8. 整合JavaWeb面试过程中相关问题
  9. Github优秀的开源框架介绍
  10. 话题 | 情侣出去旅游怎么住房?