Keycloak 基本概念

1. 功能与概念

keycloak 是具有 Web 管理界面与 Rest 接口的单点登录解决方案。可以用来保护应用程序与服务接口,可以直接使用以及进行个性化定制,为登录、注册、管理和账户管理提供可定制的用户界面。可以与外部的第三方登录进行互联互通。

1.1 功能

这里列出主要的

  • 浏览器应用程序的单点登录和单点注销。
  • OpenID 连接支持。
  • OAuth 2.0 支持。
  • 社交登录 - 启用 Google、GitHub、Facebook、Twitter 和其他社交网络登录。
  • 用于集中管理用户、角色、角色映射、客户端和配置的管理控制台。
  • 登录流程 - 可选的用户自注册、恢复密码、验证电子邮件、要求密码更新等。
  • 会话管理 - 管理员和用户自己可以查看和管理用户会话。
  • 令牌映射器 - 将用户属性、角色等映射到令牌和语句中。
  • CORS 支持 - 客户端适配器具有对 CORS 的内置支持。
  • JavaScript 应用程序、WildFly、JBoss EAP、Fuse、Tomcat、Jetty、Spring 等的客户端适配器。
  • 支持任何具有 OpenID Connect Relying Party 库或 SAML 2.0 Service Provider 库的平台/语言。

1.2 基本操作

就是浏览器应用会从新定向到 keycloak 身份认证服务器,在哪里输入身份凭证,然后登录。这个就保护的用户密码的安全。

1.3 术语

用户 users

用户是能够登录到您的系统的实体。他们可以拥有与自己相关联的属性,例如电子邮件、用户名、地址、电话号码和生日。可以为他们分配组成员身份并为其分配特定的角色。

验证 authentication

识别和验证用户的过程。

授权 authorization

授予用户访问权限的过程。

证书 credentials

凭证是 Keycloak 用来验证用户身份的数据片段。一些示例是密码、一次性密码、数字证书,甚至指纹。

角色 roles

角色标识用户的类型或类别。 Adminusermanageremployee都是组织中可能存在的典型角色。应用程序通常将访问和权限分配给特定角色而不是单个用户,因为与用户打交道可能过于精细且难以管理。

用户角色映射 user role mapping

用户角色映射定义了角色和用户之间的映射。一个用户可以与零个或多个角色相关联。可以将此角色映射信息封装到令牌和断言中,以便应用程序可以决定对其管理的各种资源的访问权限。

复合角色 composite roles

复合角色是可以与其他角色关联的角色。例如,superuser复合角色可以与sales-adminorder-entry-admin角色相关联 。如果用户被映射到superuser角色,他们也会继承sales-adminorder-entry-admin角色。

团体 groups

组管理用户组。可以为组定义属性。您也可以将角色映射到组。成为组成员的用户将继承组定义的属性和角色映射。

领域 realms

领域管理一组用户、凭据、角色和组。用户属于并登录到一个领域。领域彼此隔离,只能管理和验证它们控制的用户。

客户端 clients

客户端是可以请求 Keycloak 对用户进行身份验证的实体。大多数情况下,客户端是希望使用 Keycloak 来保护自己并提供单点登录解决方案的应用程序和服务。客户端也可以是只想请求身份信息或访问令牌的实体,以便他们可以安全地调用网络上由 Keycloak 保护的其他服务。

客户端适配器 client adapters

客户端适配器是您安装到应用程序环境中的插件,以便能够通过 Keycloak 进行通信和保护。Keycloak 有许多适用于不同平台的适配器供您下载。对于我们未涵盖的环境,您还可以获得第三方适配器。

同意是指您作为管理员希望用户在客户端参与身份验证过程之前向该客户端授予权限。用户提供凭据后,Keycloak 将弹出一个屏幕,标识请求登录的客户端以及需要用户提供的身份信息。用户可以决定是否批准请求。

客户范围 client scopes

注册客户端后,您必须为该客户端定义协议映射器和角色范围映射。存储客户端范围通常很有用,通过共享一些通用设置可以更轻松地创建新客户端。这对于根据scope参数值有条件地请求某些声明或角色也很有用。Keycloak 为此提供了客户端范围的概念。

客户角色 client role

客户可以定义特定于他们的角色。这基本上是一个专用于客户端的角色命名空间。这个需要研究研究。

身份令牌 identity token

提供有关用户的身份信息的令牌。OpenID Connect 规范的一部分。

访问令牌 access token

可以作为 HTTP 请求的一部分提供的令牌,该请求授予对所调用服务的访问权限。这是 OpenID Connect 和 OAuth 2.0 规范的一部分。

断言 assertion

有关用户的信息。这通常与 SAML 身份验证响应中包含的 XML blob 相关,该响应提供有关已验证用户的身份元数据。

服务帐号 service account

每个客户端都有一个内置的服务帐户,允许它获取访问令牌。

例如每个微信小程序,都有一个账号,通过这个账号就可以得到访问令牌

直接授予 direct grant

客户端通过 REST 调用代表用户获取访问令牌的一种方式。

协议映射器 protocol mappers

对于每个客户端,您可以定制 OIDC 令牌或 SAML 断言中存储的声明和断言。您可以通过创建和配置协议映射器来为每个客户端执行此操作。

session

当用户登录时,会创建一个 session 来管理登录 session。会话包含诸如用户何时登录以及在该会话期间哪些应用程序参与了单点登录等信息。管理员和用户都可以查看会话信息。

联合用户提供者 user federation provider

Keycloak 可以存储和管理用户。通常,公司已经拥有存储用户和凭据信息的 LDAP 或 Active Directory 服务。您可以让 Keycloak 验证来自这些外部存储的凭据并提取身份信息。

身份提供者 identity provider

身份提供者 (IDP) 是一种可以对用户进行身份验证的服务。Keycloak 是 IDP。

身份提供者联盟 identity provider federation

Keycloak 可以配置为将身份验证委托给一个或多个 IDP。通过 Facebook 或 Google+ 进行社交登录是身份提供者联合的一个示例。您还可以挂钩 Keycloak 以将身份验证委托给任何其他 OpenID Connect 或 SAML 2.0 IDP。

身份提供者映射器 identity provider mappers

在进行 IDP 联合时,您可以将传入的令牌和断言映射到用户和会话属性。这有助于您将身份信息从外部 IDP 传播到请求身份验证的客户端。

必要的行动 required actions

必需操作是用户在身份验证过程中必须执行的操作。在完成这些操作之前,用户将无法完成身份验证过程。例如,管理员可能会安排用户每月重置密码。一个update password需要行动将所有这些用户设置。

认证流程 authentication flows

身份验证流程是用户在与系统的某些方面交互时必须执行的工作流程。登录流程可以定义所需的凭据类型。注册流程定义了用户必须输入的配置文件信息以及是否必须使用 reCAPTCHA 之类的东西来过滤机器人。凭据重置流程定义了用户在重置密码之前必须执行的操作。

事件 events

事件是管理员可以查看和挂钩的审计流。

主题 themes

Keycloak 提供的每个 Html 界面都有一个主题支持。主题定义了您可以根据需要覆盖的 HTML 模板和样式表。

2. 基本功能

2.1 管理控制台

为每个 realms 建立管理员

通过 Realms 来控制不同的平台,其中默认的是管理整个 keycloak 平台,这个叫做管理控制台。

建议新建一个 Realms,然后在这个里面建立一个 Admin,用来专门管理这个平台,不要用总的管理平台 admin。

启用 SSL 模式

一定要使用 SSL 模式,为了安全。

按照我的理解,在 Nginx 中将 443 接口转到 keycloak 的 80 端口上,这样做就不用将 keycloak 的 https 开启,但是好像跟文档上讲的不一样,回来要操作一下。

需要设置邮箱,因为要用安全框架发送邮件。这里如何搭建一个私有的邮件服务器呢? 刚开始可以用一个免费的邮箱。

2.2 用户管理

添加用户

  • 邮箱不能重复
  • 是否需要邮箱验证
  • 设置后续活动,例如修改密码,添加附件信息,选择地区等

添加用户属性

可以扩展用户的属性,例如手机号等信息

添加用户凭证

新的版本式可以选passwordotp

一次性密码(OTP)功能

必需任务

必需任务是用户在被允许登录之前必须完成的任务。

  • 更新密码
  • 验证邮件
    • 设置后,用户必须验证他们是否拥有有效的电子邮件帐户。将向用户发送一封电子邮件,其中包含他们必须单击的链接。成功完成此工作流程后,他们将被允许登录。
  • 更新配置文件
    • 这个必需的操作要求用户更新他们的个人资料信息,即他们的姓名、地址、电子邮件和/或电话号码。
  • 配置动态密码
    • 设置后,用户必须使用免费 OTP 或 Google 身份验证器应用程序在其移动设备上配置一次性密码生成器。

以上任务是可以扩展的,可以在 Authentication 菜单中定义。

条款和条件

许多组织都要求新用户第一次登录时,他们需要同意网站的条款和条件。Keycloak 将此功能作为必需操作实现,但它需要一些配置。首先,您必须转到Required Actions前面描述的选项卡并启用该Terms and Conditions操作。您还必须编辑基本登录主题中的 terms.ftl文件。有关扩展和创建主题的更多信息,请参阅服务器开发人员指南

用户注册

在 reamle 中的 login 中,开始注册功能。您可以更改注册表单的外观以及删除或添加必须输入的其他字段。有关详细信息,请参阅服务器开发人员指南

验证码

为防止机器人注册,Keycloak 与 Google reCAPTCHA 集成。要启用此功能,您需要首先转到Google Recaptcha 网站 并创建一个 API 密钥,以便您可以获得 reCAPTCHA 站点密钥和密码。

google 不能访问了,所以要另外想办法。

国内使用 reCaptcha 验证码的完整教程

配置用户资料项

这是一个验证的功能,需要开启。

使用-Dkeycloak.profile=preview 或启用启动服务器-Dkeycloak.profile.feature.declarative_user_profile=enabled 。有关更多详细信息,请参阅配置文件。

2.3 登录

  • 忘记密码
  • 记住账户

实际上还有两个功能

  • 第三方登录
  • 忘记密码的手机模式
  • 扫码登录

2.4 验证

密码政策

可以在 Authentication 中设置密码的策略

  • 不是电子邮件
  • 不是用户名
  • 过期密码
  • 正则表达式
  • 最近未使用
  • 密码黑名单

身份验证流程

2.4 单点登录协议

看这个文档就行了

3. 管理客户端

3.1 基本设置

OIDC 访问类型

  • 保密
    • 用于浏览器登录并且有自己服务器的。例如老的 Web 框架程序
  • public
    • React 类似的程序,对于客户端应用程序,没有办法保护秘密
  • 不记名
    • 只允许不记名令牌请求,用于哪些无法参与浏览器登录的客户端

4. 威胁模型缓解

详细网址

4.1 REST API 和 Web 控制台

Keycloak 管理 REST API 和 Web 控制台在与非管理员使用相同的端口上公开。

建议不要公开上面两个端口,也可以通过 Apache 或 nginx 等代理实现。:

  • 控制/auth/admin.
    • 例如限制访问/auth/adminIP 地址范围10.0.0.110.0.0.255

4.2 密码猜测:蛮力攻击

转到Realm Settings左侧菜单项,单击Security Defenses选项卡,然后再转到Brute Force Detection子选项卡。

强烈建议启用此功能以防止此类攻击。

密码政策

防止密码猜测的另一件事是制定足够复杂的密码策略,以确保用户选择难以猜测的密码。有关更多详细信息,请参阅密码策略一章。

不过,防止密码猜测的最佳方法是将服务器设置为使用一次性密码 (OTP)。

4.3 点击劫持

恶意站点将目标站点加载到透明 iFrame 中,该 iFrame 覆盖在一组精心构建的虚拟按钮之上,这些虚拟按钮直接放置在目标站点的重要按钮下方。当用户单击可见按钮时,他们实际上是在单击隐藏页面上的按钮(例如“登录”按钮)。攻击者可以窃取用户的身份验证凭据并访问他们的资源。

4.4 SSL/HTTPS 要求

如果没有 SSL/HTTPS,攻击者可以嗅探您的网络并获取访问令牌。一旦他们拥有访问令牌,他们就可以执行该令牌已获得许可的任何操作。

4.5 CSRF 攻击

跨站点请求伪造 (CSRF) 是一种基于 Web 的攻击,通过该攻击,HTTP 请求是从网站信任或已通过身份验证的用户发送的(例如,通过 HTTP 重定向或 HTML 表单)。任何使用基于 cookie 的身份验证的站点都容易受到这些类型的攻击。通过将状态 cookie 与发布的表单或查询参数相匹配,可以减轻这些攻击。

4.6 非特定重定向 URI

对于授权代码流,如果您注册的重定向 URI 过于笼统,那么恶意客户端可能会冒充具有更广泛访问范围的其他客户端。例如,如果两个客户端生活在同一个域下,就会发生这种情况。因此,最好使您注册的重定向 URI 尽可能具体。

4.7 FAPI 合规性

为确保 Keycloak 服务器将验证您的客户端更安全且符合 FAPI,您可以为 FAPI 支持配置客户端策略。详细信息在保护应用程序和服务指南的 FAPI 部分中进行了描述。除其他外,这确保了上述一些安全最佳实践,例如客户端所需的 SSL、使用的安全重定向 URI 以及更多类似的最佳实践。

4.8 受损的访问和刷新令牌

访问令牌和刷新令牌被盗的风险

最重要的是在 Keycloak 及其客户端和应用程序之间强制执行 SSL/HTTPS 通信。这似乎很明显,但由于 Keycloak 默认没有启用 SSL,管理员可能没有意识到这是必要的。

您可以做的另一件事是减少泄漏的访问令牌,以缩短其寿命。

如果访问令牌或刷新令牌被泄露,您应该做的第一件事是转到管理控制台并将非之前撤销策略推送到所有应用程序。这将强制在该日期之前发行的任何 token 现在都无效。

如果您认为这些实体中的任何一个完全受到威胁,您还可以禁用特定的应用程序、客户端和用户。

4.9 泄露的授权码

对于OIDC Auth Code Flow,攻击者很难破解 Keycloak 授权码。Keycloak 为其授权代码生成一个加密的强随机值,因此很难猜测访问令牌。授权码只能使用一次来获取访问令牌。

4.10 打开重定向器

Keycloak 要求所有注册的应用程序和客户端至少注册一种重定向 URI 模式。任何时候客户端要求 Keycloak 执行重定向(例如在登录或注销时),Keycloak 将检查重定向 URI 与有效注册 URI 模式的列表。客户端和应用程序注册尽可能特定的 URI 模式以减轻开放重定向器攻击非常重要。

4.11 密码数据库泄露

Keycloak 不会以原始文本形式存储密码。它使用 PBKDF2 算法存储它们的散列。它实际上使用了 20,000 次散列迭代的默认值!这是安全社区推荐的迭代次数。这可能会对您的系统造成相当大的性能损失,因为 PBKDF2 在设计上会占用大量 CPU。由您决定保护密码数据库的认真程度。

Spring Boot 十种安全措施

为了与 SpringBoot 保持一致,新的 SpringBoot 密码格式也保持成:Pbkdf2PasswordEncoder

4.12 限制范围

默认情况下,每个新的客户端应用程序都有一个无限制的 role scope mappings. 这意味着为该客户端创建的每个访问令牌都将包含用户拥有的所有权限。如果客户端受到威胁并且访问令牌被泄露,那么用户有权访问的每个系统现在也会受到威胁。强烈建议您通过为每个客户端使用“范围”菜单来限制分配访问令牌的角色。或者,您可以在客户端范围级别设置角色范围映射,并使用客户端范围菜单将客户端范围分配给您的客户 端。

4.13 限制代币受众

在服务之间信任级别较低的环境中,限制令牌的受众是一种很好的做法。OAuth2 威胁模型文档中描述了这背后的动机,更多详细信息请参见受众支持部分。