K3s - 使用客户端证书创建用户

Posted

技术标签:

【中文标题】K3s - 使用客户端证书创建用户【英文标题】:K3s - create user with client certificate 【发布时间】:2020-05-13 09:45:36 【问题描述】:

我尝试使用客户端证书创建用户帐户。

我遵循了两个教程,但在消息错误中坚持使用这两个选项

https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe

https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/

我设置了正确的用户、服务器和正确的上下文。我设置了命名空间,但仍然是同样的错误。

> kubectl get pods
You must be logged in to the server (Unauthorized) 

是否有人已经经历过类似的事情?还是有人知道我做错了什么?

我的k3s集群版本是1.15.4。

【问题讨论】:

您可以使用刚刚创建的用户登录吗? 我按照设置,就像写在这个页面上一样,但它看起来与 k3s 安装不同。也许我犯了很多次错误?!不确定,如果我是盲人并且看不到我做错了什么。 【参考方案1】:

我终于在这张票里找到了答案。

https://github.com/rancher/k3s/issues/684

用户huapox贴出如下代码:

[root@(⎈ |default:default) sec-rbac]$ cat t2.sh 
ws=/opt/sec-rbac
day=3650

clus_name="t1.k3s"
clus_ns="default"
user="koper"
#clus_url="https://10.200.100.183:7442"
clus_url="https://server:6443"  ##
ca_path=$ws/server/tls
rm -f $ca_path/*-ca.srl

ctx=gen && mkdir -p $ws/$ctx/kube,keys && cd $ws/$ctx
#############
ca1=client-ca
generate="keys/u-"$user
echo -e "\033[32m#>>GEN-KEY\033[0m"
#openssl genrsa -out $generate.key 2048
openssl ecparam -name prime256v1 -genkey -noout -out $generate.key
openssl req -new -key $generate.key -out $generate.csr -subj "/CN=$user@$clus_name/O=key-gen"
openssl x509 -req -in $generate.csr -CA $ca_path/$ca1.crt -CAkey $ca_path/$ca1.key -CAcreateserial -out $generate.crt -days $day

#-----------
#generate=$ca_path/client-admin  ##test
ca2=server-ca
embed=false
ctx2="$user@$clus_name"
config="kube/$user.kubeconfig"
echo -e "\033[32m#>>KUBE-CONFIG\033[0m" 
kubectl --kubeconfig=$config config set-cluster $clus_name --embed-certs=$embed --server=$clus_url --certificate-authority=$ca_path/$ca2.crt
kubectl --kubeconfig=$config config set-credentials $user --embed-certs=$embed --client-certificate=$generate.crt  --client-key=$generate.key
kubectl --kubeconfig=$config config set-context $ctx2 --cluster=$clus_name --namespace=$clus_ns --user=$user
kubectl --kubeconfig=$config config set current-context $ctx2
kubectl --kubeconfig=$config --context=$ctx2 get pods

非常感谢 huapox。

【讨论】:

【参考方案2】:

根据您发布的错误,您的用户仅在身份验证阶段失败(HTTP 错误代码:401),您可以使用以下方法进行验证:

$ k get pods -v=6
...
I0123 16:34:18.842853   29373 helpers.go:203] server response object: [
  ...
  "code": 401
]
F0123 16:34:18.842907   29373 helpers.go:114] error: You must be logged in to the server (Unauthorized)

使用以下步骤调试您的设置:

    验证您使用的是正确的上下文和正确的用户(在 CURRENT 列中带有 *):

    $ kubectl config get-contexts 
    CURRENT   NAME                          CLUSTER      AUTHINFO                NAMESPACE
    *         context-user-ca-signed        kubernetes   user-user-ca-signed     ns1
              kubernetes-admin@kubernetes   kubernetes   kubernetes-admin        
    

    验证 Kubernetes API Server 的 CA 证书(假设 API Server 作为 Pod 运行):

    $ sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep -i "\-\-client-ca-file"
        - --client-ca-file=/etc/kubernetes/pki/ca.crt
    
    $ openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout | grep -i "Issuer:\|Subject:"
            Issuer: CN = kubernetes
            Subject: CN = kubernetes
    

    验证您的用户证书是否由上述CA签署(用户证书的Issuer CN与CA证书的Subject CN相同,此处为“kubernetes”),在API server中配置:

    $ kubectl config view --raw -o jsonpath=".users[?(@.name == \"user-user-ca-signed\")].user.client-certificate-data" | base64 -d > client.crt
    
    $ openssl x509 -in client.crt -text -noout | grep -i "Issuer:\|Subject:"
            Issuer: CN = kubernetes
            Subject: C = IN, ST = Some-State, O = Some-Organization, CN = user-ca-signed
    

如果上述步骤对您创建的用户来说没问题,您应该通过Authentication 阶段。 但是Authorization阶段仍然需要使用RBAC、ABAC或其他任何支持的授权模式进行配置,否则你仍然可能得到HTTP错误码:403

$ kubectl get pods -v=6
I0123 16:59:41.350501   28553 helpers.go:203] server response object: [
  ...
  "code": 403
]
F0123 16:59:41.351080   28553 helpers.go:114] Error from server (Forbidden): pods is forbidden: User "user-ca-signed" cannot list resource "pods" in API group "" in the namespace "ns1": No policy matched.

【讨论】:

您好 Ramesh,首先非常感谢您的详细回答。不幸的是,k3s 中的配置文件有点不同。我找到了以下文件,希望它是默认 kubernetes 安装的挂件。在此处找到该文件:/var/lib/rancher/k3s/server/cred/api-server.kubeconfig 但它不包含 client-ca-file 条目。相反,我有一个 client-certificate: /var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt 和一个 certificate-authority: /var/lib/rancher/k3s/server/tls/server-ca.crt 哦,client-kube-apiserver.crt 中的 issuere 是另一个。有趣的是,我请求了一个带有 kubectl 的 csr 并且也批准了它。然后提取了crt,结果还是另一个。

以上是关于K3s - 使用客户端证书创建用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenSSL 为 Postgresql DB 的多个用户创建客户端证书?

Flutter / Dart语言中的客户端证书身份验证

十一,k8s集群访问控制之ServicAccount

k3s 证书过期解决方法

通过签署 CSR 创建 x509 v3 用户证书

Kubernetes (k3s):集群上的过期证书