Kubernetes集群安全机制实战-创建一个用户只能管理dev名字空间
实现过程:创建证书->转换为kubeconfig文件->创建名字空间->角色绑定
创建证书:用户创建没有create user命令,只能在创建证书,并且被apiserver信任的ca签发的时候,这个用户才能出现
转换为kubeconfig文件:把这个证书通过一些命令转换为kubeconfig文件,因为在kubectl连接集群去进行认证,鉴权的时候,我们会使用到kubeconfig文件里的信息(使用到这种文件格式)
创建名字空间:手动创建dev名字空间,默认没有
角色绑定:在dev名字空间下,完成用户和权力之间的绑定

在 /etc/kubernetes/pki/下存放证书,这个路径本身就存储了很多其他证书
1.编辑devuser.json:
{
"CN": "devuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2.下载证书生成工具
# 下载 CFSSL 工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# 移动并重命名文件到系统路径
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
# 添加执行权限
chmod +x /usr/local/bin/cfssl
chmod +x /usr/local/bin/cfssljson
chmod +x /usr/local/bin/cfssl-certinfo
# 生成用户证书
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser

3.转换为kubeconfig文件
把我们刚才生成的证书一点一点传过来,可以手动去生成,但不建议,可以使用官方给我们的命令去做
# 设置集群参数
export KUBE_APISERVER="https://192.168.175.11:6443"
kubectl config set-cluster kubernetes \
--certificate-authority=ca.crt \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=devuser.kubeconfig
-----------------------------------------------------------------------------------------------
--certificate-authority=ca.crt 的含义:
-
这个参数告诉
kubectl:"使用当前目录下的ca.crt文件作为证书颁发机构" -
这个文件不会被复制到其他地方
-
kubectl会读取这个文件的内容,进行 Base64 编码,然后将编码后的数据写入到devuser.kubeconfig文件中
# 设置客户端认证参数
kubectl config set-credentials devuser \
--client-certificate=devuser.pem \
--client-key=devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
# 设置上下文参数-把集群和用户关联起来
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=dev \
--kubeconfig=devuser.kubeconfig
# 创建dev名字空间
kubectl create ns dev
#角色绑定绑定集群角色
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
# 设置默认上下文
可以提前加载这个kubeconfig文件,让它生成一些关于用户的信息
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig

把devuser用户放在当前默认的调用路径/root/.kube/config下,去验证我们的权限执行结果

当前我们已经是devuser用户了,用户的权限默认是为空的,必须要累加,devuser只有dev名字空间下的相关管理员权限

成功了
✅ 成功的情况:
bash
kubectl get pod
# 默认使用 dev 命名空间,成功列出 pod
✅ 预期的失败情况:
bash
kubectl get pod -A
# 错误信息:User "devuser" cannot list resource "pods" in API group "" at the cluster scope
配置完全正确:
-
✅ dev 命名空间权限正常:
-
可以在 dev 命名空间中查看、创建、管理资源
-
看到了您之前创建的
dev-deploy-d7448d978-q9x6jpod
-
-
✅ 集群级别权限被正确限制:
-
无法查看其他命名空间的资源(
-A参数) -
收到了正确的权限拒绝错误信息
-
我们可以配合我们的linux系统用户,去完成不同的名字空间管理员的隔离
配合当前的linux系统用户,做到用户级别的隔离
dev这个用户就是要去管理dev名字空间的管理员
告诉它服务器是192.168.175.11,用户名:dev,密码:123456就可以连接到linux服务器里,默认权限就是devuser,这是最好的状态
kubectl会默认寻找当前用户家目录.kube/config文件
如果在linux里创建一个dev用户,它也有自己的家目录,只要把刚才的devuser.kubeconfig文件放在这个家目录下,就实现了
[root@k8s-master01 ~]# useradd dev
[root@k8s-master01 ~]# passwd dev
Changing password for user dev.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@k8s-master01 ~]# mkdir /home/dev/.kube
[root@k8s-master01 ~]# cp -a /etc/kubernetes/pki/devuser.kubeconfig /home/dev/.kube/config
[root@k8s-master01 ~]# chown -R dev:dev /home/dev/.kube
就可以了,创建了一个linux用户dev,地址192.168.175.11,用户名:dev,密码:123456,,,连接上终端后是linux用户级别
chown -R dev:dev /home/dev/.kube
给他权限,-R:递归一下 dev:dev:用户名dev:组dev ,从哪里开始算/home/dev/.kube,就开始往后去递进权限

更多推荐



所有评论(0)