authentication - 带证书的 Kubernetes 身份验证

标签 authentication ssl jenkins kubernetes kubernetes-security

我正在尝试使用证书对本地托管的 Kubernetes 集群 (v1.6.4) 进行身份验证。 这参与了使用 Kubernetes plugin for Jenkins 的上下文.

我正在遵循 Kubernetes-plugin README 中的 Minikube 指南我适应我的场景的文件:

  1. 将客户端证书转换为 PKCS:

    $ sudo openssl pkcs12 -export -out kubernetes.pfx -inkey /etc/kubernetes/pki/apiserver.key -in /etc/kubernetes/pki/apiserver.crt -certfile /etc/kubernetes/pki/ca.crt -passout pass:jenkins
    
  2. 在 Jenkins 中,使用证书创建凭据

    1. 种类:证书
    2. 证书:上传PKCS#12证书并上传文件kubernetes.pfx
    3. 密码:jenkins(在创建证书时指定)
  3. 管理 Jenkins -> 添加新云 -> Kubernetes
    1. Kubernetes URL:https://10.179.1.121:6443(由 kubectl config view 输出)
    2. Kubernetes server certificate key:粘贴/etc/kubernetes/pki/ca.crt的内容。
    3. 禁用 https 证书检查:选中是因为测试设置没有签名证书
    4. Kubernetes 命名空间:尝试了 defaultkubernetes-plugin
    5. 凭据:CN=kube-apiserver(即上面创建的凭据)

现在,当我点击 Test Connection 时,这是 Jenkins Web UI 中显示的错误消息:

Error connecting to https://10.179.1.121:6443: Failure executing: GET at: https://10.179.1.121:6443/api/v1/namespaces/kubernetes-plugin/pods. Message: Unauthorized.

Jenkins 日志显示此消息:

Sep 05, 2017 10:22:03 AM io.fabric8.kubernetes.client.Config tryServiceAccount

WARNING: Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.

遗憾的是,该文档主要限于在 Minikube 上运行的 Kubernetes 和 Google Cloud Engine,但我看不出前者与本地托管的 Kubernetes 集群在概念上有什么区别。

以下 Curl 测试调用会产生截然不同的错误消息:

$ curl --insecure --cacert /etc/kubernetes/pki/ca.crt --cert kubernetex.pfx:secret https://10.179.1.121:6443
User "system:anonymous" cannot get  at the cluster scope. 

更详细:

$ curl -v --insecure --cacert /etc/kubernetes/pki/ca.crt --cert kubernetex.pfx:secret https://10.179.1.121:6443
* About to connect() to 10.179.1.121 port 6443 (#0)
*   Trying 10.179.1.121...
* Connected to 10.179.1.121 (10.179.1.121) port 6443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* NSS: client certificate not found: kubernetex.pfx
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=kube-apiserver
*   start date: Jun 13 11:33:55 2017 GMT
*   expire date: Jun 13 11:33:55 2018 GMT
*   common name: kube-apiserver
*   issuer: CN=kubernetes
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.179.1.121:6443
> Accept: */*
> 
< HTTP/1.1 403 Forbidden
< Content-Type: text/plain
< X-Content-Type-Options: nosniff
< Date: Tue, 05 Sep 2017 10:34:23 GMT
< Content-Length: 57
< 
* Connection #0 to host 10.179.1.121 left intact

我还设置了一个 ServiceAccount:

$ kubectl describe serviceaccount --namespace=kubernetes-plugin 
Name:       default
Namespace:  kubernetes-plugin
Labels:     <none>
Annotations:    <none>

Image pull secrets: <none>

Mountable secrets:  default-token-6qwj1

Tokens:             default-token-6qwj1



Name:       jenkins
Namespace:  kubernetes-plugin
Labels:     <none>
Annotations:    <none>

Image pull secrets: <none>

Mountable secrets:  jenkins-token-1d623

Tokens:             jenkins-token-1d623

This question处理相关问题,建议使用 ServiceAccount 或证书,但后一种方法的答案缺少有关如何将 RBAC 配置文件绑定(bind)到该证书的详细信息。 Kubernetes documentation about authentication似乎没有涵盖这个用例。

最佳答案

WARNING: Error reading service account token 表示用于加密 ServiceAccount token 的 key 在 kube-apiserver (--service-account-key-file) 和 kube-controller-manager 之间不同(--服务账户私钥文件)。如果您的 kube-apiserver 命令行未指定 --service-account-key-file 则使用 --tls-private-key-file 的值,我怀疑这是问题所在。

我建议始终显式设置 kube-apiserver --service-account-key-file 以匹配 kube-controller-manager --service-account-private-key-file 值。

关于authentication - 带证书的 Kubernetes 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46052916/

相关文章:

私有(private)软件的 SSL 方法

amazon-web-services - https SSL AWS ELB 单实例

performance - 什么会延迟 Jenkins 服务器和 SSL SVN 服务器(均无法访问互联网)之间的握手?

windows - Libcurl - 使用 native Windows 加密的客户端 SSL 身份验证 - 可能吗?

java - 通过java锁定在oracle中登录的用户

javascript - 在网络软件中启用辅助用户帐户

jenkins - SonarQube 未在 Gradle 多项目中显示 JUnit 测试的测试 Jacoco 覆盖率

C# 登录并上传到 OneDrive 无需用户交互

c++ - 创建自己签名的 OpenSSL 证书

Jenkins 亚马逊 ECR : no basic auth credentials