This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
1. Overview
Keycloak 是一种用于现代应用程序和服务的开源身份和访问管理解决方案。 开发人员通常要求编写的安全功能是开箱即用的,并且很容易根据组织的要求进行定制化,Keycloak提供登录、注册、管理和帐户管理提供可定制的用户界面,支持单点登录 (SSO)、用户注册和用户联合等用例,Keycloak 也可以作为一个集成平台,将其连接到现有的 LDAP 和 Active Directory 服务器。还可以将身份验证委托给第三方身份提供商,例如 Github 和 Google。
Keycloak 软件主要包括以下特点:
1. 单点登录:支持OpenID Connect、OAuth 2.0、SAML 2.0等标准协议。
2. 身份和访问管理:提供用户联合、强认证、用户管理、细粒度授权等。可以将身份验证添加到应用程序和服务中,而无需处理存储用户或验证用户。
该解决方案允许您在 Amazon Web Services Cloud 上快速部署 Keycloak 集群。
2. Terminology
下表列出了与此解决方案相关的协议术语
| 术语 | 全名 | 说明 |
|---|---|---|
| SSO | Single-Sign On | 单点登录 (SSO) 是一种身份验证方案,允许用户使用单个 ID 登录到多个相关但独立的软件系统中的任何一个。 |
| SAML | Security Assertion Markup Language | 安全断言标记语言是一种开放标准,用于在各方之间,特别是在身份提供者和服务提供者之间交换身份验证和授权数据。 SAML 是一种基于 XML 的标记语言,用于安全断言(服务提供商用来做出访问控制决策的声明)。 |
OpenID
|
OpenID
|
OpenID 是由非营利组织 OpenID 基金会推动的一种开放标准和去中心化的身份验证协议。有关详细信息,请参阅 OpenID 连接。
|
在尝试使用 Keycloak 来保护您的 Web 应用程序和 REST 服务之前,请熟悉如下核心概念和术语。下表列出了与此解决方案相关的术语
|
realms
|
是指认证和授权的子域,用于管理和验证用户身份。每个 realm 都有自己的身份验证和授权配置。
| |
clients
|
是指使用 Keycloak 作为 API 客户端的程序或服务。Keycloak 提供了多种 API(例如 HTTP API、JSON API 和 Websocket API) 供客户端使用。客户端可以使用 Keycloak 提供的 API 访问 Keycloak 后端服务,以获得访问令牌 (access tokens) 或其他授权资源所需的权限。
| | | | |
groups
|
是指一组具有相同权限的用户或客户端。用户可以加入多个 group,每个 group 都具有特定的权限范围。group 可以是基于用户的,也可以是基于客户端的。例如,在一个企业中,可以创建一个名为“admin”的 group,并将所有管理员添加到这个 group 中,以便他们访问系统中的所有权限。
| |
users
|
是指使用 Keycloak 的用户。Keycloak 提供了多种方式来验证用户的身份,例如密码、社会安全号码、护照等。用户可以在 Keycloak 中创建、修改或删除,并且可以使用 Keycloak 提供的 API 进行身份验证和授权。
| |
Client Scopes
|
是指用于授权客户端访问 Keycloak 后端服务的权限。client scope 可以定义一组权限,这些权限可以授予客户端,以便它们可以访问 Keycloak 后端服务。例如,可以创建一个名为“read”的 client scope,并将其授予可以读取特定资源的客户端。这样可以确保只有具有足够权限的客户端可以访问系统中的资源。
|
3. Cost
|
环境
|
所需资源
| |
POC
|
EC2 t3a.medium * 1
| |
PROD
|
EKS托管集群 * 1
EKS Node t3s.large * 3
|
4. Deployment
以POC环境为例子,使用一台EC2初始化一个k3s集群, 在K3S集群中使用容器方式部署keycloak,生产环境EKS部署方式类同:
1. 拥有一个已经备案的域名
2. 申请对应域名SSL证书,放置于ec2主机 /etc/ssl/ 目录
3. 在AWS控制台申请一台t3a.medium 类型的云主机, 选择Linux系统
4. 登录云主机,下载如下部署脚本:
5. 按照顺序执行shell脚本
bash setup-k3s-with-hostpath-sc.sh #初始化K3S集群
bash setup-ingress.sh <ec2_ip> #配置K3S ingress
kubectl create namespace keycloak #创建namespace
kubectl create secret tls keycloak-tls --key=/etc/ssl/domain.key --cert=/etc/ssl/domain.cert -n keycloak #创建 secret
bash setup-keycloak.sh <secret_name> <keycloak_ui_password> <keycloak_db_password> #部署eycloak
6. 添加 DNS解析记录,执行命令 kubectl get ingress 获取需要解析到域名的IP
5. Tutorial
5.1. keycloak默认语言设置
1. 登录keycloak,点击左侧菜单栏中的Realm Settings
2. 点击Themes,设置所有属性为keycloak
3. Internationalization Enabled选择ON
4. 将Default Locale设置为zh-CN
5. 重新登录时,在登录页面会显示语言切换项
[图片上传失败...(image-3528b6-1684239292399)]
5.2. keycloak默认安全设置
选择需要配置的realm , 点击左侧:验证(authentication) -> 必须操作(required-actions) ,开启以下配置项:
l configure-opt 开启
l update-password: 开启
| | | | [图片上传失败...(image-db59ef-1684239292397)]
|
5.3. **keycloak****新建realm **
出于安全的需要,生产环境不建议直接使用默认的Master,可选按照角色或者不同用途建立不同的realm
[图片上传失败...(image-d205bc-1684239292399)]
5.4. keycloak****新建user
在创建好的realm ,创建属于这个realm下的用户,realm之间具备逻辑隔离属性
[图片上传失败...(image-c5c81f-1684239292399)]
5.5. **AWS SAML SSO配置 **
Keycloak侧配置
1. 下载 AWS CN下载https://signin.amazonaws.cn/static/saml-metadata.xml
2. 选择一个realm,左侧侧边栏点击客户端,右侧选择导入客户端 -> 选择上一步骤下载的文件
3. IDP-Initiated SSO URL: aws-cn
4. Home URL: https://keycloak.apollo-ev.com/realms/cloud-sso/protocol/saml/clients/aws-cn
AWS Console 配置
5. 1. IAM -> identity_providers:
6. 1. 添加身份提供商 -> 配置提供商
7. 2. 提供商类型: SAML
8. 3. 提供商名称: cloud-sso
9. 4. 导入 Keycloak Server 配置 .1 步骤导出的 keycloak-sso-saml.xml 文件
10. 5. 绑定一个IAM角色,并分配权限
11. 1. 选择受信任实体的类型: SAML 2.0 身份联合
12. 2. SAML 提供商: cloud-sso
13. 3. 允许编程访问和 亚马逊云科技 管理控制台访问
14. 4. Attach 权限策略: 选择一个需要的权限策略
15. 5. 角色名称:aws-saml-admin
16. 6. 创建角色, 记录ARN
5.6. Gitlab OIDC SSO 配置
Keycloak侧配置,选择一个realm,左侧侧边栏点击客户端,右侧选择创建客户端
l 客户端类型: OpenID connect (关键配置项)
l 客户端ID: gitlab-oidc (关键配置项)
l 客户端Name: gitlab-oidc
[图片上传失败...(image-5151b5-1684239292399)]
选择下一步,客户端验证: 开 (关键配置项)
[图片上传失败...(image-18852a-1684239292398)]
选择下一步
有效的重定向URI: 添入https:///users/auth/openid_connect/callback (关键配置项)
Gitlab侧配置
5.7. Harbor OIDC SSO 配置
Keycloak侧配置
Keycloak侧配置,选择一个realm,左侧侧边栏点击客户端,右侧选择创建客户端
l 客户端类型: OpenID connect (关键配置项)
l 客户端ID: gitlab-oidc (关键配置项)
l 客户端Name: gitlab-oidc
[图片上传失败...(image-f8f115-1684239292398)]
选择下一步,客户端验证: 开 (关键配置项)
[图片上传失败...(image-c426fc-1684239292398)]
选择下一步
有效的重定向URI: 添入https:///users/auth/openid_connect/callback (关键配置项)
harbor侧配置
5.8. Grafana OIDC SSO 配置
Keycloak侧配置,选择一个realm,左侧侧边栏点击客户端,右侧选择创建客户端
l 客户端类型**:**** OpenID connect (**关键配置项)
l 客户端ID**: gitlab-oidc****(**关键配置项)
l 客户端Name: gitlab-oidc
[图片上传失败...(image-9b3c4a-1684239292398)]
选择下一步,客户端验证**:** 开** (关键配置项)**
[图片上传失败...(image-766d61-1684239292398)]
选择下一步
有效的重定向URI: 添入https:///users/auth/openid_connect/callback (关键配置项)
Grafana侧配置