1 OpenID Connect(OIDC)介绍
OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在其他服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。OAuth 在全世界得到了广泛的应用,目前的版本是 2.0 。
OpenID Connect (OIDC) 是一种身份验证协议,基于 OAuth 2.0 系列规范。OAuth2 提供了 access_token
来解决授权第三方客户端访问受保护资源的问题,OpenID Connect 在这个基础上提供了 id_token
来解决第三方客户端标识用户身份的问题。
OpenID Connect 的核心在于,在 OAuth2 的授权流程中,同时提供用户的身份信息(id_token
)给到第三方客户端。id_token
使用JWT(JSON Web Token)格式进行封装,得益于 JWT 的自包含性,紧凑性以及防篡改机制等特点,使得 id_token
可以安全地传递给第三方客户端程序并且易于验证。
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含 的协议格式,用于在通信双方间传递 JSON 对象,传递的信息经过数字签名可以被验证和信任。想要了解 JWT 的详细内容参见 JWT(JSON Web Token)。
2 Kubernetes OpenID Connect 认证流程
在 Kubernetes 中 OpenID Connect 的认证流程如下:
- 1.用户登录认证服务器。
- 2.认证服务器返回
access_token
、id_token
和refresh_token
。 - 3.在使用 kubectl 时,将
id_token
设置为--token
的参数值,或者将其直接添加到 kubeconfig 中。 - 4.kubectl 将
id_token
添加到 HTTP 请求的Authorization
头部中,发送给 API Server。 - 5.API Server 通过检查配置中引用的证书来确认 JWT 的签名是否合法。
- 6.API Server 检查 id_token 是否过期。
- 7.API Server 确认用户是否有操作资源的权限。
- 8.鉴权成功之后,API 服务器向 kubectl 返回响应。
- 9.kubectl 向用户返回结果。
3 Keycloak 介绍
本文将会使用 Keycloak 作为 OpenID Connect 的认证服务器。keycloak 是一个开源的、面向现代应用和服务的 IAM(身份认证和访问控制)解决方案。Keycloak 提供了单点登录(SSO)功能,支持 OpenID Connect
、OAuth 2.0
、SAML 2.0
等协议,同时 Keycloak 也支持集成不同的身份认证服务,例如 LDAP、Active Directory、Github、Google 和 Facebook 等等。
在 Keycloak 中有以下几个主要概念:
- 领域(realms):领域管理着一批用户、证书、角色、组等等,不同领域之间的资源是相互隔离的,实现了多租户的效果。
- 客户端(clients):需要接入 Keycloak 实现用户认证的应用和服务。
- 用户(users):用户是能够登录到应用系统的实体,拥有相关的属性,例如电子邮件、用户名、地址、电话号码和生日等等。
- 组(groups):一组用户的集合,你可以将一系列的角色赋予定义好的用户组,一旦某用户属于该用户组,那么该用户将获得对应组的所有角色权限。
- 角色(roles):角色是 RBAC 的重要概念,用于表明用户的身份类型。
- 证书(credential):Keycloak 用于验证用户的凭证,例如密码、一次性密码、证书、指纹等等。
4 前提条件
接下来的章节将演示如何部署和配置 Keycloak 服务作为 API Server 的认证服务,需要确保完成了以下准备:
- 部署好一套 Kubernetes 集群,我使用的集群版本是 v1.23.5。
- 一台安装好 Docker 和 Docker Compose 的机器,用于部署 Keycloak 服务器。
本实验使用的配置文件可以在:https://github.com/cr7258/kubernetes-guide/tree/master/authentication/openid 中获取。