认证机制

API Server认证流程:用户请求认证授权准入控制

(1)用户

1)用户分为:UserAccount(管理员使用)、ServiceAccount**(**Pod使用)

2)UserAccount和ServiceAccout均属于一个或多个组;

3)Kubernetes集群中有以下默认组:

组名说明
system:unauthenticated用于所有认证插件 都不会认证用户身份的请求
system:authenticated自动分配一个成功通过认证的用户
system:serviceaccounts包含系统中所有的ServiceAccount
system:serviceaccounts:命名空间包含指定命名空间中 所有的ServiceAccount

//Kubernetes集群中并不存在真实的用户


(2)认证

1)作用:通过一个或多个认证插件以确定用户身份;

2)认证插件会返回用户名、用户ID和用户所在组的信息;

3)常用的认证方式如下:

认证方式说明
token通过共享密钥
TLS通过API Server和用户做双向证书认证
HTTP通过基础的HTTP连接认证

//若存在多个认证插件,用户只需通过其中一个即可进入授权阶段

//默认在~/.kube/config保存用户访问API Server的密钥相关信息,当kubectl访问API Server时,会自动读取该文件以完成API Server认证


(3)授权

1)作用:通过一个或多个授权插件确定用户的可执行权限;

2)授权插件主要使用RBAC(默认无任何权限);

3)授权时可使用以下授权词:

授权词说明
get列出单个资源
list列出资源类型的集合
create创建
update修改全部资源
patch修改部分资源
watch动态监控
proxy代理
redirect重定向
use调用
delete删除
deletecollection级联删除

//若存在多个授权插件,用户只需通过其中一个即可进入准入控制阶段

//RBAC只能允许授权,不能拒绝授权


(4)准入控制

1)作用:验证创建、修改和删资源的请求(指定可操作资源对象);


如:API Server认证流程
在这里插入图片描述


Kubernetes集群中接收到任意的API请求,在其内部都被转换成URL请求路径

1)操作Kubernetes中的资源时,本质是在对URL进行CURD操作;

2)授权的权限可应用于URL路径资源和non-resource URL路径资源;

//API Server对外暴露的URL路径并不一定映射到对应的资源

ServiceAccount

ServiceAccount(SA):为Kuberntes集群中的Pod提供身份

1)ServiceAccount属于Kubernetes的一种资源类型;

2)每个命名空间在创建时,会创建一个默认的ServiceAccount;

3)每个命名空间中可创建无限多个ServiceAccount;



每个Pod都会与一个SA相绑定

1)两者需在同一个命名空间;

2)SA可绑定多个Pod,但单个Pod仅能绑定一个SA;

3)可将不同的SA与Pod绑定,以实现控制Pod的可访问资源权限;


如:Pod和SA的关系
在这里插入图片描述


Pod通过SA和API Server通信的流程:

1)Pod与一个SA绑定(身份证明);

2)认证插件对Pod容器中存储SA认证的token进行认证;

3)认证通过后,认证插件将SA用户名传递给API Server;

//token默认存储位:/var/run/secrets/kubernetes.io/serviceaccount/token

//默认返回格式:system:serviceaccount:命名空间:SA用户名

创建ServiceAccount

ServiceAccount的创建方式分为:create命令和YAML文件

1)使用YAML文件创建SA较为麻烦,一般使用create命令创建;

//或者使用create命令重定向生成YAML文件,再通过YAML文件创建


(1)create命令创建ConfigMap格式:

kubectl create serviceaccount SA名

1)若强制Pod仅可挂载SA中指定的密钥,则需加上该选项:

kubernetes.io/enforce-mountable-secrets=“true”


如:通过create命令创建SA,并查看其详细信息
在这里插入图片描述
//SA中使用身份认证的token是JWT token

(2)将创建后的SA与Pod绑定:

1)Pod的YAML文件中的spec字段下的serviceAccountName指定,格式如下:

spec:
  serviceAccountName:SA名

2)必须在Pod创建时与SA绑定(Pod创建后,不能修改其绑定的SA);

RBAC

RBAC(Role-Based Access Control):基于角色的访问控制

1)原理:用户通过成为角色(Role)而得到这些角色所具有的权限

2)RBAC默认阻止未授权用户查看和修改集群状态;

//默认创建的SA不可查看和修改集群状态

//Kubernetes1.8.0版本后RBAC插件升级为GA(通用可用性),且默认开启



Kubernetes集群通过4种资源类型实现RBAC:

资源类型名作用
Role(角色)配置在指定资源的权限
ClusterRole(集群角色)
RoleBinding(角色绑定)将角色和用户、SA或组绑定
ClusterRoleBinding(集群角色绑定)

1)Role和RoleBinding属于命名空间级别的资源;

2)ClusterRole和ClusterRoleBinding属于集群级别的资源;


如:通过RBAC实现的对指定资源的操作权限控制
在这里插入图片描述

Role/RoleBinding

Role的创建方式分为:create命令和YAML文件

1)普通Role不可对集群级别的资源和非自愿类型的URL进行授权;


(1)通过YAML文件创建Role的格式:

apiVersion:  rbac.authorization.k8s.io/v1
kind:  Role
metadata:
  namespace:  所属命名空间
  name:  Role 名
rules:
 - apiGroups:  [“组名”]
   resources:  [“资源类型”]
   verbs:  [“授权词1”, “授权词N”]

1)若省略命名空间,则默认在当前命名空间中建立;

2)资源类型必须是复数形式(资源类型名后加s);


如:创建Role,其名为service-reader

1)编写YAML文件;
在这里插入图片描述
2)创建Role;
在这里插入图片描述

(2)通过create命令创建Role的格式:

kubectl create role Role名 --verb=授权词1,授权词N --resource=资源类型 -n
所属命名空间

RoleBinding的创建方式分为:create命令和YAML文件

1)使用YAML文件创建较为麻烦,一般使用create命令创建;

//或者使用create命令重定向生成YAML文件,再通过YAML文件创建



(1)通过create命令创建RoleBinding:

kubectl create rolebinding RoleBinding名 --role=绑定的Role serviceaccount=被绑定的SA -n 命名空间

1)若指定其所属用户,可通过选项:–user

2)若指定其所属组,可通过选项:–group

3)可绑定其他命名空间的SA,实现该Role下的Pod可访问其他命名空间;


如:通过create 命令创建RoleBinding
在这里插入图片描述


如:续上,将Role和RoleBinding绑定后实现的访问
在这里插入图片描述


如:RoleBinding绑定其他命名空间的SA实现Pod跨命名空间访问资源
在这里插入图片描述

ClusterRole/ClusterRoleBinding

ClusterRole的创建方式分为:create命令和YAML文件

1)集群Role可对集群级别的资源和非自愿类型的URL进行授权;

2)集群Role也可作为单个命名空间内部绑定的公共Role;


(1)通过YAML文件创建ClusterRole的格式:

apiVersion:  rbac.authorization.k8s.io/v1
kind:  ClusterRole
metadata:
  namespace:  所属命名空间
  name:  Role 名
rules:
 - apiGroups:  [“组名”]
   resources:  [“资源类型”]
   verbs:  [“授权词1”, “授权词N”]

1)若省略命名空间,则默认在当前命名空间中建立;

2)资源类型必须是复数形式(资源类型名后加s);


(2)通过create命令创建ClusterRole的格式:

kubectl create clusterrole ClusterRole名 --verb=授权词1,授权词N --resource=资源类型 -n 所属命名空间

ClusterRoleBinding的创建方式分为:create命令和YAML文件

1)使用YAML文件创建较为麻烦,一般使用create命令创建;

//或者使用create命令重定向生成YAML文件,再通过YAML文件创建



(1)通过create命令创建ClusterRoleBinding:

kubectl create clusterrolebinding ClusterRoleBinding名 --clusterrole=绑定的Role serviceaccount=被绑定的SA -n 命名空间

1)若指定其所属用户,可通过选项:–user

2)若指定其所属组,可通过选项:–group

3)可绑定其他命名空间的SA,实现该Role下的Pod可访问其他命名空间;


如:通过创建ClusterRole/ClusterRoleBinding实现对集群中任意资源的访问
在这里插入图片描述


4种资源类型的不同组合方式可实现对不同资源的访问控制:

角色类型绑定类型可访问资源
RoleRoleBinding可访问Role所在命名空间的资源
ClusterRoleRoleBinding可访问RoleBinding所在命名空间的资源
ClusterRoleClusterRoleBinding可访问集群级别的、非资源类型URL的和任意命名空间中的资源

1)Role和ClusterRoleBinding绑定无实际意义

2)通过ClusterRole和RoleBinding的绑定可实现多个角色公用一个绑定;


如:Role、RoleBinding、ClusterRole和ClusterRoleBinding属于不同级别的资源
在这里插入图片描述

默认ClusterRole/ClusterRoleBinding

API Server默认创建ClusterRole/ClusterRoleBinding以实现集群控制面管理

1)由API Server创建的,大部分前缀为“system:”

2)所有默认创建都有标签“kubernetes.io/bootstrapping=rbac-defaults”



(1)默认集群级别的ClusterRole/ClusterRoleBinding

默认ClusterRole默认ClusterRoleBinding说明
system:basic-usersystem:authenticated允许用户以只读方式访问基本信息
system:discoverysystem:authenticated允许以只读方式访问API发现端点
system:public-info-viewersystem:authenticated system:unauthenticated允许以只读方式访问集群非敏感信息

(2)默认用户级别的ClusterRole/ClusterRoleBinding

默认ClusterRole默认ClusterRoleBinding说明
cluster-adminsystem:masters拥有超级管理员权限
admin拥有管理员权限
edit可对命名空间中的大部分资源进行读写操作(不可修改Role和RoleBinding)
view可对命名空间中大部分资源进行读操作(不允许查看Role和RoleBinding)

1)cluster-admin:Kubernetes集群中超级管理员用户,可操作集群中任意资源;

2)管理员权限:在对应RoleBinding所在的命名空间中对大部分资源拥有读写操作权限(包括Role和RoleBinding)


(3)集群的主要组件相关的ClusterRole/ClusterRoleBinding

默认ClusterRole默认ClusterRoleBinding说明
system:kube-schedulersystem:kube-scheduler允许访问 scheduler组件 所需的资源
system:volume-schedulersystem:kube-scheduler允许访问 kube-scheduler组件所需的卷资源
system:kube-controller-managersystem:kube-controller-manager允许访问 Controller组件 所需的资源
system:node允许访问 kubelet组件 所需的资源
system:node-proxiersystem:kube-proxy允许访问 kube-proxy组件 所需的资源

(4)附加组件相关的ClusterRole/ClusterRoleBinding

默认ClusterRole默认ClusterRoleBinding说明
system:auth-delegator允许将认证和授权操作外包出去
system:kube-aggregator为kube-aggregator组件定义的Role
system:kube-dns为kube-dns组件定义的Role
system:kubelet-api-admin允许kubelet API的完全访问权限
system:node-bootstrapper允许访问执行kubelet TLS启动引导所需的资源
system:node-problem-detector为node-problem-detector组件定义的Role
system:persistent-volume-provisioner允许访问大部分动态卷驱动所需资源
system:monitoringsystem:monitoring允许对控制平面短短的读操作
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐