k8s之基于用户/用户组授权

本文详细介绍了如何在Kubernetes环境中创建和颁发客户端证书,包括使用CFSSL和OpenSSL工具,以及基于用户和组的权限控制。重点展示了如何通过证书标识用户身份并分配不同角色的权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验环境

主机权限
k8s-master-1admin
k8s-node-1

签发用户证书

  • 创建kubectl证书请求文件,必须要由和apiserver证书相同机构来颁发这个证书,否则apiserver使用它的CA公钥无法认证这个证书
  • 如果提供了客户端证书并且证书被验证通过,则 subject 中的公共名称(Common Name)就被 作为请求的用户名
  • Kubernetes 1.4 开始,客户端证书还可以通过证书的 organization 字段标明用户的组成员信息。 要包含用户的多个组成员信息,可以在证书种包含多个 organization 字段:openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2"

创建证书请求文件

cfssl csr格式参考链接https://github.com/cloudflare/cfssl/wiki/Creating-a-new-CSR

  • "CN":Common Name,设置用户名为user1

  • "C": country

  • "ST": the state or province

  • "L": locality or municipality (such as city or town name)

  • "O": organisation,设置属于二个组,group1,group2

  • "OU": organisational unit, such as the department responsible for owning the key; it can also be used for a “Doing Business As” (DBS) name

[root@k8s-master-1 different]# cat > kubectl-csr.json <<EOF
{
  "CN": "user1",
  "hosts": [],					# 这里设置host也不生效,无法限制,原因未知
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "hunan",
      "L": "changsha",
      "O": "group1",
      "OU": "system"
    }
  ]
}
EOF

颁发证书

  • -ca:签发apiserver证书的CA证书
  • -ca-key:私钥
  • -config:CA配置
# 生成证书
	cfssl gencert -ca=/root/cluster/pki/kube-apiserver-ca.pem -ca-key=/root/cluster/pki/kube-apiserver-ca-key.pem -config=/root/cluster/pki/ca-config.json -profile=kubernetes kubectl-csr.json | cfssljson -bare kubectl
	

# 或者使用openssl方式
	openssl genrsa -out kubectl-key 2048
	openssl req -new -key kubectl-key -out kubectl.csr -subj "/CN=user1/O=group1/O=group2"
	openssl x509 -req -CA /root/cluster/pki/kube-apiserver-ca.pem -CAkey /root/cluster/pki/kube-apiserver-ca-key.pem -CAcreateserial -days 730 -in kubectl.csr -out kubectl.crt
# 查看生成的证书
[root@k8s-master-1 different]# ls
kubectl.csr  kubectl-csr.json  kubectl-key.pem  kubectl.pem

# 设置集群参数
	kubectl config set-cluster kubernetes --certificate-authority=/root/cluster/pki/kube-apiserver-ca.pem --embed-certs=true --server=https://192.168.0.10:6443 --kubeconfig=kube.config
	
# 设置客户端认证参数,生成了一个kubectl的user,里面包含了证书
	kubectl config set-credentials kubectl --client-certificate=kubectl.pem --client-key=kubectl-key.pem --embed-certs=true --kubeconfig=kube.config

# 设置上下文参数,--user,使用上面的kubectl,这里仅仅是标识区分作用,实际不会以这个用户去向apiserver通信
	kubectl config set-context kubernetes --cluster=kubernetes --user=kubectl --kubeconfig=kube.config

# 设置默认上下文
	kubectl config use-context kubernetes --kubeconfig=kube.config

# 将kube.config传到k8s-node-1
[root@k8s-master-1 different]# ssh root@k8s-node-1 "mkdir -p /root/.kube/" && scp kube.config root@k8s-node-1:/root/.kube/config

# k8s-node-1 执行命令,因为此时未授权故而没法正常
[root@k8s-node-1 .kube]# kubectl get pods -A
Error from server (Forbidden): pods is forbidden: User "user1" cannot list resource "pods" in API group "" at the cluster scope

基于用户和组颁发权限

cluster-admin 是通过system:masters组方式进行授权,如果我们在创建用户证书时,/CN=XX/O=system:masters,那么这个用户就拥有超级管理员的权限

基于用户授权

# 基于用户方式授权,cluster-admin 这个clusterrole权限很大,可以操作集群内所有资源,也可以使用自定义的clusterole
[root@k8s-master-1 different]# kubectl create clusterrolebinding kubectl-test --clusterrole=cluster-admin --user=user1
clusterrolebinding.rbac.authorization.k8s.io/kubectl-test created

# 授权完成后,看是否可以执行相关命令
[root@k8s-node-1 .kube]# kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master-1   Ready    master   5d19h   v1.20.15
k8s-node-1     Ready    node     5d19h   v1.20.15

# 删除授权
[root@k8s-master-1 different]# kubectl delete clusterrolebinding kubectl-test
clusterrolebinding.rbac.authorization.k8s.io "kubectl-test" deleted

基于用户组授权

# 基于用户组授权
[root@k8s-master-1 different]# kubectl create clusterrolebinding kubectl-test --clusterrole=cluster-admin --group=group1
clusterrolebinding.rbac.authorization.k8s.io/kubectl-test created

# 授权后,查看是否可以执行相关命令
[root@k8s-node-1 .kube]# kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master-1   Ready    master   5d19h   v1.20.15
k8s-node-1     Ready    node     5d19h   v1.20.15

# 删除授权
[root@k8s-master-1 different]# kubectl delete clusterrolebinding kubectl-test
clusterrolebinding.rbac.authorization.k8s.io "kubectl-test" deleted
### Kubernetes RBAC 用户授权机制 #### 角色定义 在Kubernetes中,RBAC(基于角色的访问控制)用于管理谁可以做什么以及在哪里做。一个角色是一组权限规则的集合[^5]。这些权限以累加的方式组合在一起,并不存在否定规则。 对于特定命名空间内的资源,权限可以通过`Role`对象来定义;而对于跨所有命名空间或集群级别的资源,则使用`ClusterRole`对象。 #### 绑定用户与角色 为了使普通用户获得对集群内资源的操作能力,必须先将其绑定至适当的角色上。这通常通过创建`RoleBinding`或`ClusterRoleBinding`资源完成。前者适用于单个命名空间范围内的角色分配,后者则是针对全局性的`ClusterRole`进行绑定[^3]。 例如,要授予某位开发者对其开发环境所在命名空间下的Pods完全读写权限: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: development name: pod-editor rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: developer-pod-access namespace: development subjects: - kind: User name: "developer@example.com" roleRef: kind: Role name: pod-editor apiGroup: rbac.authorization.k8s.io ``` 这段配置首先定义了一个名为`pod-editor`的角色,它允许执行一系列关于Pod的操作。接着,通过`RoleBinding`将这个角色赋予给指定邮箱地址对应的用户,在此案例中即为`developer@example.com`。 #### 特殊角色 值得注意的是存在一些预设好的特殊角色,比如`cluster-admin`,该角色拥有几乎不受限制的最大化权限(`verbs=*`),可用于管理和维护整个Kubernetes集群[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔_牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值