Linux企业运维——Kubernetes(十三)访问控制

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——Kubernetes(十三)访问控制相关的知识,希望对你有一定的参考价值。

Linux企业运维——Kubernetes(十三)访问控制

1、基本概念

kubernetes API 访问控制过程:认证、授权、准入控制

Authentication(认证)

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

Authorization(授权)

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

AdmissionControl(准入控制)

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


访问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访问的入口固定格式名

2、API Server认证

UserAccount与serviceaccount:

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

2.1、ServiceAccount(SA)

1、确认server1上私有仓库habbor开启

2、查看默认命名空间内的serviceaccount,创建一个SA账户(admin),创建sa时,会由SA控制器负责创建(SA用在pod内),查看新建SA的描述信息,此时k8s为用户自动生成认证信息,但没有授权,该账户还未绑定创建pod时拉取仓库镜像的secrets

3、查看secrets,可以看到默认命名空间内有我们之前进行secerts配置时所创建的仓库镜像拉取secrets:myregistrykey

4、添加该secrets到创建的SA中

5、编辑之前配置的生成Pod的yaml文件,注释在Pod中指定imagePullSecrets的语句,把添加了imagePullSecrets认证信息的SA和pod绑定起来(将拉取仓库镜像的key直接写入资源清单不安全,可以将key加入SA中,但需要在部署应用的资源清单文件中指定相捆绑的SA账户,如果不指定则默认为每个命名空间的default账户)


6、应用这一yaml文件,查看pod可以看到镜像成功拉取,容器运行并就绪

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

2.2、UserAccount(UA)

1、切换到k8s集群的证书存放目录

2、生成密钥key,这一密钥不能直接在集群中使用,需要先生成csr证书请求,利用证书请求生成密钥对应的证书

3、利用生成的密钥、证书,为test用户项开启证书验证并设置证书文件路径,查看当前节点的kubeconfig配置信息可以看到设置成功

4、设置访问集群环境上下文信息:访问k8s集群,访问用户为test,设置完成后切换test用户访问集群,查看当前节点的kubeconfig配置信息可以看到当前用户为test

5、此时test用户通过认证,但还没有权限操作集群资源,如无法查看集群中的命名空间,需要继续添加授权,注意在对test用户授权时需要切换回集群管理员用户进行相应操作

3、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资源有一系列权限


2、应用yaml文件,查看角色成功创建,查看角色描述信息可以看到权限设定成功

3、新建yaml文件创建绑定关系RoleBinding,同样需要指定其作用于默认命名空间,将之前建立的test用户和角色myrole绑定,应用yaml文件,查看绑定成功


4、此时切换test用户访问集群,可以访问默认命名空间中的pod资源,但无法访问默认命名空间中的其余资源如deployment控制器,以及其他命名空间中的资源,这是因为Role只能授予单个namespace 中资源的访问权限

5、新建yaml文件创建集群角色ClusterRole,这里不需要指定命名空间,ClusterRole可以在集群中全局使用,指定其对命名空间中的pod、deployment资源有一系列权限,切换回集群管理员用户应用yaml文件,查看集群角色成功创建


6、接着在集群角色的yaml文件中创建绑定关系RoleBinding(RoleBinding必须指定命名空间),将之前建立的test用户和集群角色绑定,应用yaml文件


7、使用deployment控制器部署pod资源,切换test用户访问集群,此时可以访问默认命名空间中的pod、deployment控制器资源


8、部署service,部署失败,这是因为test用户在默认命名空间中没有对service资源的权限

9、接着在集群角色的yaml文件中追加指定其对service资源有一系列权限,切换回集群管理员用户应用yaml文件


10、查看该集群角色的描述信息,可以看到权限设定成功

11、切换test用户访问集群,此时可以成功部署查看service,但仍无法访问其他命名空间中的资源,这是因为RoleBinding是对某个命名空间内授权

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


13、切换test用户访问集群,此时可以成功访问其他命名空间中的资源

14、Kubernetes提供了四个预先定义好的 ClusterRole 来供用户直接使用,分别为cluster-amdin、admin、edit、view,一般我们在自定义时可以参照admin角色进行设置

4、服务账户的自动化

服务账户准入控制器(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” 的服务账户

以上是关于Linux企业运维——Kubernetes(十三)访问控制的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——Kubernetes(二十)Prometheus监控

Linux企业运维——Kubernetes(十四)PSP安全策略

Linux企业运维——Kubernetes(十六)容器资源监控

Linux企业运维——Kubernetes(十六)容器资源监控

Linux企业运维——Kubernetes控制器

Linux企业运维——Kubernetes(十五)容器资源限制