Files
kuboard-press/learning/k8s-advanced/sec/authenticate/readme.md

90 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 180
layout: LearningLayout
description: Kubernetes教程_除了ServiceAccount以外Kubernetes不提供任何形式的用户认证方式如果需要使用用户名密码登录Kubernete/Kuboard可以通过OpenID Connect、Webhook Token等形式进行用户认证
meta:
- name: keywords
content: Kubernetes 教程,Kubernetes 授权,Kubernetes authentication,Kubernetes用户名密码
---
# 用户认证概述
<AdSenseTitle/>
> 参考文档: [Authenticating](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)
## Users in Kubernetes
所有的 Kubernetes 集群都有两类用户Kubernetes 管理的 Service Account 和普通用户。
普通用户由 Kubernetes 集群之外的独立服务管理,例如 keycloak、LDAP、OpenID Connect Identity ProviderGoogle Account、MicroSoft Account、GitLab Account等。此类服务对用户的注册、分组、密码更改、密码策略、用户失效策略等有一系列管控过程或者也可以简单到只是一个存储了用户名密码的文件。Kubernetes 中,没有任何对象用于代表普通的用户账号,普通用户也不能通过 API 调用添加到 Kubernetes 集群。
与普通用户相对,[Service Account](/learning/k8s-advanced/sec/sa-admin.html) 是通过 Kubernetes API 管理的用户。Service Account 是名称空间级别的对象,可能由 ApiServer 自动创建,或者通过调用 API 接口创建。Service Account 都绑定了一组 `Secret`Secret 可以被挂载到 Pod 中,以便 Pod 中的进程可以获得调用 Kubernetes API 的权限。
对 API Server 的每次接口调用都被认为是:
* 由一个普通用户或者一个 Service Account 发起
* 或者是由一个匿名用户发起。
这意味着,集群内外的任何一个进程,在调用 API Server 的接口时,都必须认证其身份,或者被当做一个匿名用户。可能的场景有:
* 集群中某一个 Pod 调用 API Server 的接口查询集群的信息
* 用户通过 kubectl 执行指令kubectl 调用 API Server 的接口完成用户的指令
* 用户通过 Kuboard 界面管理集群Kuboard 调用 API Server 的接口实现界面上的功能
::: tip 授权
* **认证过程** 指的是 API Server 如何识别发起 API 请求的用户(进程)的身份;
* **授权过程** 指的是 API Server 在识别请求发起者身份之后,判断发起者是否可以执行该接口请求。
:::
## 认证策略
Kubernetes 的认证策略Authentication Strategies通过 authentication plugin 认证发起 API 请求的用户身份,认证方式有 client certificates、bearer tokens、authenticating proxy、HTTP basic auth。当 API Server 接收到 HTTP 请求时authentication plugin 会尝试将如下属性附加到请求:
* **Username**:唯一标识用户的一个字符串。例如 `kube-admin` 或者 `jane@example.com`
* **UID**:唯一标识用户的一个字符串,相较于 username提供更强的一致性和唯一性。某些 Identity Provider 可能允许用户更改 username
* **Groups**:一组字符串,标识用户所属的用户组
* **额外字段**Key,Value 都是 String 的 Map包含一些 对 [authorizer](../authorizer/readme.html) 可能有用的信息
上述所有的字段对认证系统来说都是透明的,且只对 [authorizer](../authorizer/readme.html) 有意义authentication plugin 将认证结果中的某些字段赋值到上述字段中,认证系统只是按照自己的方式正常工作,并不知道上述这些字段的存在)。这使得 Kubernetes 可以同时支持多种认证方式,在实际工作中,您通常应该至少配置两种认证方式:
* Service account tokens 用于认证 Service Account
* 至少另外一种认证方式用于认证普通用户。
当多个认证模块被启用时第一个成功对请求进行认证的模块将终止认证过程。API Server 并不确保认证模块的调用顺序。
Group `system:authenticated` 将被包含到所有已认证用户的 `Groups` 字段中。
Kubernetes 还可以使用 [authenticating proxy](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#authenticating-proxy) 或者 [authentication webhook](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication) 集成其他的认证协议例如LDAP、SAML、Kerberos、alternate x509 shcemes 等)。
具体来说Kubernetes 支持的认证方式有:
* [X509 Client Certs](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#x509-client-certs)
* [Static Token File](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-token-file)
* [Bootstrap Tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#bootstrap-tokens)
* [Static Password File](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-password-file)
* [Service Account Tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#service-account-tokens) <Badge>Kuboard v1.0.0</Badge>
* [OpenID Connect Tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens) <Badge>Kuboard v1.0.6-beta.7</Badge>
* [Webhook Token Authentication](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)
* [Authenticating Proxy](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#authenticating-proxy)
## Kuboard 认证方式
Kuboard 支持两种形式的认证:
* Service Account <Badge>Kuboard v1.0.0</Badge>
* 在任意 Kubernetes 集群安装 Kuboard 之后,默认的 Kuboard 认证登录方式
* 登录 Kuboard 后,在当前用户信息页可以获得使用当前用户身份登录 kubectl 的配置参数
* OpenID Connect <Badge>Kuboard v1.0.6-beta.7</Badge>
* 在任意 Kubernetes 集群安装 Kuboard 之后,通过 [OpenID Connect 配置向导](./install.html) 可以激活此认证登录方式
* 可以直连 OpenID Connect Provider例如 keycloak
* 可以通过 [Dex](https://github.com/dexidp/dex) 连接更多类型的 Identity Provider
* 已经验证的有:
* github.com
* Github Enterprise
* gitlab.com
* GitLab CE
* GitLab Enterprise
* 正在验证的有:
* LDAP
* 通过 OpenID Connect 登录 Kuboard 后,在当前用户信息页可以获得使用当前用户身份登录 kubectl 的配置参数
上述两种认证方式可以并存,可以通过 Dex 同时连接多个 Identity Provider。Service Account的认证方式为 Kubernetes 内置认证方式任何情况下都是可用的。OpenID Connect 依赖于集群之外的 Identity Provider 服务,即使在 Identity Provider 服务不可用的情况下Kubernetes 仍然可以正常启动和工作,可以通过 Service Account 登录 Kuboard / Kubernetes待 Indentity Provider 服务可用之后,就可以使用 OpenID Connect 登录 Kuboard / Kubernetes。
Kubernetes 的上述特性不会为系统引入额外的高可用故障点。