Kubernetes 认证

    目前,Kubernetes 支持以下认证插件:

    • X509 证书
    • 静态 Token 文件
    • 引导 Token
    • 静态密码文件
    • Service Account
    • OpenID
    • Webhook
    • 认证代理
    • OpenStack Keystone 密码

    使用 X509 客户端证书只需要 API Server 启动时配置 --client-ca-file=SOMEFILE。在证书认证时,其 Common Name(CN)域用作用户名,而 Organization(O)域则用作 group 名。

    创建一个客户端证书的方法为:

    接着,就可以使用 username.key 和 username.crt 来访问集群:

    1. # Config cluster
    2. kubectl config set-cluster my-cluster --certificate-authority=ca.pem --embed-certs=true --server=https://<APISERVER_IP>:6443
    3. # Config credentials
    4. kubectl config set-credentials username --client-certificate=username.crt --client-key=username.key --embed-certs=true
    5. # Config context
    6. kubectl config set-context username --cluster=my-cluster --user=username
    7. # Config RBAC if it's enabled
    8. # Finally, switch to new context
    9. kubectl config use-context username

    静态 Token 文件

    使用静态 Token 文件认证只需要 API Server 启动时配置 --token-auth-file=SOMEFILE。该文件为 csv 格式,每行至少包括三列 token,username,user id,后面是可选的 group 名,比如

    1. token,user,uid,"group1,group2,group3"

    客户端在使用 token 认证时,需要在请求头中加入 Bearer Authorization 头,比如

    引导 Token

    引导 Token 是动态生成的,存储在 kube-system namespace 的 Secret 中,用来部署新的 Kubernetes 集群。

    使用引导 Token 需要 API Server 启动时配置 --experimental-bootstrap-token-auth,并且 Controller Manager 开启 TokenCleaner --controllers=*,tokencleaner,bootstrapsigner

    静态密码文件

    需要 API Server 启动时配置 --basic-auth-file=SOMEFILE,文件格式为 csv,每行至少三列 password, user, uid,后面是可选的 group 名,如

    1. password,user,uid,"group1,group2,group3"

    客户端在使用密码认证时,需要在请求头重加入 Basic Authorization 头,如

    1. Authorization: Basic BASE64ENCODED(USER:PASSWORD)

    ServiceAccount 是 Kubernetes 自动生成的,并会自动挂载到容器的 /var/run/secrets/kubernetes.io/serviceaccount 目录中。

    在认证时,ServiceAccount 的用户名格式为 system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT),并从属于两个 group:system:serviceaccountssystem:serviceaccounts:(NAMESPACE)

    OpenID

    OpenID 提供了 OAuth2 的认证机制,是很多云服务商(如 GCE、Azure 等)的首选认证方法。

    使用 OpenID 认证,API Server 需要配置

    • --oidc-issuer-url,如 https://accounts.google.com
    • --oidc-client-id,如 kubernetes
    • --oidc-username-claim,如 sub
    • --oidc-groups-claim,如 groups
    • --oidc-ca-file,如 /etc/kubernetes/ssl/kc-ca.pem

    Webhook

    API Server 需要配置

    配置文件格式为

    1. clusters:
    2. - name: name-of-remote-authn-service
    3. # CA for verifying the remote service.
    4. certificate-authority: /path/to/ca.pem
    5. # URL of remote service to query. Must use 'https'.
    6. server: https://authn.example.com/authenticate
    7. # users refers to the API server's webhook configuration.
    8. users:
    9. - name: name-of-api-server
    10. user:
    11. # cert for the webhook plugin to use
    12. client-certificate: /path/to/cert.pem
    13. # key matching the cert
    14. client-key: /path/to/key.pem
    15. # kubeconfig files require a context. Provide one for the API server.
    16. current-context: webhook
    17. contexts:
    18. - context:
    19. cluster: name-of-remote-authn-service
    20. user: name-of-api-sever
    21. name: webhook

    Kubernetes 发给 webhook server 的请求格式为

    1. {
    2. "apiVersion": "authentication.k8s.io/v1beta1",
    3. "kind": "TokenReview",
    4. "spec": {
    5. "token": "(BEARERTOKEN)"
    6. }
    7. }

    认证代理

    API Server 需要配置

    需要 API Server 在启动时指定 --experimental-keystone-url=<AuthURL>,而 https 时还需要设置 --experimental-keystone-ca-file=SOMEFILE

    不支持 Keystone v3

    目前只支持 keystone v2.0,不支持 v3(无法传入 domain)。

    匿名请求

    如果使用 AlwaysAllow 以外的认证模式,则匿名请求默认开启,但可用 --anonymous-auth=false 禁止匿名请求。

    匿名请求的用户名格式为 system:anonymous,而 group 则为 。

    Credential Plugin

    从 v1.11 开始支持 Credential Plugin(Beta),通过调用外部插件来获取用户的访问凭证。这是一种客户端认证插件,用来支持不在 Kubernetes 中内置的认证协议,如 LDAP、OAuth2、SAML 等。它通常与 Webhook 配合使用。

    Credential Plugin 可以在 kubectl 的配置文件中设置,比如

    1. apiVersion: v1
    2. kind: Config
    3. users:
    4. - name: my-user
    5. user:
    6. exec:
    7. # Command to execute. Required.
    8. command: "example-client-go-exec-plugin"
    9. # API version to use when decoding the ExecCredentials resource. Required.
    10. #
    11. # The API version returned by the plugin MUST match the version listed here.
    12. #
    13. # To integrate with tools that support multiple versions (such as client.authentication.k8s.io/v1alpha1),
    14. apiVersion: "client.authentication.k8s.io/v1beta1"
    15. # Environment variables to set when executing the plugin. Optional.
    16. env:
    17. - name: "FOO"
    18. value: "bar"
    19. # Arguments to pass when executing the plugin. Optional.
    20. args:
    21. - "arg1"
    22. - "arg2"
    23. clusters:
    24. - name: my-cluster
    25. cluster:
    26. server: "https://172.17.4.100:6443"
    27. certificate-authority: "/etc/kubernetes/ca.pem"
    28. contexts:
    29. - name: my-cluster
    30. context:
    31. cluster: my-cluster
    32. current-context: my-cluster

    具体的插件开发及使用方法请参考 。

    开源工具

    如下的开源工具可以帮你简化认证和授权的配置: