keycloak 是具有 Web 管理界面与 Rest 接口的单点登录解决方案。可以用来保护应用程序与服务接口,可以直接使用以及进行个性化定制,为登录、注册、管理和账户管理提供可定制的用户界面。可以与外部的第三方登录进行互联互通。
这里列出主要的
就是浏览器应用会从新定向到 keycloak 身份认证服务器,在哪里输入身份凭证,然后登录。这个就保护的用户密码的安全。
用户是能够登录到您的系统的实体。他们可以拥有与自己相关联的属性,例如电子邮件、用户名、地址、电话号码和生日。可以为他们分配组成员身份并为其分配特定的角色。
识别和验证用户的过程。
授予用户访问权限的过程。
凭证是 Keycloak 用来验证用户身份的数据片段。一些示例是密码、一次性密码、数字证书,甚至指纹。
角色标识用户的类型或类别。 Admin
、user
、manager
和employee
都是组织中可能存在的典型角色。应用程序通常将访问和权限分配给特定角色而不是单个用户,因为与用户打交道可能过于精细且难以管理。
用户角色映射定义了角色和用户之间的映射。一个用户可以与零个或多个角色相关联。可以将此角色映射信息封装到令牌和断言中,以便应用程序可以决定对其管理的各种资源的访问权限。
复合角色是可以与其他角色关联的角色。例如,superuser
复合角色可以与sales-admin
和order-entry-admin
角色相关联 。如果用户被映射到superuser
角色,他们也会继承sales-admin
和order-entry-admin
角色。
组管理用户组。可以为组定义属性。您也可以将角色映射到组。成为组成员的用户将继承组定义的属性和角色映射。
领域管理一组用户、凭据、角色和组。用户属于并登录到一个领域。领域彼此隔离,只能管理和验证它们控制的用户。
客户端是可以请求 Keycloak 对用户进行身份验证的实体。大多数情况下,客户端是希望使用 Keycloak 来保护自己并提供单点登录解决方案的应用程序和服务。客户端也可以是只想请求身份信息或访问令牌的实体,以便他们可以安全地调用网络上由 Keycloak 保护的其他服务。
客户端适配器是您安装到应用程序环境中的插件,以便能够通过 Keycloak 进行通信和保护。Keycloak 有许多适用于不同平台的适配器供您下载。对于我们未涵盖的环境,您还可以获得第三方适配器。
同意是指您作为管理员希望用户在客户端参与身份验证过程之前向该客户端授予权限。用户提供凭据后,Keycloak 将弹出一个屏幕,标识请求登录的客户端以及需要用户提供的身份信息。用户可以决定是否批准请求。
注册客户端后,您必须为该客户端定义协议映射器和角色范围映射。存储客户端范围通常很有用,通过共享一些通用设置可以更轻松地创建新客户端。这对于根据scope
参数值有条件地请求某些声明或角色也很有用。Keycloak 为此提供了客户端范围的概念。
客户可以定义特定于他们的角色。这基本上是一个专用于客户端的角色命名空间。这个需要研究研究。
提供有关用户的身份信息的令牌。OpenID Connect 规范的一部分。
可以作为 HTTP 请求的一部分提供的令牌,该请求授予对所调用服务的访问权限。这是 OpenID Connect 和 OAuth 2.0 规范的一部分。
有关用户的信息。这通常与 SAML 身份验证响应中包含的 XML blob 相关,该响应提供有关已验证用户的身份元数据。
每个客户端都有一个内置的服务帐户,允许它获取访问令牌。
例如每个微信小程序,都有一个账号,通过这个账号就可以得到访问令牌
客户端通过 REST 调用代表用户获取访问令牌的一种方式。
对于每个客户端,您可以定制 OIDC 令牌或 SAML 断言中存储的声明和断言。您可以通过创建和配置协议映射器来为每个客户端执行此操作。
当用户登录时,会创建一个 session 来管理登录 session。会话包含诸如用户何时登录以及在该会话期间哪些应用程序参与了单点登录等信息。管理员和用户都可以查看会话信息。
Keycloak 可以存储和管理用户。通常,公司已经拥有存储用户和凭据信息的 LDAP 或 Active Directory 服务。您可以让 Keycloak 验证来自这些外部存储的凭据并提取身份信息。
身份提供者 (IDP) 是一种可以对用户进行身份验证的服务。Keycloak 是 IDP。
Keycloak 可以配置为将身份验证委托给一个或多个 IDP。通过 Facebook 或 Google+ 进行社交登录是身份提供者联合的一个示例。您还可以挂钩 Keycloak 以将身份验证委托给任何其他 OpenID Connect 或 SAML 2.0 IDP。
在进行 IDP 联合时,您可以将传入的令牌和断言映射到用户和会话属性。这有助于您将身份信息从外部 IDP 传播到请求身份验证的客户端。
必需操作是用户在身份验证过程中必须执行的操作。在完成这些操作之前,用户将无法完成身份验证过程。例如,管理员可能会安排用户每月重置密码。一个update password
需要行动将所有这些用户设置。
身份验证流程是用户在与系统的某些方面交互时必须执行的工作流程。登录流程可以定义所需的凭据类型。注册流程定义了用户必须输入的配置文件信息以及是否必须使用 reCAPTCHA 之类的东西来过滤机器人。凭据重置流程定义了用户在重置密码之前必须执行的操作。
事件是管理员可以查看和挂钩的审计流。
Keycloak 提供的每个 Html 界面都有一个主题支持。主题定义了您可以根据需要覆盖的 HTML 模板和样式表。
为每个 realms 建立管理员
通过 Realms 来控制不同的平台,其中默认的是管理整个 keycloak 平台,这个叫做管理控制台。
建议新建一个 Realms,然后在这个里面建立一个 Admin,用来专门管理这个平台,不要用总的管理平台 admin。
启用 SSL 模式
一定要使用 SSL 模式,为了安全。
按照我的理解,在 Nginx 中将 443 接口转到 keycloak 的 80 端口上,这样做就不用将 keycloak 的 https 开启,但是好像跟文档上讲的不一样,回来要操作一下。
需要设置邮箱,因为要用安全框架发送邮件。这里如何搭建一个私有的邮件服务器呢? 刚开始可以用一个免费的邮箱。
可以扩展用户的属性,例如手机号等信息
新的版本式可以选password
或otp
的
一次性密码(OTP)功能
必需任务是用户在被允许登录之前必须完成的任务。
以上任务是可以扩展的,可以在 Authentication 菜单中定义。
许多组织都要求新用户第一次登录时,他们需要同意网站的条款和条件。Keycloak 将此功能作为必需操作实现,但它需要一些配置。首先,您必须转到Required Actions
前面描述的选项卡并启用该Terms and Conditions
操作。您还必须编辑基本登录主题中的 terms.ftl文件。有关扩展和创建主题的更多信息,请参阅服务器开发人员指南。
在 reamle 中的 login 中,开始注册功能。您可以更改注册表单的外观以及删除或添加必须输入的其他字段。有关详细信息,请参阅服务器开发人员指南。
为防止机器人注册,Keycloak 与 Google reCAPTCHA 集成。要启用此功能,您需要首先转到Google Recaptcha 网站 并创建一个 API 密钥,以便您可以获得 reCAPTCHA 站点密钥和密码。
google 不能访问了,所以要另外想办法。
这是一个验证的功能,需要开启。
使用-Dkeycloak.profile=preview 或启用启动服务器-Dkeycloak.profile.feature.declarative_user_profile=enabled 。有关更多详细信息,请参阅配置文件。
实际上还有两个功能
可以在 Authentication 中设置密码的策略
OIDC 访问类型
Keycloak 管理 REST API 和 Web 控制台在与非管理员使用相同的端口上公开。
建议不要公开上面两个端口,也可以通过 Apache 或 nginx 等代理实现。:
/auth/admin
./auth/admin
IP 地址范围10.0.0.1
来10.0.0.255
。转到Realm Settings
左侧菜单项,单击Security Defenses
选项卡,然后再转到Brute Force Detection
子选项卡。
强烈建议启用此功能以防止此类攻击。
防止密码猜测的另一件事是制定足够复杂的密码策略,以确保用户选择难以猜测的密码。有关更多详细信息,请参阅密码策略一章。
不过,防止密码猜测的最佳方法是将服务器设置为使用一次性密码 (OTP)。
恶意站点将目标站点加载到透明 iFrame 中,该 iFrame 覆盖在一组精心构建的虚拟按钮之上,这些虚拟按钮直接放置在目标站点的重要按钮下方。当用户单击可见按钮时,他们实际上是在单击隐藏页面上的按钮(例如“登录”按钮)。攻击者可以窃取用户的身份验证凭据并访问他们的资源。
如果没有 SSL/HTTPS,攻击者可以嗅探您的网络并获取访问令牌。一旦他们拥有访问令牌,他们就可以执行该令牌已获得许可的任何操作。
跨站点请求伪造 (CSRF) 是一种基于 Web 的攻击,通过该攻击,HTTP 请求是从网站信任或已通过身份验证的用户发送的(例如,通过 HTTP 重定向或 HTML 表单)。任何使用基于 cookie 的身份验证的站点都容易受到这些类型的攻击。通过将状态 cookie 与发布的表单或查询参数相匹配,可以减轻这些攻击。
对于授权代码流,如果您注册的重定向 URI 过于笼统,那么恶意客户端可能会冒充具有更广泛访问范围的其他客户端。例如,如果两个客户端生活在同一个域下,就会发生这种情况。因此,最好使您注册的重定向 URI 尽可能具体。
为确保 Keycloak 服务器将验证您的客户端更安全且符合 FAPI,您可以为 FAPI 支持配置客户端策略。详细信息在保护应用程序和服务指南的 FAPI 部分中进行了描述。除其他外,这确保了上述一些安全最佳实践,例如客户端所需的 SSL、使用的安全重定向 URI 以及更多类似的最佳实践。
访问令牌和刷新令牌被盗的风险
最重要的是在 Keycloak 及其客户端和应用程序之间强制执行 SSL/HTTPS 通信。这似乎很明显,但由于 Keycloak 默认没有启用 SSL,管理员可能没有意识到这是必要的。
您可以做的另一件事是减少泄漏的访问令牌,以缩短其寿命。
如果访问令牌或刷新令牌被泄露,您应该做的第一件事是转到管理控制台并将非之前撤销策略推送到所有应用程序。这将强制在该日期之前发行的任何 token 现在都无效。
如果您认为这些实体中的任何一个完全受到威胁,您还可以禁用特定的应用程序、客户端和用户。
对于OIDC Auth Code Flow,攻击者很难破解 Keycloak 授权码。Keycloak 为其授权代码生成一个加密的强随机值,因此很难猜测访问令牌。授权码只能使用一次来获取访问令牌。
Keycloak 要求所有注册的应用程序和客户端至少注册一种重定向 URI 模式。任何时候客户端要求 Keycloak 执行重定向(例如在登录或注销时),Keycloak 将检查重定向 URI 与有效注册 URI 模式的列表。客户端和应用程序注册尽可能特定的 URI 模式以减轻开放重定向器攻击非常重要。
Keycloak 不会以原始文本形式存储密码。它使用 PBKDF2 算法存储它们的散列。它实际上使用了 20,000 次散列迭代的默认值!这是安全社区推荐的迭代次数。这可能会对您的系统造成相当大的性能损失,因为 PBKDF2 在设计上会占用大量 CPU。由您决定保护密码数据库的认真程度。
为了与 SpringBoot 保持一致,新的 SpringBoot 密码格式也保持成:Pbkdf2PasswordEncoder
默认情况下,每个新的客户端应用程序都有一个无限制的 role scope mappings. 这意味着为该客户端创建的每个访问令牌都将包含用户拥有的所有权限。如果客户端受到威胁并且访问令牌被泄露,那么用户有权访问的每个系统现在也会受到威胁。强烈建议您通过为每个客户端使用“范围”菜单来限制分配访问令牌的角色。或者,您可以在客户端范围级别设置角色范围映射,并使用客户端范围菜单将客户端范围分配给您的客户 端。
在服务之间信任级别较低的环境中,限制令牌的受众是一种很好的做法。OAuth2 威胁模型文档中描述了这背后的动机,更多详细信息请参见受众支持部分。