创建用户[devuser]认证授权的 kubeconfig 文件

发布时间 2023-09-26 10:54:21作者: jiayou111

当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制。
下面以创建一个 devuser 用户并将其绑定到 dev 和 test 两个 namespace 为例说明。

创建 CA 证书和秘钥

创建 devuser-csr.json 文件

{
  "CN": "devuser",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Shanghai",
      "L": "Shanghai",
      "O": "Kubernetes",
      "OU": "Kubernetes"
    }
  ]
}
生成CA证书和私钥

我们已经将生成的证书和秘钥放在了所有节点的/etc/kubernetes/pki目录下,下面我们再在 master 节点上为 devuser 创建证书和秘钥,在/etc/kubernetes/pki目录下执行以下命令:
执行该命令前请先确保该目录下已经包含如下文件:

# ca 集群根证书
ca-key.pem  
ca.pem  
ca-config.json 
devuser-csr.json

生成命令:

cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=/etc/kubernetes/pki/ca-config.json -profile=kubernetes devuser-csr.json|cfssljson -bare devuser
2023/09/19 17:38:51 [INFO] generate received request
2023/09/19 17:38:51 [INFO] received CSR
2023/09/19 17:38:51 [INFO] generating key: rsa-2048
2023/09/19 17:38:51 [INFO] encoded CSR
2023/09/19 17:38:51 [INFO] signed certificate with serial number 272484136328588252159908466004591786980109646031
2023/09/19 17:38:51 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").

# 这将生成如下文件:
devuser.csr
devuser-key.pem
devuser.pem
创建kubeconfig文件
export KUBE_APISERVER="https://172.16.108.157:9443"

# 设置集群参数
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=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

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

查看kubectl的context:

kubectl config get-contexts
CURRENT   NAME         CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes   kubernetes   kubernetes-admin   

显示的用户仍然是admin,这是因为kubectl中使用了$HOME/.kube/config文件作为了默认的context配置,不要直接替换文件,最好是备份后重命名,或者可以在命令中指定用哪个config文件访问,命令如下:

kubectl --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n dev
kubectl --kubeconfig=/root/.kube/config get pods -n dev
使用kubernetes-plugin插件连接k8s的认证方式
使用证书方式连接k8s
  1. 通过解码方式获取kubectl使用的admin证书
    查看/root/devuser/devuser.kubeconfig文件,文件中有3个值:certificate-authority-data、client-certificate-data、client-key-data,解码它们获得证书。
# 注意将下面的值替换成自己本地生成的字符串值
echo certificate-authority-data | base64 -d > ca.crt
echo client-certificate-data | base64 -d > client.crt
echo client-key-data | base64 -d > client.key

根据这3个文件生成一个PKCS12格式的客户端证书文件。

openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
# 密码:123456

生成证书的时候,需要填写密码,后面会用到,生成的证书如下:

ca.crt
cert.pfx
client.crt
client.key
  1. 添加认证
    将生成的cert.pfx上传到凭证

  1. kubernetes plugin与k8s连接配置
    将ca.crt中的内容填写到kubernetes server certificate key字段

完成后点击测试连接,查看是否成功。

Rolebinding

如果我们想限制devuser用户的行为,需要使用RBAC创建角色绑定以将该用户的行为限制在某个或某几个namespace空间范围内,如:
1.其实测试环境里可以绑定user和clusterrole=admin,能满足我们的需求,只是这样权限太高。

kubectl create rolebinding dev-devuser-rolebinding --clusterrole=admin --user=devuser --namespace=dev

kubectl create rolebinding test-devuser-rolebinding --clusterrole=admin --user=devuser --namespace=test

2.我们这里使用的rolebinding绑定的是用户账号devuser和用户角色role,这样可以让devuser用户对dev和test 2个namespace具有完全访问权限。
namespace: dev

# 新建role
cat dev-devuser.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dev-devuser
  namespace: dev
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'

# 新建rolebinding,绑定role和useraccount
k create rolebinding dev-devuser-rolebinding --role=dev-devuser --user=devuser -n dev

# 测试命令
k --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n dev

namespace: test

# 新建role
cat test-devuser.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: test-devuser
  namespace: test
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'

# 新建rolebinding
k create rolebinding test-devuser-rolebinding --role=test-devuser --user=devuser -n test

# 测试
k --kubeconfig=/root/devuser/devuser.kubeconfig get pods -n test

参考链接:
https://www.cnblogs.com/deny/p/13848781.html
https://jimmysong.io/kubernetes-handbook/guide/kubectl-user-authentication-authorization.html