本文分享自华为云社区《kube-apiserver认证鉴权能力》,作者: 可以交个朋友。

HTTPS为什么要进行身份验证

首先不管是kubectl还是API调用都是通过HTTPS访问kube-apiserver,有图有真相

所以要想了解kube-apiserver认证鉴权,得先从HTTPS说起;接下来我们直接通过API接口访问apiserver

为什么不能访问?准确来说是为什么不能建立HTTPS连接

原因就是客户端无法验证服务端证书,导致HTTPS连接建立失败。可不可以不验证服务端证书?可以

但在公网环境不建议这么做,如果不验证服务端,你可能访问的并不是你想访问的服务端

证书如何保证服务端不被伪造

如何保证客户端收到的服务端公钥没有被伪造?答案就是第三方权威机构CA

证书申请流程:服务端需要将自己的信息和公钥发给CA,CA根据服务端发送过来的内容进行HASH,然后用CA私钥加密得到签名,将签名和CSR文件同时写入一个文件即为证书,而访问端通过CA根证书(包含CA公钥)解密服务端证书中的签名可以确认服务端身份,身份确认后就可以从服务端证书中CSR文件内拿到服务端的公钥

为什么要先HASH一下?因为不管CSR文件多大,经过HASH之后长度固定,加/解密速度更快

防伪关键点就是CA的私钥只有CA机构有,你无法修改证书里面的签名;你也无法用自己的CA私钥伪造签名,因为访问端没有你的CA公钥无法解密;

只要签名无法修改,csr文件的内容修改就毫无意义。

现在我们再访问一次apiserver,这次我们带上K8S集群CA证书试试

有HTTP状态码返回就说明HTTPS连接已建立;完整的HTTPS认证过程如下

想想为什么curl访问https://www.baidu.com不需要指定CA证书?

kubernetes认证方式

上文我们只是验证了服务端,服务端并没有验证客户端,所以我们收到了401的返回码。类似于我虽然接了你的电话,但我首先肯定是想知道你是谁。

apiserver支持三种认证客户端的方式:

  • HTTPS证书认证:此方式最严格,基于CA根证书签名的双向数字证书认证方式。比如kube-controller-manager、kubelet等
  • HTTP Token认证:通过一个Token来识别合法用户。比如serviceaccount
  • HTTP Base认证:通过用户名+密码的方式认证。由于不常用本文不做介绍

Token认证

我们创建一个serviceaccount;1.24版本以上创建serviceaccount不再自动创建secret。

kubectl create sa test

找到以serviceaccount名称开头的secret,拿到其中token字段的值

我们带上token再次访问apiserver,看看效果

返回了403状态码,显示Forbidden;说明我们过了认证,只是没有权限而已

证书认证

使用openssl生成客户端私钥和csr文件;其中/CN字段就是你的用户名;csr文件需要公钥,但命令行却指定的是私钥,是因为oenssl会自动用私钥生产公钥

openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"

创建 CertificateSigningRequest资源,回忆下上文提到的证书申请过程,我们需要提供什么?

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: $(cat myuser.csr | base64 | tr -d "\n")
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
EOF

手动批准证书请求,证书会被保存到csr资源的status.certificate字段,将证书base64解码并写入文件

kubectl certificate approve myuser
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt

可以用openssl查看证书内容,查看签名字段需要借助其他工具,比如:asn1editor

使用客户端私钥和证书再次访问apiserver

和token访问结果一致,认证通过但未赋权

鉴权机制

上文我们访问apiserver得到了403的返回码,说明我们权限不够,无法获取namespaces资源;为了集群便于管理,我们必须为不同用户设置不同权限。

在K8S集群中完成鉴权机制的是RBAC,RBAC授权规则是通过四种资源来进行配置:

  • Role:角色,其实是定义一组对Kubernetes资源(命名空间级别)的访问规则
  • ClusterRole:集群角色,其实是定义一组对Kubernetes资源(集群级别,包含全部命名空间)的访问规则
  • RoleBinding:角色绑定,定义了用户和角色的关系
  • ClusterRoleBinding:集群角色绑定,定义了用户和集群角色的关系

有了角色和角色绑定,还缺一个对象,你希望将角色绑定到那个对象上?

在k8s集群中这个对象称为subject主体,主体可以是用户、组或者serviceaccount;

k8s集群中不存在用户资源,你也无法通过命令查到;Kubernetes 使用证书中’subject’的通用名称(Common Name)字段 (例如:"/CN=bob")来确定用户名

接下来我们对上文创建的serviaccount和用户myuser赋权

创建集群角色和集群角色绑定

#创建一个集群角色,仅对namespaces资源有get、list和watch权限
kubectl create clusterrole myclusterrole --resource=namespaces --verb=get,list,watch
#将serviceaccount和myuser用户与该集群角色绑定,test和myuser便有了该集群角色的权限
kubectl create clusterrolebinding testuser --clusterrole=myclusterrole --user=myuser
kubectl create clusterrolebinding testsa --clusterrole=myclusterrole --serviceaccount=default:test

再次使用token或者证书访问apiserver

使用证书访问

一文详解kube-apiserver认证鉴权能力的更多相关文章

  1. 一文详解Hexo+Github小白建站

    作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...

  2. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  3. pika详解(五)登录认证及connectionParameters

    pika详解(五)登录认证及connectionParameters 本文链接:https://blog.csdn.net/comprel/article/details/94662916 版权 pi ...

  4. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  5. Spring Security 接口认证鉴权入门实践指南

    目录 前言 SpringBoot 示例 SpringBoot pom.xml SpringBoot application.yml SpringBoot IndexController SpringB ...

  6. 认证鉴权与API权限控制在微服务架构中的设计与实现(四)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...

  7. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  8. 一文详解 WebSocket 网络协议

    WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...

  9. 1.3w字,一文详解死锁!

    死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...

  10. 一文详解Redis键过期策略

    摘要:Redis采用的过期策略:惰性删除+定期删除. 本文分享自华为云社区<Redis键过期策略详解>,作者:JavaEdge. 1 设置带过期时间的 key # 时间复杂度:O(1),最 ...

随机推荐

  1. 原创基于Scrum框架产研团队运作20问

    学习完了 Scrum,实际使用中,是否遇到/思考过下面的问题? Product Owner的老板是谁.谁来给 Product Owner打绩效.考核的标准是啥? Scrum Master 的老板是谁. ...

  2. .NET 8 候选版本 2 (RC2) 现已可用

    .NET 8 候选版本 2 (RC2) 现已可用,并包含了许多 ASP.NET Core 的出色新改进! 这是我们计划在今年晚些时候发布的最终 .NET 8 版本之前分享的最后一个候选版本..NET ...

  3. 非全自研可视化表达引擎RuleLinK可视化之路

    导读 上一篇<非全自研可视化表达引擎-RuleLinK>介绍了RuleLink的V1.0版本,虽说一定程度上消除了一些配置相关的样板式代码,也肉眼可见的消除了一些研发资源的浪费:RuleL ...

  4. C#怎样链接mysql数据库

    C#一般链接sqlserver数据库,当然也会链接oracle.C#和MYSQL搭配貌似不多见哦 下面说说方法. 1.下载链接库文件,MySql.Data.dll MySql.Data.rar 2.工 ...

  5. [最优化DP]决策单调性

    决策单调性的概念&证明工具: 决策单调性,是在最优化dp中的可能出现的一种性质,利用它我们可以降低转移的复杂度. 首先dp中会有转移,每个状态都由若干个状态转移而来,最优化dp比较特殊,只能由 ...

  6. 最新 2023.2 版本 IDEA 永久破解教程,IDEA 破解补丁永久激活(亲测有效)

    最近 jetbrains 官方发布了 2023.2 版本的 IDEA,之前的激活方法并不支持这个新的版本. 下面是最新的激活教程,激活步骤和之前是类似的,只是换用了不同的补丁文件. 本教程支持 Jet ...

  7. LVS负载均衡群集——其二

    LVS-DR 通信四元素:源IP,源端口,目的IP,目的端口 主机A(客户端)-->VIP 主机B(调度器) 主机A(客户端)<--VIP 主机C(节点服务器) 通信五元素:源IP,源端口 ...

  8. Go类型嵌入介绍和使用类型嵌入模拟实现“继承”

    Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 目录 Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 一.独立的自定义类型 二.继承 三.类型嵌入 3.1 什么 ...

  9. MongoDB 位置查询报错 planner returned error: unable to find index for $geoNear query

    执行查询语句,使用 $nearSphere /** * 1千米 = 0.6213712英里 15千米 = 9.3205679英里 查询通过除以地球的大约赤道半径(3963.2英里)将距离转换为弧度. ...

  10. Python标准库中隐藏的利器

    Python安装之后,其标准库中有的模块,不一定要通过代码来引用,还可以直接在命令行中使用的. 在命令行中直接使用Python标准库的模块,最大的好处就是就是不用写代码,就能使用其中的功能,当临时需要 ...