API Server 作为 Kubernetes 的网关,是用户访问和管理资源对象的入口。对于每个访问请求, API Server 都需要对访问者的合法性进行检查,包括身份验证、权限验证等等。Kubernetes 支持多种身份验证的方式,本文将对 OpenID Connect 认证进行介绍。
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 中获取。
5 部署 Keycloak 服务器
Kubernetes 要求使用的 OpenID Connect 认证服务必须是 HTTPS 加密的,运行以下脚本生成 Keycloak 服务器的私钥和证书签名请求,并使用 Kubernetes 的 CA 证书进行签发,当然这里你也可以另外生成自己的 CA 证书进行签发,如果这样做的话,请注意在 7.1 启用 OpenID Connect 认证章节中将 CA 证书挂载进 API Server 容器中。
#!/bin/bash
# 创建目录存放生成的证书
mkdir -p ssl
# 生成 x509 v3 扩展文件
cat << EOF > ssl/req.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = IP:11.8.36.25 # Keycloak 服务器的 IP 地址
EOF
# 生成 Keycloak 服务器私钥
openssl genrsa -out ssl/tls.key 2048
# 生成 Keycloak 服务器证书签名请求(CSR)
openssl req -new -key ssl/tls.key -out ssl/tls.csr -subj "/CN=Keycloak" -config ssl/req.cnf
# 使用 CA 签发 Keycloak 服务器证书
openssl x509 -req -in ssl/tls.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ssl/tls.crt -days 10 -extensions v3_req -extfile ssl/req.cnf
这里使用 docker-compose 部署 Keycloak 以及依赖的数据库 PostgreSQL,docker-compose.yml 文件如下。需要将上面生成的服务器证书 tls.crt 和服务器私钥 tls.key 两个文件挂载到 Keycloak 容器的 /etc/x509/https 目录中。
version: '2'
services:
postgres:
image: postgres:12.2
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: keycloak
keycloak:
image: jboss/keycloak:16.1.1
environment:
DB_VENDOR: POSTGRES
DB_ADDR: postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD: keycloak
KEYCLOAK_USER: admin # 用户名
KEYCLOAK_PASSWORD: czw123456 # 密码
volumes:
- ./ssl:/etc/x509/https # 将服务器证书和私钥挂载到容器中
ports:
- 80:8080
- 443:8443
depends_on:
- postgres
在后台启动 Keycloak 容器。
docker-compose up -d
确认 Keycloak 和 PostgreSQL 已经成功启动。
docker-compose ps

浏览器输入 https://<IP 地址>:8443,访问 Keycloak 界面,用户名:admin,密码:czw123456。

6 配置 Keycloak
6.1 创建 Realm
首先,创建一个名称为 project-1 的 Realm(领域)。


6.2 创建 User
接下来手动创建一个用户。

用户名设置为 tom。

设置用户的密码,将 Temporary 参数置为 OFF,表示用户在第一次登录时无需重新设置密码。

为用户添加属性 name,值设置为 tom,在 6.3 创建 Client 章节中会说明为什么这么做。

查看创建的用户。

本文详细介绍了如何在Kubernetes中集成OpenIDConnect协议,通过Keycloak实现单点登录和用户权限管理,包括OAuth2.0和OpenIDConnect的区别、Kubernetes认证流程、Keycloak的部署及配置,以及使用kubectl和kubelogin进行身份验证的方法。

1318

被折叠的 条评论
为什么被折叠?



