kubernetes 认证:用户管理与身份认证(Authenticating)

Tags: kubernetes 

目录

说明

kubernetes 自身支持的用户管理以及认证功能相当薄弱,支持的 x509 client certs、static token file、service account token 的使用场景和使用方式非常有限, 通常只用于内部组件的认证,不足以支撑常规的账号管理场景。要实现灵活复杂的用户管理/认证功能,需要通过 kubernetes 提供的扩展能力对接到外部系统。

资料:

kubernetes 账号模型

kubernetes 识别的账号需要包含以下信息:

  • Username: 用户名
  • UID: 用户ID
  • Groups: 用户所在的用户组,字符串列表支持多个组
  • Extra Fields:其它动态属性,map 结构

对接的外部认证系统至少要能够向 kubernetes 提供上述 4 项账号信息。

kubernetes 内置账号功能

内置账号功能通常只用于 kubernetes 自身组件(有限用户)的认证。

X509 Client Certs

用户请求 apiserver 的时候通过证书认证,apiserver 从认证证书中解析出用户名,证书中的 common name/CN 是用户名,Organization/O 是用户所在的组。用户证书需要用 kubernetes apiserver 指定的 CA 签署。0

签署一个用户名为 jbeda,隶属 app1 和 app2 两个组的用户证书:

openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2"

用户证书不包含 UID 以及 Extra Fields 等信息,它通常用于构成 kubernets 的组件的认证,比如 kubelet。

Static Token File

kubernetes apiserver 支持通过 --token-auth-file= 传入用文本描述 token 账号,格式如下:

token,user,uid,"group1,group2,group3"

APIserver 通过 bearer tokens 匹配得到当前用户的信息。

Bootstrap Tokens

bootstrap 是 kubernetes 自动维护的一个 bear token(需要 apiserver 启动时指定启用),kubernestes 自动将过期的 token 作废并生成新的 bear token。bootstrap token 样式如下:

Authorization: Bearer 781292.db7bc3a58fc5f07e

bootstrap token 会被识别为用户 system:bootstrap:<Token ID>,隶属于用户组 system:bootstrappers

Service Account Tokens

ServiceAccount 是 kubernetes 内置的一种资源类型,隶属于某一 namespace。ServiceAccount 可以挂载到 pod 中,用于 pod 内程序和 apiserver 间的认证。ServiceAccount 的内容如果泄漏到集群外,也可以在集群外使用。 通过 ServiceAccount 认证,用户名识别为 system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT),隶属于用户组 system:serviceaccountssystem:serviceaccounts:(NAMESPACE)

kubernetes 对接外部账号系统

OpenID Connect Tokens

apiserver 启动时指定外部的 Identity Provider。用户向 apiserver 请求时,先从 Identity Provider 获取到 token,然后带着 token 访问 apiserver。 apiserver 通过指定的 Identity Provider 验证 token,解析账号信息。

Webhook Token Authentication

apiserver 收到请求后回调启动配置的 webhook,向 webhook 传入 TokenReview,webhook 向其返回包含 Status 的 TokenReview。

apiserver 向 webhook 传入的 TokenReview:

{
  "apiVersion": "authentication.k8s.io/v1",
  "kind": "TokenReview",
  "spec": {
    # Opaque bearer token sent to the API server
    "token": "014fbff9a07c...",
   
    # Optional list of the audience identifiers for the server the token was presented to.
    # Audience-aware token authenticators (for example, OIDC token authenticators) 
    # should verify the token was intended for at least one of the audiences in this list,
    # and return the intersection of this list and the valid audiences for the token in the response status.
    # This ensures the token is valid to authenticate to the server it was presented to.
    # If no audiences are provided, the token should be validated to authenticate to the Kubernetes API server.
    "audiences": ["https://myserver.example.com", "https://myserver.internal.example.com"]
  }
}

webhook 向 apiserver 返回的 TokenReview:

{
  "apiVersion": "authentication.k8s.io/v1",
  "kind": "TokenReview",
  "status": {
    "authenticated": true,
    "user": {
      # Required
      "username": "[email protected]",
      # Optional
      "uid": "42",
      # Optional group memberships
      "groups": ["developers", "qa"],
      # Optional additional information provided by the authenticator.
      # This should not contain confidential data, as it can be recorded in logs
      # or API objects, and is made available to admission webhooks.
      "extra": {
        "extrafield1": [
          "extravalue1",
          "extravalue2"
        ]
      }
    },
    # Optional list audience-aware token authenticators can return,
    # containing the audiences from the `spec.audiences` list for which the provided token was valid.
    # If this is omitted, the token is considered to be valid to authenticate to the Kubernetes API server.
    "audiences": ["https://myserver.example.com"]
  }
}

Authenticating Proxy

这里的 proxy 是在 kubernetes 的 apiserver 之前架设 proxy。proxy 完成用户认证后,将用户的账号信息附加到 header 中转发给 kubernetes apiserver。 kubernetes apiserver 启动指定用于来解读账号信息的 header 名称。

--requestheader-username-headers=X-Remote-User
--requestheader-group-headers=X-Remote-Group
--requestheader-extra-headers-prefix=X-Remote-Extra-

参考

  1. 李佶澳的博客
  2. Authenticating

kubernetes

  1. kubernetes 使用:多可用区、Pod 部署拓扑与 Topology Aware Routing
  2. kubernetes 扩展:Cloud Controller Manager
  3. kubernetes 准入:操作合法性检查(Admission Control)
  4. kubernetes 鉴权:用户操作权限鉴定(Authorization)
  5. kubernetes 认证:用户管理与身份认证(Authenticating)
  6. kubernetes 开发:代码生成工具
  7. kubernetes 扩展:operator 开发
  8. kubernetes 扩展:CRD 的使用方法
  9. kubernetes configmap 热加载,inotifywatch 监测文件触发热更新
  10. kubernetes 扩展:扩展点和方法(api/cr/plugin...)
  11. kubernetes 调度组件 kube-scheduler 1.16.3 源代码阅读指引
  12. kubernetes 代码中的 k8s.io 是怎么回事?
  13. 阅读笔记《不一样的 双11 技术,阿里巴巴经济体云原生实践》
  14. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  15. ingress-nginx 的限速功能在 nginx.conf 中的对应配置
  16. kubernetes 中的容器设置透明代理,自动在 HTTP 请求头中注入 Pod 信息
  17. kubernetes ingress-nginx 的测试代码(单元测试+e2e测试)
  18. kubernetes ingress-nginx http 请求复制功能与 nginx mirror 的行为差异
  19. kubernetes 基于 openresty 的 ingress-nginx 的状态和配置查询
  20. kubernetes ingress-nginx 0.25 源代码走读笔记
  21. kubernetes ingress-nginx 的金丝雀(canary)/灰度发布功能的使用方法
  22. kubernetes 操作命令 kubectl 在 shell 中的自动补全配置
  23. kubernetes 组件 kube-proxy 的 IPVS 功能的使用
  24. kubernetes initializer 功能的使用方法: 在 Pod 等 Resource 落地前进行修改
  25. kubernetes 版本特性: 新特性支持版本和组件兼容版本
  26. kubernetes API 与 Operator: 不为人知的开发者战争(完整篇)
  27. kubernetes 1.12 从零开始(七): kubernetes开发资源
  28. kubernetes 1.12 从零开始(六): 从代码编译到自动部署
  29. kubernetes 网络方案 Flannel 的学习笔记
  30. kubernetes 1.12 从零开始(五): 自己动手部署 kubernetes
  31. kubernetes 1.12 从零开始(四): 必须先讲一下基本概念
  32. kubernetes 1.12 从零开始(三): 用 kubeadm 部署多节点集群
  33. kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境
  34. kubernetes 1.12 从零开始(一): 部署环境准备
  35. kubernetes 1.12 从零开始(零): 遇到的问题与解决方法
  36. kubernetes 1.12 从零开始(初): 课程介绍与官方文档汇总
  37. kubernetes 集群状态监控:通过 grafana 和 prometheus
  38. 一些比较有意思的Kubernetes周边产品
  39. Borg论文阅读笔记
  40. kubelet下载pod镜像时,docker口令文件的查找顺序
  41. kubernetes 的 Client Libraries 的使用
  42. kubernetes的网络隔离networkpolicy
  43. kube-router的源码走读
  44. kubernetes 跨网段通信: 通过 calico 的 ipip 模式
  45. kubernetes的调试方法
  46. kubernetes 与 calico 的衔接过程
  47. 怎样理解 kubernetes 以及微服务?
  48. kubernetes中部署有状态的复杂分布式系统
  49. kubernetes的apiserver的启动过程
  50. kubernetes的api定义与装载
  51. kubernetes的federation部署,跨区Service
  52. kubernetes的编译、打包、发布
  53. kubernetes的第三方包的使用
  54. kubernetes的Storage的实现
  55. kubernetes 的 Apiserver 的 storage 使用
  56. kubernetes的Controller-manager的工作过程
  57. kubernetes的Client端Cache
  58. kubernetes 的 Apiserver 的工作过程
  59. kubernetes的CNI插件初始化与Pod网络设置
  60. kubernetes的Pod变更过程
  61. kubernetes的kubelet的工作过程
  62. kuberntes 的 Cmdline 实现
  63. kubernetes的Pod内挂载的Service Account的使用方法
  64. kubernetes的社区资源与项目参与方式
  65. kubernetes的Kube-proxy的转发规则分析
  66. kubernetes的基本操作
  67. kubernetes在CentOS上的集群部署
  68. kubernetes在CentOS上的All In One部署
  69. 怎样选择集群管理系统?

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球