使用 Azure AD 进行 Azure Kubernetes 服务身份验证

时间:2023-02-06 17:18:36


对Kubernetes熟悉的朋友应该都清楚,Kubernetes不提供任何用于定义和管理用户的内置机制。默认情况下,如果我们想在Kubernetes中为用户创建账户,则管理员必须为每个用户创建一个由群集证书颁发机构签名的X509证书,该证书位于群集本地,称为本地账户,然后需要使用K8S RBAC进行授权,经授权后,用户即可对群集资源执行操作。

这种使用本地账户(创建证书)进行用户身份管理的式对于群集用户的维护而言无疑是复杂的,每增加一个用户,管理员就需要创建一张证书,并且在后续的使用过程中,还需要去维护这张证书的生命周期从而达到维护用户账户的目的。这种方式在企业环境中一般是不推荐使用的,那是否有方式让我们可以更轻松的管理用户呢,答案肯定是有的。

其实Kubernetes除了提供客户端证书的认证策略以外,也提供使用OpenID Connect令牌的方式进行用户身份验证。这也就意味着可以通过使用 OpenID Connect 向 AKS 群集提供 Azure AD 身份验证。通过 Azure AD 集成增强 AKS 群集安全性。 Azure AD 基于数十年的企业标识管理经验,它是一种基于云的多租户目录,也是一种将核心目录服务、应用程序访问管理和标识保护相结合的标识管理服务。 借助 Azure AD,可以将本地标识集成到 AKS 群集中,提供帐户管理和安全性的单一源。

使用 Azure AD 进行 Azure Kubernetes 服务身份验证

当AKS群集配置了Azure AD集成以后,可以授予Azure AD内的用户或组对群集命名空间内或跨集群的 Kubernetes 资源的访问权限。一般配置集成以后,用户需要获取kubectl的配置文件时,需要运行az aks get-credentials命令,或者当用户使用kubectl与 AKS 群集交互时,系统会提示他们使用其 Azure AD 凭据登录。

在进行用户身份验证时,Azure AD 身份验证通过 OpenID Connect 提供给 AKS 群集。OpenID Connect 是建立在 OAuth 2.0 协议之上的身份层。在 Kubernetes 集群内部,会使用Webhook 令牌身份验证来验证身份验证令牌。Webhook 令牌身份验证作为 AKS 群集的一部分进行配置和管理。

使用 Azure AD 进行 Azure Kubernetes 服务身份验证

当用户执行身份验证时,API服务调用AKS Webhook服务器并执行以下步骤:

  • kubectl 使用 Azure AD 客户端应用程序,通过 OAuth 2.0 设备授权授予流来登录用户
  • Azure AD 提供 access_token、id_token 和 refresh_token
  • 用户使用 kubeconfig 中的 access_token 来向 kubectl 发出请求
  • kubectl 将 access_token 发送到 API 服务器
  • API 服务器配置身份验证 WebHook 服务器来执行验证
  • 身份验证 Webhook 服务器将检查 Azure AD 公共签名密钥,以确认 JSON Web 令牌签名有效
  • 服务器应用程序使用用户提供的凭据从 MS Graph API 查询已登录用户的组成员身份
  • 将向 API 服务器发送一个响应,其中包含用户信息,例如访问令牌的用户主体名称 (UPN) 声明,以及基于对象 ID 的用户的组成员身份
  • API 基于 Kubernetes Role/RoleBinding 执行授权决策
  • 授权后,API 服务器会将响应返回到 kubectl
  • kubectl 向用户提供反馈

通过上述内容可以看到,当AKS群集配置了Azure AD集成以后,可极大的简化用户身份管理的过程,降低管理人员的运维复杂度,更好的符合企业级的身份管理特征。