【项目实战24】k8s(10)—k8s访问控制(API Server认证和RBAC授权)

一级目录

二级目录

三级目录

一、API访问控制的基本概念

(1)、基本过程

kubernetes API 访问控制过程:认证、授权、准入控制
在这里插入图片描述
在这里插入图片描述

(1)、Authentication(认证)

1、认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。
2、Kubernetes集群有两类用户:由Kubernetes管理的ServiceAccounts(服务账户)和(UsersAccounts) 普通账户。k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。

(2)、Authorization(授权)

必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC。

(3)、AdmissionControl(准入控制)

用于拦截请求的一种方式,运行在认证、授权之后,是权限认证链上的最后一环,对请求API资源对象进行修改和校验。

(2)、访问k8s的APIServer的两类客户端

kubectl :用户家目录中的 .kube/config里面保存了客户端访问APIServer的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。
pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。

以上两种api的区别是:
api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
apis 它是一般API访问的入口固定格式名。
1、API配置文件为/etc/kubernetes/manifests/kube-apiserver.yaml,变更该文件后k8s会自动重载pod
在这里插入图片描述
2、kubectl向apiserver发起的命令,采用的是http方式,其实就是对URL发起增删改查的操作,发起命令后,可以使用以下两种API调用方式进行查看,这两种api的区别是api只能调用v1版本的API,只有在核心v1群组中的对象才能使用,而apis都可以使用,是一般API访问的入口固定格式名
在这里插入图片描述

在这里插入图片描述

二、API Server认证

UserAccount与serviceaccount:

用户账户是针对人而言的。 服务账户是针对运行在 pod 中的进程而言的。
用户账户是全局性的。 其名称在集群各namespace 中都是全局唯一的,未来的用户资源不会做namespace 隔离,服务账户是namespace 隔离的。
通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 ( 即权限最小化原则 )。

(1)、ServiceAccount(SA)

1、确认server1上私有仓库habbor开启
在这里插入图片描述
2、查看默认命名空间内的serviceaccount,创建一个SA账户(admin)。
创建SA时,会由SA控制器负责创建(SA用在pod内),查看新建SA的描述信息,此时k8s为用户自动生成认证信息,但没有授权,该账户还未绑定创建pod时拉取仓库镜像的secrets
在这里插入图片描述
3、创建一个secret名字叫myregistrykey,通过命令参数指定仓库名字、用户名和密码。查看secret信息,可以看到新创建的myregistrykey
在这里插入图片描述
4、添加该secrets到创建的SA中
在这里插入图片描述
5、编辑之前配置的生成Pod的yaml文件,注释在Pod中指定imagePullSecrets的语句,把添加了imagePullSecrets认证信息的SA和pod绑定起来(将拉取仓库镜像的key直接写入资源清单不安全,可以将key加入SA中,但需要在部署应用的资源清单文件中指定相捆绑的SA账户,如果不指定则默认为每个命名空间的default账户)

[root@server2 secrets] kubectl apply -f registry.yaml 
pod/mypod created
[root@server2 secrets] cat registry.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: game2048
      image: reg.westos.org/westos/game2048
  serviceAccountName: admin
  #imagePullSecrets:
    #- name: myregistrykey 

7、查看这一pod的描述信息可以看到创建Pod时,在拉取镜像过程中,Pod自身去连接API Server时是通过我们所指定的SA账户进行认证的
在这里插入图片描述

(2)、UserAccount(UA)

1、切换到k8s集群的证书存放目录
在这里插入图片描述
2、生成密钥key,这一密钥不能直接在集群中使用,需要先生成csr证书请求,利用证书请求生成密钥对应的证书

[root@server2 pki] openssl genrsa -out test.key 2048
[root@server2 pki] openssl req -new -key test.key -out test.csr -subj "/CN=test"
[root@server2 pki] openssl x509 -req -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out test.crt -days 365

3、利用生成的密钥、证书,为test用户项开启证书验证并设置证书文件路径,查看当前节点的kubeconfig配置信息可以看到设置成功
在这里插入图片描述
4、设置访问集群环境上下文信息:访问k8s集群,访问用户为test,设置完成后切换test用户访问集群,查看当前节点的kubeconfig配置信息可以看到当前用户为test
在这里插入图片描述
5、此时test用户通过认证,但还没有权限操作集群资源,如无法查看集群中的命名空间,需要继续添加授权,注意在对test用户授权时需要切换回集群管理员用户进行相应操作
在这里插入图片描述

三、RBAC授权

RBAC(RoleBased Access Control):基于角色访问控制授权。

允许管理员通过Kubernetes API动态配置授权策略。RBAC就是用户通过角色与权限进行关联。
RBAC只有授权,没有拒绝授权,所以只需要定义允许该用户做什么即可。
RBAC包括四种类型:Role、ClusterRole、RoleBinding、ClusterRoleBinding。

在这里插入图片描述
RBAC的三个基本概念:

Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
Role:角色,它其实是一组规则,定义了一组对Kubernetes API 对象的操作权限。
RoleBinding:定义了“被作用者”和“角色”的绑定关系。

Role 和 ClusterRole

Role是一系列的权限的集合,Role只能授予单个namespace 中资源的访问权限。
ClusterRole 跟 Role 类似,但是可以在集群中全局使用。

RoleBinding和ClusterRoleBinding

RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups,service accounts),并引用该Role。
RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

1、这里我们使用基于角色访问控制授权(RBAC)实现kubernetes API 访问控制的授权,新建roles目录,编辑资源清单yaml文件创建角色myrole,指定其作用于默认命名空间,对命名空间中的pod资源有一系列权限
在这里插入图片描述

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: myrole
rules:
- apiGroups: [""] 
  resources: ["pods"]
  verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]

2、应用yaml文件,查看角色成功创建,查看角色描述信息可以看到权限设定成功
在这里插入图片描述
3、新建yaml文件创建绑定关系RoleBinding,同样需要指定其作用于默认命名空间,将之前建立的test用户和角色myrole绑定,应用yaml文件,查看绑定成功。
在这里插入图片描述
4、新建yaml文件创建集群角色ClusterRole,这里不需要指定命名空间,ClusterRole可以在集群中全局使用,指定其对命名空间中的pod、deployment资源有一系列权限,切换回集群管理员用户应用yaml文件,查看集群角色成功创建

在这里插入图片描述

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myclusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "delete", "create", "update"]
- apiGroups: ["extensions", "apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

在这里插入图片描述
5、接着在集群角色的yaml文件中创建绑定关系RoleBinding(RoleBinding必须指定命名空间),将之前建立的test用户和集群角色绑定,应用yaml文件

在这里插入图片描述

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-read-pods
  namespace: default
subjects:
- kind: User
  name: test
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: myrole
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rolebind-myclusterrole
  namespace:  default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: test

7、使用deployment控制器部署pod资源,切换test用户访问集群,此时可以访问默认命名空间中的pod、deployment控制器资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、新建yaml文件创建ClusterRoleBinding,这里不需要指定命名空间,ClusterRole可以在集群中全局使用,将之前建立的test用户和集群角色绑定,切换回集群管理员用户应用yaml文件
在这里插入图片描述

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: Clusterrolebind-myclusterrole
  namespace:  default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: test

9、切换test用户访问集群,此时可以成功访问其他命名空间中的资源
在这里插入图片描述

四、服务账户的自动化

服务账户准入控制器(Serviceaccount admission controller)

如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为default。
保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的ImagePullSecrets 信息添加到 pod 中。
将一个包含用于 API 访问的token 的 volume 添加到 pod 中。
将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到
pod 下的每个容器中。

Token控制器(Tokencontroller)

检测服务账户的创建,并且创建相应的Secret 以支持 API 访问。
检测服务账户的删除,并且删除所有相应的服务账户Token Secret。
检测Secret 的增加,保证相应的服务账户存在,如有需要,为Secret 增加token。
检测Secret 的删除,如有需要,从相应的服务账户中移除引用。

服务账户控制器(Serviceaccount controller)

服务账户管理器管理各命名空间下的服务账户,并且保证每个活跃的命名空间下存在一个名为“default” 的服务账户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值