一文详解kube-apiserver认证鉴权能力
本文分享自华为云社区《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
使用证书访问

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mysql tls 会话:再一次抓包之后,我认识到…
本文分享自华为云社区《有些事你只有抓包才知道之mysql tls会话》,作者:张俭。 你的mysql客户端和服务端之间开启tls了吗?你的回答可能是No,我根本没开启mysql的tls。 可是当你抓取了3306 mysql的端口之后,你会发现,抓出来的包里居然有Client Hello、Server Hello这样的典型TLS报文。 Mysql返回的Server Greeting中有一个flag的集合字段,名为Capabilities Flag,顾名思义,这就是用来做兼容性的位flag。其中的2048位、也就是第12位,代表着CLIENT_SSL,如果设置为1,则会在后面的会话中切换到TLS。可以看到里面还有一些其他的flag,事务、长密码等等相关的兼容性开关。 那么该如何关闭这个TLS呢,只需要在my.cnf中添加 echo "ssl=0" >> /etc/my.cnf 重启mysql。再度进行抓包,就发现没有tls的报文了,都是在使用明文进行通信了。 点击关注,第一时间了解华为云新鲜技术~
- 下一篇
云图说|有了这2招必杀技,你的主机“身陷重围”都不怕!
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:华为云主机安全服务HSS在2023年12月推出了全新版本,新增包括应急漏洞防护、全盘病毒查杀等功能,在安全性、易用性方面再上一个Level,让风险无处遁形! 本文分享自华为云社区《【云图说】第298期 有了这2招必杀技,你的主机“身陷重围”都不怕!》,作者:阅识风云 华为云主机安全服务HSS是提升主机整体安全性的服务,通过资产管理、漏洞管理、基线检查、入侵检测等功能,帮助企业更方便地管理主机/容器/网站/应用安全风险,实时发现黑客入侵行为,帮助企业构建服务器安全体系,降低当前服务器面临的主要安全风险。 主机安全服务HSS在2023年12月推出了全新版本,新增包括应急漏洞防护、全盘病毒查杀等功能,在安全性、易用性方面再上一个Level,让风险无处遁形! 点击“了解更多”,华为云主机安全服务HSS等着您! 点击关注,第一时间了解华为云新鲜技术~
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G