创建用户

Kubernetes 集群支持多用户管理,可以使用 kubectl 创建其他用户对集群进行管理,并根据不同的用户赋予不同的权限,以达到安全控制。

本节将以 minikube 为例,为其创建其他的用户,并通过 X.509 证书 的认证方式进行认证。

下面将展示创建一个新的名为 alice 的用户的步骤。

为用户生成证书文件

在讲解之前首先要了解这种认证方式,这种认证方式使用的是 TLS (传输层安全协议)SSL (套接字安全协议) 实现的,在该协议中,通常涉及到三类文件:

  • .key 文件:通常指私钥;

  • .csr 文件:证书签名请求,通过 .key 私钥得到,这不是证书,可以简单理解成 公钥,生成证书时要把这个提交给权威的证书颁发机构 CA,由 CA 生成证书给用户;

  • .crt 文件:证书,由 .csr 公钥交由 CA 后生成的证书文件;

X.509 是一种证书格式。对 X.509 证书来说,认证者总是 CA 或由 CA 指定的人,一份 X.509 证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。

💫 X.509 的证书文件,一般以 .crt 结尾,根据该文件的内容编码格式,可以分为以下二种格式:

  • PEM - Privacy Enhanced Mail,打开看文本格式,以 -----BEGIN... 开头,-----END... 结尾,内容是 BASE64 编码。Apache 和 nginx 服务器偏向于使用这种编码格式。

  • DER - Distinguished Encoding Rules,打开看是二进制格式,不可读。Java 和 Windows 服务器偏向于使用这种编码格式。

下面看具体的步骤。

  1. 为用户创建一个私钥,文件名为 alice.key

     openssl genrsa -out alice.key 2048
  2. 用该私钥创建一个证书签名文件(公钥),文件名为 alice.csr,其中我们需要在 -subj 后跟上用户信息(CN 为用户名,0 为用户组),例子中的用户名为 alice,用户组为 basic-user

     openssl req -new -key alice.key -out alice.csr -subj "/CN=alice/O=basic-user"
  3. 该操作需要在 minikube 虚拟机中运行,将 .csr 证书签名文件拷贝至该虚拟机中。 由于 Kubernetes 集群中有自带的 CA 证书,因此可以通过将证书签名文件交给该 CA 为用户签发证书,文件名为 alice.crt

     openssl x509 -req -in alice.csr -CA /var/lib/minikube/certs/ca.crt -CAkey /var/lib/minikube/certs/ca.key -CAcreateserial -out alice.crt -days 365

☄️ /var/lib/minikube/certs 是 minikube 中各类证书存放的地方,可以通过查询进程kube-controller-manager,查看它的参数 cluster-signing-cert-file 是什么来验证,在本地的 .minikube 目录里面的 ca.crt 和 ca.key 也是一样的;

🍉 题外话:

在平时使用时,如果没有 CA 的话,我们也可以自己创建一个 CA 证书:

openssl req -new -x509 -key alice.key -out ca.crt -days 3650

然后可以使用 alice 的私钥 alice.key 以及 CA 证书 ca.crt 来签发 alice 的证书 alice.crt

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey alice.key -CAcreateserial -out alice.crt

生成用户的 kubeconfig 文件

用户所需的 kubeconfig 文件可以令其以该用户的身份接入集群,需要四步:

  1. 向其中填充集群信息;

  2. 向其中填充用户的认证参数;

  3. 向其中填充上下文参数;

  4. 在其中设置默认上下文;

经过这四步后,会得到一个 alice.kubeconfig 文件,通过该文件,alice 用户添加成功。

填充集群信息

kubectl config set-cluster minikube \
--certificate-authority=~/.minikube/ca.crt \
--embed-certs=true \
--server=$(minikube ip):8443 \
--kubeconfig=alice.kubeconfig

minikube 是 minikube 生成的默认的集群名

填充用户的认证参数

kubectl config set-credentials alice \
--client-certificate=alice.crt \
--client-key=alice.key \
--embed-certs=true \
--kubeconfig=alice.kubeconfig

设置的用户名为 alice

填充上下文参数

kubectl config set-context alice \
--cluster=minikube \
--user=alice \
--namespace=default \
--kubeconfig=alice.kubeconfig

生成的上下文名字为 alice

集群使用的是名为 minikube 的集群;

用户为 alice

其使用的默认命名空间为 default

设置默认上下文

kubectl config use-context alice --kubeconfig=alice.kubeconfig

当使用 alice.kubeconfig 配置文件时,使用默认的名为 alice 中的配置内容

配置完成后的 alice.kubeconfig 文件内容大致如下:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/yangsijie/.minikube/ca.crt
    server: https://192.168.99.111:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    namespace: default
    user: alice
  name: alice
current-context: alice
kind: Config
preferences: {}
users:
- name: alice
  user:
    client-certificate-data: LS0tLS1CRU......
    client-key-data: LS0tLS1CRU......

为用户配置适当权限

经过上面的两大步骤,用户已经创建完成了,但是由于存在 RBAC 认证授权机制,此时该用户仅可以通过 认证阶段,即能够被识别为 alice 用户,但是没有相应的权限。

因此需要为其授予相应的权限,令其可以顺利的使用资源。

在本例中为其赋予了列举、查看各资源的权限,即使用 RoleBinding 将该用户与名为 view 的默认 ClusterRole 绑定:

kubectl create rolebinding view-binding-alice --clusterrole=view --user=alice

测试

下面测试使用该用户列举当前命名空间中的 Pods 资源:

🌈 ➜  kubectl --kubeconfig=alice.kubeconfig get pods
NAME             READY   STATUS    RESTARTS   AGE
pod-privileged   1/1     Running   1          102m

若想访问其他命名空间中的资源会失败:

🌈 ➜  kubectl --kubeconfig=alice.kubeconfig get pods -n foo
Error from server (Forbidden): pods is forbidden: User "alice" cannot list resource "pods" in API group "" in the namespace "foo"

Last updated

Was this helpful?