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