Kubernetes中的用户

K8S中有两种用户(User)——服务账号(ServiceAccount)和普通意义上的用户(User)

ServiceAccount是由K8S管理的,而User通常是在外部管理,K8S不存储用户列表——也就是说,添加/编辑/删除用户都是在外部进行,无需与K8S API交互,虽然K8S并不管理用户,但是在K8S接收API请求时,是可以认知到发出请求的用户的,实际上,所有对K8S的API请求都需要绑定身份信息(User或者ServiceAccount),这意味着,可以为User配置K8S集群中的请求权限

有什么区别?

最主要的区别上面已经说过了,即ServiceAccount是K8S内部资源,而User是独立于K8S之外的。从它们的本质可以看出:

  • User通常是人来使用,而ServiceAccount是某个服务/资源/程序使用的

  • User独立在K8S之外,也就是说User是可以作用于全局的,在任何命名空间都可被认知,并且需要在全局唯一

    而ServiceAccount作为K8S内部的某种资源,是存在于某个命名空间之中的,在不同命名空间中的同名ServiceAccount被认为是不同的资源

  • K8S不会管理User,所以User的创建/编辑/注销等,需要依赖外部的管理机制,K8S所能认知的只有一个用户名

    ServiceAccount是由K8S管理的,创建等操作,都通过K8S完成

这里说的添加用户指的是普通意义上的用户,即存在于集群外的用户,为k8s的使用者。

实际上叫做添加用户也不准确,用户早已存在,这里所做的只是使K8S能够试别此用户,并且控制此用户在集群内的权限

用户验证

尽管K8S认知用户靠的只是用户的名字,但是只需要一个名字就能请求K8S的API显然是不合理的,所以依然需要验证此用户的身份

在K8S中,主要有以下几种验证方式:

  • X509客户端证书

    客户端证书验证通过为API Server指定--client-ca-file=xxx选项启用,API Server通过此ca文件来验证API请求携带的客户端证书的有效性,一旦验证成功,API Server就会将客户端证书Subject里的CN属性作为此次请求的用户名

  • 静态token文件

    通过指定--token-auth-file=SOMEFILE 选项来启用bearer token验证方式,引用的文件是一个包含了 token,用户名,用户ID 的csv文件

    请求时,带上Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269头信息即可通过bearer token验证

  • 静态密码文件

    通过指定--basic-auth-file=SOMEFILE选项启用密码验证,类似的,引用的文件时一个包含 密码,用户名,用户ID 的csv文件

    请求时需要将Authorization头设置为Basic BASE64ENCODED(USER:PASSWORD)

这里只介绍客户端验证

为用户生成证书

假设我们操作的用户名为tom

  1. 首先需要为此用户创建一个私钥

    openssl genrsa -out tom.key 2048

  2. 接着用此私钥创建一个csr(证书签名请求)文件,其中我们需要在subject里带上用户信息(CN为用户名,O为用户组)

    openssl req -new -key tom.key -out tom.csr -subj "/CN=tom/O=MGM"

    其中/O参数可以出现多次,即可以有多个用户组

  3. 找到K8S集群(API Server)的CA证书文件,其位置取决于安装集群的方式,通常会在/etc/kubernetes/pki/路径下,会有两个文件,一个是CA证书(ca.crt),一个是CA私钥(ca.key)

  4. 通过集群的CA证书和之前创建的csr文件,来为用户颁发证书

    openssl x509 -req -in tom.csr -CA path/to/ca.crt -CAkey path/to/ca.key -CAcreateserial -out tom.crt -days 365

    -CA和-CAkey参数需要指定集群CA证书所在位置,-days参数指定此证书的过期时间,这里为365天

  5. 最后将证书(tom.crt)和私钥(tom.key)保存起来,这两个文件将被用来验证API请求

为用户添加基于角色的访问控制(RBAC)

角色(Role)

在RBAC中,角色有两种——普通角色(Role)和集群角色(ClusterRole),ClusterRole是特殊的Role,相对于Role来说:

  • Role属于某个命名空间,而ClusterRole属于整个集群,其中包括所有的命名空间

  • ClusterRole能够授予集群范围的权限,比如node资源的管理,比如非资源类型的接口请求(如"/healthz"),比如可以请求全命名空间的资源(通过指定 --all-namespaces)

为用户添加角色

首先创造一个角色

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: a-1
name: admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]

这是在a-1命名空间内创建了一个admin管理员角色,这里只是用admin角色举例,实际上如果只是为了授予用户某命名空间管理员的权限的话,是不需要新建一个角色的,K8S已经内置了一个名为admin的ClusterRole

将角色和用户绑定

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin-binding
namespace: a-1
subjects:
- kind: User
name: tom
apiGroup: ""
roleRef:
kind: Role
name: admin
apiGroup: ""

如yaml中所示,RoleBinding资源创建了一个 Role-User 之间的关系,roleRef节点指定此RoleBinding所引用的角色,subjects节点指定了此RoleBinding的受体,可以是User,也可以是前面说过的ServiceAccount,在这里只包含了名为 tom 的用户

添加命名空间管理员的另一种方式

前面说过,K8S内置了一个名为admin的ClusterRole,所以实际上我们无需创建一个admin Role,直接对集群默认的admin ClusterRole添加RoleBinding就可以了

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin-binding
namespace: a-1
subjects:
- kind: User
name: tom
apiGroup: ""
roleRef:
kind: ClusterRole
name: admin
apiGroup: ""

这里虽然引用的是作为ClusterRole的admin角色,但是其权限被限制在RoleBinding admin-binding所处的命名空间,即a-1内

如果想要添加全命名空间或者说全集群的管理员,可以使用cluster-admin角色

到此为止,我们已经:

  • 为tom用户提供了基于X509证书的验证
  • 为a-1命名空间创造了一个admin角色
  • 为用户tom和角色admin创建了绑定关系

为kubectl配置用户

tom已经是管理员了,现在我们想要通过kubectl以tom的身份来操作集群,需要将tom的认证信息添加进kubectl的配置,即~/.kube/config中

这里假设config中已经配置好了k8s集群

  1. 通过命令kubectl config set-credentials tom --client-certificate=path/to/tom.crt --client-key=path/to/tom.key将用户tom的验证信息添加进kubectl的配置

    此命令会在配置中添加一个名为tom的用户

  2. kubectl config set-context tom@aliyun --cluster=aliyun --namespace=a-1 --user=tom

    此命令添加了一个context配置——设定使用aliyun集群,默认使用a-1命名空间,使用用户tom进行验证

  3. 在命令中带上 kubectl --context=tom@aliyun ... 参数即可指定kubectl使用之前添加的名为tom@aliyun的context操作集群

    也可以通过命令 kubectl config use-context tom@aliyun 来设置当前使用的context

Tips: 将认证信息嵌入kubectl的配置中

通过kubectl config set-credentials命令添加的用户,其默认使用的是引用证书文件路径的方式,表现在~/.kube/config中,就是:

users:
- name: tom
user:
client-certificate: path/to/tom.crt
client-key: path/to/tom.key

如果觉得这样总是带着两个证书文件不方便的话,可以将证书内容直接放到config文件里

  1. 将tom.crt/tom.key的内容用BASE64编码

    cat tom.crt | base64 --wrap=0

    cat tom.key | base64 --wrap=0

  2. 将获取的编码后的文本复制进config文件中

users:
- name: ich
user:
client-certificate-data: ...
client-key-data: ...

这样就不再需要证书和私钥文件了,当然这两个文件还是保存起来比较好

与企业自有用户系统集成

通常来说,对于Kubernetes的操作是由平台或应用的运维人员来完成,多数情况下,可以直接为相应人员手动或者自动地创建证书或service account,不需要与企业人员系统集成。

如果确实有与企业人员系统集成的需求的话,可以考虑:

  1. 实现自动化的证书签发并绑定到企业人员系统中
  2. 使用OIDC认证插件,尤其是在企业人员系统已经支持OIDC的情况下,比如企业如果使用Azure ActiveDirectory或者Google Identity作为企业的Identity Provider时,这些Identity Provider均已实现了OIDC
  3. 使用Webhook Token Authentication

参考资料:

Authenticating - Kubernetes Docs

Configure RBAC in your Kubernetes Cluster

Using RBAC Authorization - Kubernetes Docs

Kubectl Reference Docs#config

Kubernetes auth: X509 client certificates

福禄·研发中心
龙舌兰日落

为Kubernetes集群添加用户认证的更多相关文章

  1. kubernetes 集群添加node节点

    kubernetes 集群添加node节点 注意,我们并不需要把新增的node ip加入到证书里重新生成!!! 下面我们以添加node03为例 一.添加集群里个节点的hostname并设置好对应主机名 ...

  2. EFK教程(5) - ES集群开启用户认证

    基于ES内置及自定义用户实现kibana和filebeat的认证 作者:"发颠的小狼",欢迎转载 目录 ▪ 用途 ▪ 关闭服务 ▪ elasticsearch-修改elastics ...

  3. EFK-5: ES集群开启用户认证

    转载自:https://mp.weixin.qq.com/s?__biz=MzUyNzk0NTI4MQ==&mid=2247483826&idx=1&sn=583e9a5260 ...

  4. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  5. ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...

  6. linux运维、架构之路-Kubernetes集群部署TLS双向认证

    一.kubernetes的认证授权       Kubernetes集群的所有操作基本上都是通过kube-apiserver这个组件进行的,它提供HTTP RESTful形式的API供集群内外客户端调 ...

  7. 033.Kubernetes集群安全-API Server认证及授权

    一 Kubernetes集群安全 1.1 安全机制 Kubernetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群 ...

  8. 二进制安装部署kubernetes集群---超详细教程

    本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...

  9. Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

    搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...

随机推荐

  1. 为 Memcached 构建基于 Go 的 Operator 示例

    Operator SDK 中的 Go 编程语言支持可以利用 Operator SDK 中的 Go 编程语言支持,为 Memcached 构 建基于 Go 的 Operator 示例.分布式键值存储并管 ...

  2. Django的form组件——ModelForm实战

    模型: from django.db import models class Book(models.Model): book_name = models.CharField(max_length=3 ...

  3. MySQL——日志管理

    一.MySQL日志类型 1.错误:--log--error ---------------------*** host_name.err 2.常规: --general_log host_name.l ...

  4. ubantu硬盘不足,无法启动

    我的ubantu虚拟机经过我一顿操作后,就起不来了.然后经过多方询问,广集天下良方,最终发现是由于分配的硬件空间不足导致的.现象如下: 通过查看 root@ubantu:/snap# df -h Fi ...

  5. GridView控件使用

    增加显示列gridView.Columns.AddVisible("AgentName", "姓名");设置是否为只读gridView1.OptionsBeha ...

  6. Solon 1.5.29 发布,轻量级 Java 基础开发框架

    本次版本主要变化: 增加 captcha-solon-plugin 插件(提供滑块验证与选文字验证能力) 插件 sa-token-solon-plugin,升级 sa-token 为 1.26.0 插 ...

  7. Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法

    参考 <手把手教你设计CPU--RISC-V处理器篇> 先给出不用if-else和case的原因 Verilog中的if-else和case语法存在两大缺点: 不能传播不定态X: 会产生优 ...

  8. awk工作流程

    awk 工作过程:先执行BEGIN模块,再跟文本交互,最后执行END模块.也就是说BEGIN/END模块,这俩是单独操作跟文本是同一级,但执行有优先级,BEGIN模块>文本>END模块 行 ...

  9. Azure 实践(4)- CI/CD .netcore项目Docker构建及部署

    上篇已介绍了.netcore项目构建的相关步骤,本篇继续完善 1.什么是CI/CD CI/CD 中的"CI"始终指持续集成,它属于开发人员的自动化流程.成功的 CI 意味着应用代码 ...

  10. 深度探索-Redis复制

    1.前言 本文介绍了Redis复制的主要流程和设计思想.通过本文的阅读,您大致能理解复制在软件架构方面的通用思想.在阅读本文之前,希望读者首先对Redis有一定的认识,对Redis的事件类型.和事件处 ...