对Kubernetes熟悉的朋友应该都清楚,Kubernetes不提供任何用于定义和管理用户的内置机制。默认情况下,如果我们想在Kubernetes中为用户创建账户,则管理员必须为每个用户创建一个由群集证书颁发机构签名的X509证书,该证书位于群集本地,称为本地账户,然后需要使用K8S RBAC进行授权,经授权后,用户即可对群集资源执行操作。
这种使用本地账户(创建证书)进行用户身份管理的式对于群集用户的维护而言无疑是复杂的,每增加一个用户,管理员就需要创建一张证书,并且在后续的使用过程中,还需要去维护这张证书的生命周期从而达到维护用户账户的目的。这种方式在企业环境中一般是不推荐使用的,那是否有方式让我们可以更轻松的管理用户呢,答案肯定是有的。
其实Kubernetes除了提供客户端证书的认证策略以外,也提供使用OpenID Connect令牌的方式进行用户身份验证。这也就意味着可以通过使用 OpenID Connect 向 AKS 群集提供 Azure AD 身份验证。通过 Azure AD 集成增强 AKS 群集安全性。 Azure AD 基于数十年的企业标识管理经验,它是一种基于云的多租户目录,也是一种将核心目录服务、应用程序访问管理和标识保护相结合的标识管理服务。 借助 Azure AD,可以将本地标识集成到 AKS 群集中,提供帐户管理和安全性的单一源。
当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 群集的一部分进行配置和管理。
当用户执行身份验证时,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集成以后,可极大的简化用户身份管理的过程,降低管理人员的运维复杂度,更好的符合企业级的身份管理特征。