K8S的API Server认证介绍

一.说明

kube-apiserver是k8s最重要的制组件之一,主要提供以下功能:

  • 提供集群管理的REST API 接口, 包括认证授权、数据校验以及集群状态变更等
  • k8s 中所有模块与 etcd 的数据交互都需要走 API Server ,禁止直接和 etcd 通信
    k8s API 的每个请求都需要经过多阶段的访问控制后才会被接受,包括认证、授权以及准入控制等。

二.认证插件

k8s的请求有两种模式:

  • 非安全模式(insecure-port):该模式下所有请求都不会经过认证,不建议开启。
  • 安全模式(secure-port):该模式下开启TLS时,所有请求都需要经过认证。k8s 支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可)。如果认证成功,则用户的username 会传入授权模块进一步授权验证;对于失败认证将返回401状态码。

2.1 x509 证书

这里就是常说的ca证书, 需要在 API Server 启动时配置 --client-ca-file=xxx

2.2 静态 Token 文件

这里需要在 API Server 启动时配置 --token-auth-file=xxx。该文件为CSV文件,每行至少包括三列 token, username, user id。

2.3 引导token

  • 为了支持平滑的启动引导新的集群,k8s 包含了一种动态管理持有者令牌类型,称作启动引导令牌(Bootstrap Token)。
  • 这些令牌以 Secret 的形式保存在 kube-system 命名空间中,可以被动态管理和创建。
  • 控制器管理器包含的 TokenCleaner 控制器能够在启动引导令牌过期时将其删除。
  • 在使用 kubeadm 部署 k8s 时,可通过 kubeadm token list 命令查询。

2.4 basic auth(静态密码)

这里需要在 API Server 启动时配置 --basic-auth-file=xxx, 文件格式为 csv,每行至少三列 password, user, uid

2.5 ServiceAccount

sa(ServiceAccount) 是 k8s 比较常见的一种认证方式,每一个命名空间在创建的时候都会有一个默认的 sa, 每个 sa 都包含对应的 token

2.6 Webhook 令牌身份认证

  • --authentication-token-webhook-config-file 指向一个配置文件,描述如何访问远程的 webhook 服务。
  • --authentication-token-webhook-cache-ttl 用来设定身份认证决定的缓存时间。默认时长为 2 分钟。

鉴权

k8s 支持多种授权机制,并支持同时开启多个授权插件(只要有一个验证通过即可)。如果鉴权成功的请求将被发送到准入模块做进一步的请求验证;鉴权失败的请求则返回403。

鉴权对象

  • 用户信息:user, group, extra
  • API、请求方法(get, post 等)和请求路径(如/api)
  • 请求资源和子资源
  • Namespace
  • API Group

鉴权插件

  • ABAC
  • RBAC
  • Webhook
  • Node
    RABC(基于角色的权限控制),是目前比较流行的鉴权方式,可以将权限和角色绑定,然后将角色分配给用户,这样用户就可以自己进行授权。

RBAC使用

k8s 中的 RBAC 主要包括两种大类型,一种是基于集群的,权限将作用于整个集群的 Namespaces; 另一种是基于 Namespace 的,权限将作用于当前 Namespace

  • Role 只能作用于单个ns, ClusterRole 可以作用于多个 ns 和集群级的资源

  • 角色绑定(Role Binding)是将角色中定义的权限赋予一个或者一组鉴权对象,该鉴权对象可以是用户,组,或者 ServiceAccount

    示例:将 “pod-reader” 角色与 “default” namespace 绑定 ,并将该权限授予给"jane"

apiVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
# You can specify more than one "subject"
- kind: User
  name: jane # "name" is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # "roleRef" specifies the binding to a Role / ClusterRole
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
  • ClusterRoleBinding 是对整个集群的授权
    示例:授权 “manager” group 组下的所有用户对集群所有 ns 的 secret-reader 权限:
apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
  • 当对组进行授权的时候,subjects name 有规定的前缀写法:需要注意的是我们在定义对象名称的时候要避免和 k8s 内置的 name 冲突
# 对 qa ns 下的所有 sa 进行授权
subjects:
- kind: Group
  name: system:serviceaccounts:qa
  apiGroup: rbac.authorization.k8s.io
# 对所有 ns 下的 sa 进行授权
subjects:
- kind: Group
  name: system:serviceaccounts
  apiGroup: rbac.authorization.k8s.io
# 对所有认证的用户进行授权
subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io
# 对所有未认证的用户进行授权
subjects:
- kind: Group
  name: system:unauthenticated
  apiGroup: rbac.authorization.k8s.io
# 对所有的用户进行授权
subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io
- kind: Group
  name: system:unauthenticated
  apiGroup: rbac.authorization.k8s.io

授权实践

可以先看下集群默认管理员角色的权限:

[admin@root ~]$ kubectl get clusterrole cluster-admin -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2022-11-15T05:29:14Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "72"
  uid: 9b2bce8b-ef75-4714-a65f-72276e7c480e
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

将角色与就需要将该角色与上边创建的已认证用户 itnoobzzy 进行绑定

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: default-admin
  namespace: default
subjects:
  - kind: User
    # 配置用户
    name: itnoobzzy		
    apiGroup: rbac.authorization.k8s.io
#  - kind: ServiceAccount
#    name: default
#    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

参考链接:https://blog.csdn.net/qq_42586468/article/details/128983739

posted @ 2023-05-08 23:37  yuhaohao  阅读(157)  评论(0编辑  收藏  举报