Authentication Mechanisms


关于以下几种身份验证机制的生产环境中使用的利弊分析与官方建议

X.509 客户端证书身份认证 (不推荐)

  1. 客户端证书不能被单独撤销,直到证书过期
  2. 如果证书需要被设置为无效,需要重新生成证书颁发机构的密钥,会导致集群不可用
  3. 集群中没有客户端证书的永久记录,因此无法跟踪监控使用证书的用户
  4. 用户客户端证书认证的私钥无法收到密码保护,任何能够读取包含密钥文件的人都可以使用
  5. 使用客户端证书身份认证需要直接连接 kube-apiserver,没有中间跳板节点的话,可能会使网络结构变得复杂化,如网络拓扑可能需要重新规划,安全性也需要重新考虑,维护和管理负担,扩展性会变差
  6. 客户端证书的 O(Organization)中嵌入了组数据,用户的组成员资格在证书的生命周期内无法更改,意味着一旦用户获得了 X.509 客户端证书,这个用户的组成员资格将在证书有效期内保持不变,换句话说,用户被分配到的组信息是固定的,无法通过更改证书来改变用户的组成员资格,这样做缺乏灵活性,权限管理复杂性会提升,安全性隐患,难以追踪和审计

静态 Token 文件 (不推荐)

  1. 凭据信息被以明文形式保存在磁盘上,增加了安全性风险
  2. 改变任何凭据都需要重启 kube-apiserver,引发可用性风险
  3. 没有可用的机制能让用户轮换他们的凭据,如果要轮换凭据,集群管理员需要更改在磁盘上的 Token,然后在下发给用户
  4. 没有锁定机制去阻止暴力攻击

引导 tokens (不推荐)

  1. 它们固定了不适合一般使用的硬编码组成员资格,因此不适用于用户认证目的
  2. 手动生成引导令牌可能导致弱令牌,攻击者可以猜测到,会带来安全风险
  3. 没有锁定机制来防止暴力攻击,这使得攻击者容器猜测或破解令牌

ServiceAccount secret tokens (不推荐)

在 kubernetes < 1.23 版本中,是默认选项,供集群中的工作负载进行身份认证。但是这种方式正在被TokenRequest API令牌替换,官方也不建议在生产环境中使用

  1. 不能设置过期时间,而是会在相关的服务账户被删除之前一直保持有效
  2. 身份验证令牌对于在定义它们的命名空间中读取密钥的任何集群用户都是可见的
  3. 服务账户无法被添加到任意组中,导致在使用时复杂化了 RBAC 管理

TokenRequest API tokens (不推荐)

可生成短期凭据,用于服务对 kube-apiserver 或第三方系统进行身份认证的有用工具,官方也不建议用于生产环境,因为没有可用的吊销方法,并且以安全的方式将凭据分发给用户可能也有挑战。

当使用 TokenRequest 令牌进行身份认证时,建议实现短期生命周期,以减少受到损害的令牌带来的影响。

OIDC 令牌身份认证 (推荐)

官方支持使用 OpenID Connect 令牌身份认证,将外部身份验证服务与 kube-apiserver 集成。使用 OIDC 时,需要考虑以下加固措施:

  1. 安装在集群中以支持 OIDC 身份认证的软件应该与一般工作负载隔离,因为它将以高权限运行
  2. 一些 kubernetes 托管服务对可以使用的 OIDC 提供者有限制
  3. 与 TokenRequest 令牌一样,OIDC 令牌的生命周期应该较短,以减少受到损害的令牌产生的影响

Webhook token 身份认证 (中立)

是将外部身份认证服务提供者集成到 kubernetes 中的另一种选项。该服务可以集成在集群内部或外部运行,用于进行身份认证。该机制的使用性取决于用于身份认证服务的软件,并且有一些 kubernetes 特定的考虑因素。

要配置 webhook 身份验证,需要访问控制平面服务器的文件系统。这意味着除非供应商专门提供此功能,否则在托管 kubernetes 的供应商那里将无法使用。此外,为了支持这种访问,集群中安装的任何软件都应与一般的工作负载隔离。

认证代理服务 (推荐)

使用认证代理将外部身份认证系统集成到 kubernetes 集群中的另一种选项。通过这种机制,kubernetes 期望从代理接受请求,并在请求中设置特定的头部值,只是用于授权目的的用户名和组成员资格。这种机制也需要考虑一些特定的考虑因素。

  1. 必须在代理和 kube-apiserver 之间使用 TLS 连接,以减轻流量拦截或嗅探攻击的风险,这确保了代理和 kube-apiserver 之间的通信时安全的
  2. 需要注意能够修改请求头的攻击者可能会未经授权地访问 kubernetes 资源,因此重要的是确保请求头被正确的保护,并且不能被篡改。

其他的认证授权

Webhook 并不是一种特定的身份认证机制,而是一种用于集成外部身份认证提供者到 kubernetes 集群中的机制。通过 webhook,kubernetes 可以与外部的身份认证服务通信,以获取身份认证决策。这个外部的身份验证服务可以是在集群内部或外部运行的任何类型的服务,例如 OAuth 2.0 提供者,LDAP 等。

OAuth2.0 是一种授权框架,不是一种身份认证协议,主要用于用户授权。虽然 OAuth2.0 可以用于身份认证,但它通常与 OIDC 结合使用,以提供完整的身份认证和授权解决方案。OAuth2.0 与 Webhook 结合使用,以便将 OAuth2.0 或 OIDC 身份认证服务集成到 kubernetes 集群中。

LDAP(轻量级目录访问协议)是一种用于访问和维护分布式目录信息服务的开放标准协议。它通常用在网络中分布式存储组织的信息,例如用户信息、组织结构和网络资源等。