- 本文偏实战,内容涉及:
- token方式的API Server认证Demo
- Kubeconfig文件方式的API Server认证Demo
- Kubeconfig文件的创建Demo
只有能做到“尽人事而听天命”,一个人才能永远保持心情的平衡。 ----- 《季羡林谈人生》
Kubernetes集群中所有资源的访问和变更都是通过Kubernetes API Server的REST API来实现的,所以集群安全的关键点就在于如何鉴权和授权
一个简单的Demo,在master节点上,我们通过root用户可以直接通kubectl来请求API Service从而获取集群信息,但是我们通过其他用户登录就没有这个权限,这就涉及到k8s的一个认证问题.
root用户可以正常访问
切换tom用户来访问,没有权限,报错找不到集群API的位置,那么为什么会这样呢?
为了演示认证,我们需要在集群外的机器上安装一个客户端工具kubectl,用于和集群的入口api-Service交互
可以通过kubectl cluster-info来查看集群的相关信息
Kubernetes集群提供了3种级别的客户端身份认证方式
HTTP Token认证:通过一个Token来识别合法用户。
HTTPS 证书认证:基于CA根证书签名的双向数字证书认证方式
HTTP Base认证:通过用户名+密码的方式认证,这个只有1.19之前的版本适用,之后的版本不在支持
下面就Token和SSL和小伙伴分享下,Bash因为在高版本的K8s中不在支持,所以我们这里不聊。关于上面的普通用户范围集群的问题,我们也会改出解答
HTTP Token的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串Token来表明客户身份的一种方式。
每个Token对应一个用户名,存储在APIServer能访问的一个文件中。当客户端发起API调用请求时,需要在HTTP Header里放入Token,这样一来, API Server就能识别合法用户和非法用户了。
当 API 服务器的命令行设置了--token-auth-file=SOMEFILE选项时,会从文件中 读取持有者令牌。目前,令牌会长期有效,并且在不重启 API 服务器的情况下 无法更改令牌列表。下面我们一个通过Demo来演示通过静态Token的用户认证,
通过openssl生成一个令牌
令牌文件是一个 CSV 文件,包含至少 3 个列:令牌、用户名和用户的 UID。 其余列被视为可选的组名。这里需要注意的是,令牌文件要放到/etc/kubernetes/pki目录下才可以,可能默认读取令牌的位置即是这个位置
通过Sed添加kube-apiserver服务启动参数,- --token-auth-file=/etc/kubernetes/pki/liruilong.csv
检查修改的启动参数
重启kubelet服务
确认集群能够正常访问
在集群外的客户机访问集群信息,这里提示我们admin2用户没有访问的权限,说明已经认证成功了,只是没有权限
这里我们修改一些token的字符串,Token和集群的Token文件不对应,会提示我们没有获得授权,即认证失败
在回到我们之前的那个问题,为什么使用root用户可以访问集群信息,但是通过tom用户去不能够访问集群信息,这里就涉及到一个kubeconfig 文件认证的问题
在通过kubeadm创建集群的时候,不知道小伙伴没还记不记得下面这个文件admin.conf,这个文件就是kubeadm帮我们生成的kubeconfig文件
我们把这个文件拷贝到tom用户的目录下,修改权限
这个时候发现通过 --kubeconfig=admin.conf 指定这个文件,就可以访问集群信息
那个,kubeconfig文件是个什么东西,官方文档中这样描述:
使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份认证机制的信息。kubectl 命令行工具使用 kubeconfig 文件来查找选择集群所需的信息,并与集群的 API 服务器进行通信。
换句话讲,通过kubeconfig与集群的 API 服务器进行通信,类似上面的Token的作用,我们要说的HTTPS证书认证就是放到这里
默认情况下,kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。
将kubeconfig文件复制到 $HOME/.kube 目录下改名为 config 发现tom用户依旧可以访问
也可以通过设置 KUBECONFIG 环境变量或者设置 --kubeconfig参数来指定其他kubeconfig文件。
当我们什么都不设置时,tom用户获取不到kubeconfig文件,没有认证信息,无法访问
查看kubeconfig文件的配置信息
所以我们要想访问集群信息,只需要把这个kubeconfig 文件拷贝到客户机上就OK了
一个kubeconfig 文件包括一下几部分:
- 集群信息:
- 集群CA证书
- 集群地址
- 上下文信息
- 所有上下文信息
- 当前上下文
- 用户信息
- 用户CA证书
- 用户私钥
要创建 kubeconfig 文件的话,我们需要一个私钥,以及集群 CA 授权颁发的证书。同理我们不能直接用私钥生成公钥,而必须是用私钥生成证书请求文件(申请书),然后根据证书请求文件向 CA(权威机构)申请证书(身份证),CA 审核通过之后会颁发证书。
环境准备
生成一个 2048 位的 私钥 iruilong.key 文件
查看私钥文件
利用刚生成的私有 liruilong.key 生成证书请求文件 liruilong.key:这里CN的值 liruilong,就是后面我们授权的用户。
对证书请求文件进行 base64 编码
编写申请证书请求文件的 yaml 文件:cat csr.yaml
这里 request 里的是 base64 编码之后的证书请求文件。申请证书
查看已经发出证书申请请求:
批准证书:
查看审批通过的证书:
导出证书文件:
给用户授权,这里给 liruilong 一个集群角色 cluster-role(类似于root一样的角色),这样 liruilong 具有管理员权限
拷贝 CA 证书
设置集群字段,这里包含集群名字,服务地址和集群证书
在上面集群中创建一个上下文context1
这里–embed-certs=true 的意思是把证书内容写入到此 kubeconfig 文件里。
设置用户字段,包含用户名字,用户证书,用户私钥
查看创建的kubeconfig文件信息
修改kubeconfig文件当前的上下文为之前创建的上下文
这样 kubeconfig 文件就创建完毕了,下面开始验证 kubeconfig 文件。
拷贝证书到客户机
客户机指定证书访问测试
这样一个kubeconfig文件就创建完成
Tags: