序言
从简单的未加密凭证到当今先进方法的数字身份验证的演变,突显了数据安全的重要性。随着组织适应混合部署,并且对应用程序的整体访问不再位于网络边界内,随之而来的是身份验证的复杂性和风险。采用标准身份验证协议和高级工作流程不仅对于降低风险,而且对于维护需要访问各种应用程序的用户的操作稳定性至关重要。Okta 通过其全面的 SaaS 身份和访问管理 (IAM) 服务平台为这些固有的行业问题提供了解决方案。
我们将从软件即服务 (SaaS) 平台的角度,并以更广泛的威胁态势为背景来研究 Okta 的服务和解决方案。我们将探讨历史的和潜在的漏洞,以了解它们的起源和影响。本文将深入分析
- 通用目录 (UD)
- 数据模型
- API 访问管理
- 访问策略
- 会话管理
- 租户
- 授权工作流
- 身份验证工作流。
通过更深入地了解 Okta,安全从业人员可以利用这些知识来准确评估部署 Okta 的攻击面。
Okta 的产品
核心服务概述
在本简介中,我们将深入探讨 Okta 提供的核心服务。Okta 主要是一个 SaaS 平台,专注于可扩展的身份和访问管理 (IAM) 解决方案。其产品的核心是单点登录 (SSO)、多因素身份验证 (MFA) 以及对复杂多租户架构的支持等技术。Okta 还拥有强大的 RESTful API 套件,可促进无缝的创建、读取、更新和删除 (CRUD) 操作。
Okta IAM 解决方案的核心在于用户、组和策略。该平台提供了全面的生命周期管理和 UD,从而可以在涵盖应用程序、设备等的混合环境中实现无缝 IAM。这包括与 LDAP 或 Active Directory (AD) 等外部目录的同步功能,从而确保统一的身份管理系统。
Okta 服务的一个关键方面是其作为服务提供商 (SP) 和身份提供商 (IdP) 的双重角色。这种双重功能使 Okta 能够通过其 身份引擎促进安全无缝的身份验证,并使用 OAuth 等标准协议进行强大的授权,同时还支持安全断言标记语言 (SAML) 和 OpenID Connect (OIDC) 等身份验证协议。
对于客户而言,Okta 提供了用于安全和合规的宝贵工具。系统日志,即通过 API 存储和检索的环境相关事件,可以深入了解用户活动和组织事件。这些日志对于安全信息和事件管理 (SIEM) 系统至关重要,有助于检测异常和潜在威胁。
此外,Okta 的 ThreatInsight 功能作为一种主动安全措施脱颖而出。它聚合和分析系统日志,动态识别并响应潜在威胁。这包括识别指示恶意活动的模式,例如密码喷射、凭证填充,以及检测可疑 IP 地址。这些功能共同增强了组织的安全态势,使其能够抵御各种网络威胁。
集成功能
除了许多产品外,Okta 对其他各种 SaaS 解决方案和应用程序也非常友好。Okta 开箱即用,包含一个集成网络,可以与其他应用程序(例如 Slack、Google Workspace、Office 365、GitHub 等)无缝集成。
Okta 的 RESTful API 遵循跨域身份管理系统 (SCIM) 协议。这允许应用程序或开发人员对用户和组执行直接的创建、读取、更新和删除 (CRUD) 操作,但也实现了 SaaS 生态系统内的标准化。SCIM 是 Okta 可扩展性的关键组成部分。随着业务的扩展,需要在各种 SaaS 平台中集成越来越多的用户、组和访问控制。SCIM 通过标准化这些平台之间如何通信用户身份数据来解决这一挑战。这种标准化简化了用户管理流程,尤其是在不同系统之间同步用户信息时。
Okta 关于 API 的对象管理侧重于以下列出的几个域
- 应用程序 API - 管理应用程序及其与用户和组的关联。
- 用户 API - 对用户执行 CRUD 操作。
- 会话 API - 创建和管理用户的身份验证会话。
- 策略 API - 创建和管理用户的会话生存期等设置。
- 因素 API - 注册、管理和验证 MFA 的因素。
- 设备 API - 管理设备身份和生命周期。
将集成添加到 Okta 组织后,可以根据存储在用户 Okta 个人资料中的最终用户属性,为访问控制设置细粒度和全局身份验证策略。
通用目录
Okta 用户、组、策略和设备管理的核心是 UD。这是所有资产的单一视图,无论这些资产是来自 Okta、集成还是辅助目录服务(例如 AD)。
从技术上讲,UD 是一个由 Okta 管理的集中式云存储库,用于存储所有用户、组、设备和策略配置文件。Okta 要么是关于 IAM 的事实来源,要么与其他联合服务和身份提供商(如 AD 或 Google Workspace)同步。UD 可通过 Okta 的核心 API 进行 CRUD 操作,并与他们的单点登录 (SSO) 平台结合使用,从而为链接的集成或管理控制台本身提供身份验证和授权。从用户管理到简化的密码管理,一切都由 UD 实现。
总之,UD 被归类为目录即服务 (DaaS),类似于 AWS 目录服务、Microsoft Entra ID 等。
自定义和管理
为了更深入地了解 UD,可以访问个人资料自定义功能。这使组织能够存储有关包含特定属性的用户和组的信息记录。基本属性由 Okta 分配,但也可以在用户、组和应用程序 用户配置文件之间添加自定义属性。属性映射对于集成和其他目录服务之间的同步和数据交换非常重要。例如,AD 属性 givenName 可以专门映射到 Okta 中的 FirstName 和 LastName。除了同步之外,这对于其他与 Okta 相关的功能也很重要,例如内联挂钩、目录规则和操作等。
此外,这还支持丰富的 SAML 断言和 WS-Federation 声明,其中应用程序可以利用这些信息来创建丰富的用户帐户、更新帐户或制定复杂的授权和身份验证决策。
UD 和内部配置文件还提供了其他 自主配置和取消配置选项,这对于可扩展性和管理任务(例如控制哪些用户类型可以访问哪些应用程序)非常重要,从而支持更传统的基于角色的访问控制 (RBAC) 策略。
与外部目录集成
如前所述,Okta 目录集成可以与 LDAP、AD、Google Workspace 等外部目录同步。对于基于云的 DaaS 平台,Okta 利用 RESTful API 和 SCIM 协议来执行数据交换等操作。对于本地环境,Okta 具有一个 AD 端点代理,可以进行部署,从而从目录服务中提取信息并将其发送回 UD。
或者,桌面 SSO (DSSO) 也提供了一个无代理选项。这为基于云、本地或混合的环境提供了灵活性,同时继续保持可扩展性和与第三方应用程序的直接集成。从架构上讲,这解决了基于 LAN 的环境的许多缺陷,在这些环境中,应用程序在防火墙后提供给域用户。从安全角度来看,凭据和配置文件随后从所有应用程序目录同步到一个“事实来源”:Okta。在例如,当一名心怀不满的员工不再受雇,因此必须禁用对各种应用程序的访问时,审核单个目录会更容易。因此,由于这些外部目录集成功能,单点注销 (SLO) 可以用于这种情况。
最后,我们不能忽视这为那些可能没有资源来管理 SAML、OAuth 和 SCIM 在 RESTful API 之间的通信,或集成之间兼容性问题的组织所带来的潜在维护量的减少,因为 Okta 为他们管理了这些。
有关 Okta 提供商支持 AD 外部目录的其他解决方案和示例,请访问此处。
数据模型
当我们浏览 Okta 的领域时,理解 Okta 的数据模型对于可能负责威胁狩猎、检测逻辑等的安全从业人员来说至关重要。
结构和设计
当首次为组织建立 Okta 时,它会继承自己的“空间”,其中存放应用程序、目录、用户配置文件、身份验证策略等。顶级的目录资源作为组织的“基础”,实体可以来自 Okta 或外部(LDAP、AAD、Google Workspace 等)。
Okta 用户是具有更高权限的用户,他们通常利用 Okta 管理控制台并执行管理任务,而最终用户是那些可能依赖 Okta 进行 SSO、访问应用程序等的用户。
默认情况下,Okta 中的实体被称为资源。如前所述,每个资源都有一组默认属性和自定义属性的组合。然后,链接描述了资源可接受的关系或操作,例如停用链接。然后,此信息被聚合到一个配置文件中,该配置文件可以从 UD 中访问。组更像是特定用户集合的标签。
应用程序保存有关用户和组的访问策略以及如何与每个集成应用程序通信的信息。关于应用程序访问和相关用户的存储数据一起存储为 AppUser,如果目录之间的映射正确完成,则最终用户可以访问。
策略包含一组条件和规则,这些条件和规则会影响组织如何与应用程序和用户交互。策略在 Okta 中是包罗万象的,这意味着它们用于制定决策和完成操作,例如 - 重置密码的要求或如何注册 MFA。这些规则可以使用 Okta 表达式语言 (OEL) 来表达。
每个组织都使用专用的授权服务器,为通过 API 或资源访问应用程序提供授权代码和令牌。在这里,诸如 OAuth、OIDC 和 SAML 之类的授权和身份验证协议对于工作流程至关重要。这些授权服务器还负责与 Google Workspace 等第三方 IdP 通信。寻求访问应用程序的最终用户会陷入授权服务器和 SP 之间的通信,因为代码和令牌会快速交换以确认授权和身份验证。
总而言之,这种结构和设计支持可扩展性、自定义和无缝集成。
API 访问管理
API 访问管理不仅对最终用户、管理员和开发人员很重要,而且对于集成到集成的通信也很重要。请记住,Okta 的最前沿是其各种 RESTful API 端点。
虽然我们不会深入探讨 Okta API 的设计原则和对象管理,但我们将尝试讨论一些核心概念,这些概念对于理解本博客系列后面的攻击面非常重要。
API 安全
OAuth 2.0 和 OIDC 实现
在探索各种授权和身份验证工作流程之前,了解 OAuth 和 OIDC 的核心协议至关重要。OAuth 是一种用于 RESTful API 中委托授权的开放标准,它通过 HTTPS 运行,使用访问令牌而不是凭据来实现安全的委托访问。这些令牌由身份提供商 (IdP) 以加密方式签名,建立信任关系,允许应用程序授予用户访问权限。典型的 OAuth 工作流程涉及用户访问请求、用户身份验证、授权代码交付证明以及用于 API 请求的令牌颁发。访问令牌在 IdP 中进行验证,以确定访问范围。
OIDC (API 端点) 以 OAuth 为基础进行身份验证,除了访问令牌之外,还引入了以身份为中心的范围和一个 ID 令牌。该令牌是一个 JSON Web 令牌 (JWT),其中包含身份信息和签名,这对于 SSO 功能和用户身份验证至关重要。Okta 作为经过认证的 OIDC 提供商,利用这些端点,尤其是在充当服务提供商 (SP) 的授权服务器时。
在此上下文中,演示拥有权证明 (DPoP) 至关重要,通过应用程序级机制防止滥用被盗令牌来增强安全性。它涉及一个公钥/私钥对,其中公钥嵌入在 JWT 标头中,并发送到授权服务器。服务器将此公钥绑定到访问令牌,确保用户浏览器和 IdP 或 SP 之间的安全通信。
Okta API 访问管理中的令牌和 API 密钥在用户身份验证后充当数字凭证,发挥着至关重要的作用。它们通过 HTTPS 安全地传输,并且生命周期有限,有助于实现可扩展的无状态架构。
最后,了解端到端加密 (E2EE) 至关重要。E2EE 确保数据在其来源处加密,并且只能由预期的接收者解密,从而维护整个生态系统的安全性和隐私。这种使用非对称加密的加密是 Okta API 中的默认功能,可保护跨应用程序、浏览器、IdP 和 SP 的数据。
RESTful API 和 CRUD
Okta 的 RESTful API 遵循标准化的接口设计,确保所有交互的一致性和可预测性。这种设计理念有助于 CRUD(创建、读取、更新、删除)操作,使开发人员可以直观地使用 Okta 的 API。每个 API 端点都对应于标准的 HTTP 方法 — POST 用于创建,GET 用于读取,PUT 用于更新,DELETE 用于删除资源。这种与 HTTP 标准的一致性简化了集成,并降低了新开发人员的学习曲线。
Okta 提供 RESTful API 的一个关键特性是其无状态性 — 从客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息,而与之前的任何请求无关。这种方法增强了可扩展性,因为它允许服务器快速释放资源,并且不保留请求之间的会话信息。API 的无状态性质有助于更容易地进行负载平衡和冗余,这对于即使在需求扩展时也能保持高可用性和性能至关重要。
SCIM
SCIM(跨域身份管理系统)是一种开放标准,可自动管理各种基于云的应用程序和服务的用户身份。SCIM 是 Okta API 访问管理不可或缺的一部分,可确保 Okta 和外部系统之间无缝、安全的用户数据交换。它标准化了身份信息,这对于使用多个应用程序的组织来说至关重要,从而降低了复杂性和手动错误风险。
在 Okta 中,SCIM 的作用扩展到全面的用户和组管理,处理诸如用户名、电子邮件和组成员资格等基本属性。这些对于访问控制和授权至关重要。Okta 的 SCIM 实现是可自定义的,可以适应不同系统的多样化身份管理需求。这种适应性简化了身份管理流程,使其更加自动化、高效和可靠 - 对于有效的 API 访问管理至关重要。
有关 SCIM 的更多信息,请参阅 RFC 7644 或 Okta。
访问策略
Okta 的访问策略在管理对应用程序和 API 的访问方面起着至关重要的作用。可以根据用户/组成员资格、设备、位置或时间自定义它们,并且可以对敏感应用程序强制执行额外的身份验证步骤。这些策略以 JSON 格式存储在 Okta 中,允许
- 创建复杂的授权规则。
- 为 Okta 应用程序指定额外的身份验证级别。
- 管理用户访问权限并使用内联挂钩修改访问令牌范围。
Okta 中的主要策略类型包括
- 登录策略:使用基于上下文的 IF/THEN 规则(如 IP 地址)控制应用程序访问。
- 全局会话策略:管理对 Okta 的访问,包括多因素质询和会话持续时间。
- 身份验证策略:为每个应用程序设置额外的身份验证要求。
- 密码策略:定义密码要求和恢复操作。
- 验证器注册策略:管理多因素身份验证方法的注册。
策略的有效性取决于它们的顺序评估,并在满足指定条件时应用配置。AuthN 和 Identity Engine 管道之间的评估有所不同,后者会同时考虑全局会话和特定身份验证策略。
此外,Okta 中的网络区域通过基于用户连接源管理访问控制来增强访问控制。这些区域允许根据 IP 地址和地理位置进行配置,并与访问策略集成,以根据网络来源强制执行不同的身份验证要求。这种集成增强了安全性,并有助于监视和威胁评估。
会话管理
在涉及诸如 Okta 之类的身份提供商 (IdP) 和服务提供商 (SP) 的基于 Web 的交互中,会话的概念是用户体验和安全框架的核心。会话通常在最终用户通过 Web 浏览器开始与 IdP 或 SP 的交互时启动,无论此交互是有意的还是无意的。
从技术上讲,会话表示用户与 Web 服务之间的交互状态。与单个请求-响应通信不同,会话会随着时间的推移而持续存在,在多次交互中保持用户的状态和上下文。这种持久性至关重要,因为它允许用户在初始登录后与 Web 服务进行交互,而无需为每个操作或请求进行身份验证。
会话可以保存各种重要数据,这对于保持用户交互的状态和上下文至关重要。这包括但不限于
Cookie:这些用于存储会话标识符和其他特定于用户的信息,允许 Web 服务识别不同请求中的用户。
令牌:包括访问令牌、刷新令牌和 ID 令牌,这些对于验证和授权用户,以及维护其与 Web 服务交互的安全性至关重要。
用户偏好和设置:用户在其交互过程中设置的自定义项或偏好。
会话过期数据:有关会话何时过期或需要刷新的信息。 这对于安全性至关重要,可确保会话不会无限期地保持活动状态,从而可能构成安全风险。
会话的管理,尤其是其创建、维护和及时过期,是基于 Web 的服务的一个关键方面。有效的会话管理可确保用户便利性(通过减少重复登录的需求)与安全性(通过最大限度地减少因放弃或过长的会话而导致的未经授权访问的风险)之间的平衡。在最终用户、IdP 和 SP 之间的交互中,会话有助于请求和响应的无缝且安全的流动,从而巩固了服务的整体安全性和可用性。
会话初始化和身份验证
Okta 管理用户会话,首先是 IdP 会话,该会话在用户使用其凭据成功进行身份验证时建立,并且可能包括多因素身份验证 (MFA)。此 IdP 会话是访问集成到组织 Okta 环境中的各种应用程序的关键。例如,对 Okta 的 /api/v1/authn
端点的 HTTP POST 请求通过验证用户的凭据来启动此会话。此外,会话端点 API 可以帮助在 /api/v1/sessions
促进创建和管理。
Okta 主要使用 Cookie 进行会话管理,尤其是在身份提供商 (IdP) 会话的上下文中。这些 Cookie 对于在 Okta 环境中跨 HTTP 请求维护会话状态和用户上下文至关重要。最终用户浏览器的典型会话 Cookie 检索如下
- IdP 或 SP 发起的应用程序访问请求
- 通过 OIDC 或 SAML 进行身份验证请求
- 成功验证凭据后,将返回会话令牌
- 重定向到 OIDC 端点、会话重定向或应用程序嵌入链接以获取会话 Cookie
如详细说明,当用户成功进行身份验证时,Okta 最终会在用户的浏览器中设置会话 Cookie。然后,此 Cookie 用于跟踪用户会话,从而允许与各种应用程序无缝交互,而无需重新身份验证。
令牌与 Cookie
尽管 Okta 利用 ID 和访问令牌等令牌进行 API 访问和授权,但这些令牌的用途与会话 Cookie 不同。令牌通常用于 API 交互,不负责维护用户的会话状态。相比之下,会话 Cookie 专门用于维护 Web 浏览器内的会话连续性,这使得它们对于 Okta 内基于 Web 的 SSO 和会话管理至关重要。
会话令牌类似于客户端密钥,就像授权请求期间的授权代码一样。这些密钥以及对特定 API 端点的正确请求,允许最终用户或攻击者获取会话 Cookie 或访问令牌,然后可以使用这些令牌代表用户发出经过身份验证/授权的请求。这应该需要为会话管理和监控采取更高的安全措施。
单点登录 (SSO)
SSO 是 Okta 会话管理中的一项关键功能,允许用户使用一组凭据访问多个应用程序。这是通过 SAML 和 OIDC 等协议实现的,例如,对 SAML 端点的 HTTP(S) 请求有助于用户身份验证,并授予跨不同应用程序的访问权限,而无需重复登录。
在单点登录 (SSO) 场景中,Okta 的会话 Cookie 起着至关重要的作用。用户通过身份验证并建立会话后,相同的会话 Cookie 可以通过与每个服务提供商请求捆绑的方式,促进访问 SSO 框架内的多个应用程序。这消除了用户单独登录每个应用程序的需要,从而简化了用户体验。
会话终止
Okta 中的会话终止可能是由于过期导致的。这也可能由用户、SP 或 IdP 发起的注销导致。对 Okta 的 /api/v1/sessions/me
端点的 HTTP GET 请求可用于终止用户的会话。在 SSO 的情况下,此终止可以触发单点注销 (SLO),从而结束所有已访问应用程序中的会话。
应用程序会话和其他控制
应用程序会话是特定于用户在通过 IdP 进行身份验证后访问的应用程序的会话。Okta 允许对这些会话进行精细控制,包括针对特权应用程序与非特权应用程序的不同过期策略。此外,管理员可以实施单点注销 (SLO) 或本地注销的策略,以进一步管理会话生命周期。
了解会话初始化、管理和终止的机制,以及令牌和 Cookie 的作用,对于探索更深层次的安全主题至关重要。当深入研究攻击分析和会话劫持等领域时,这些知识至关重要,这些内容将在本博客系列的后续部分中讨论。
有关会话的更多信息,请参阅 使用 Okta 进行会话管理或 开发人员会话。
租户
在 SaaS 领域,租户是为特定用户组提供服务的软件和基础架构的独特实例。在 Okta 的 多租户平台中,此概念对于配置访问控制至关重要。租户可以代表从内部员工到外部承包商的各种群体,每个群体都需要对应用程序进行唯一的访问。这是通过 Okta 管理的,充当 IdP。
租户在 Okta 中具有多功能性:可以根据安全策略、用户组、角色和配置文件对其进行定制,从而使其在组织内独立运行。这种独立性在多租户环境中至关重要,在多租户环境中,不同的租户会根据角色、数据隐私和法规要求等因素进行隔离。这种设置在 Okta 中很常见,使用户能够有效地管理各种访问需求。
在多组织环境中,Okta 通过其 UD 在不同的组织之间促进租户的使用。每个租户的配置都受到各种因素的影响,包括成本、性能和数据驻留,而用户类型和配置文件构成租户设置的基础。此外,委派管理员支持和用于登录后重定向的 DNS 自定义等功能在管理租户访问方面起着重要作用。
了解 Okta 中租户配置的细微差别至关重要,不仅对于有效的管理,而且对于理解潜在的安全挑战(例如,中毒租户的风险)也至关重要。
授权工作流程
正如我们前面讨论的,Okta 作为 IdP,提供授权服务器作为其服务的一部分。 了解在前台和后台通道上发生的授权工作流程至关重要。 在此讨论和示例中,我们将使用客户端(最终用户)、授权服务器 (Okta) 和 SP(应用程序服务器)作为涉及的角色。
OAuth 2.0 和 OIDC 协议
OAuth 的高级概述
RFC 6749 中定义的 OAuth 2.0 是一种授权协议。 它使第三方应用程序能够获得最终用户或资源所有者批准的有限访问权限。 它通过 HTTPS 运行,授予访问令牌以授权用户、设备、API、服务器和应用程序。
OAuth 的关键术语
作用域:定义在访问令牌中授予的权限。 它们表示每次与资源服务器交互的会话权限。
同意:最终用户或客户端同意或不同意客户端应用程序请求的权限(作用域)的过程。 例如,Google Workspace 中的同意屏幕。
令牌:包括用于资源访问的访问令牌和用于获取新访问令牌而无需重新授权的刷新令牌。
授权:发送到授权服务器以接收访问令牌的数据,如身份验证后授予的授权代码。
客户端:在 OAuth 中,客户端要么是“机密”的,能够安全地存储凭据,要么是“公共”的,不能安全地存储凭据。
授权服务器:生成 OIDC 和 OAuth 令牌,并应用访问策略,每个令牌都有一个唯一的 URI 和签名密钥。
授权端点:用于用户交互和授权的 API 端点 (/oauth/authorize)。
令牌端点:客户端获取访问令牌或刷新令牌的 API 端点 (/oauth/token),通常需要授权代码之类的授权类型。
资源服务器(或服务提供商,SP):为经过身份验证的用户提供服务,需要访问令牌。
前端通道:用户浏览器与授权服务器或资源服务器之间的通信。
后端通道:机器对机器的通信,例如资源服务器和授权服务器之间的通信。
此简化概述涵盖了 Okta 生态系统中 OAuth 的基本要素,重点介绍了其功能、关键术语和组件。
OIDC 的高级概述
在本博客的开头,我们还讨论了 OIDC 如何是一种位于 OAuth 授权框架之上的身份验证协议。虽然 OAuth 提供授权,但它没有当前的身份验证机制,因此 OIDC 协议就派上用场了。经过身份验证的用户的身份通常称为资源所有者。
OIDC 连接流程看起来与 OAuth 流程相似,但是在初始 HTTPS 请求期间,将添加 scope=openid 以便不仅从授权服务器返回访问令牌,而且还返回 ID 令牌。
ID 令牌的格式为 JSON Web 令牌 (JWT),以便客户端可以提取有关身份的信息。这与访问令牌不同,客户端每次需要访问时都会将访问令牌传递给资源服务器。可以在 JWT 中找到诸如过期时间、颁发者、签名、电子邮件等数据 - 这些也称为声明。
授权代码流程
步骤 1 - 初始授权请求
当客户端向 Okta 的授权端点发送 HTTP GET 请求时,授权码流程启动。此请求在建立 OAuth 2.0 授权框架的初始部分至关重要。
以下是请求组件的分解:
- 端点:请求被定向到
/oauth2/default/v1/authorize
,这是 Okta 的授权端点。 - 参数
response_type=code
:此参数指定应用程序正在启动授权码授权类型流程。client_id
:在 Okta 中注册的客户端应用程序的唯一标识符。redirect_uri
:Okta 将授权码发送到的 URL。scope
:定义应用程序请求的访问级别。
请求示例
GET /oauth2/default/v1/authorize?response_type=code \
&client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=SCOPE
步骤 2 - 用户身份验证和同意
一旦发出请求,系统会提示用户使用 Okta 进行身份验证并同意所请求的作用域。此步骤对于用户验证至关重要,并确保用户了解授予应用程序的访问类型。
步骤 3 - 接收授权码
在身份验证和同意后,Okta 会向客户端返回授权码。此代码是短暂的,会交换为更永久的密钥,以进行进一步的请求 - 访问令牌。
令牌交换请求示例
POST /oauth2/default/v1/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
redirect_uri=REDIRECT_URI&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
步骤 4 - 重定向 URI 和客户端身份验证
重定向 URI 在 OAuth 2.0 流程的安全性中起着关键作用。它们是预先注册的 URL,Okta 将授权码发送到这些 URL。这些 URI 的完整性至关重要,因为它们确保响应仅发送给授权的客户端。
客户端应用程序在令牌端点进行身份验证,通常通过提供 client_id
和 client_secret
。此步骤对于验证客户端应用程序的身份并防止未经授权的访问至关重要。
步骤 5 - 令牌交换
在最后一步中,客户端向 Okta 的令牌端点发出 HTTP POST 请求,将授权码交换为访问令牌。然后,此访问令牌用于代表用户发出 API 请求。
此请求中包含客户端凭据(客户端 ID 和客户端密钥)是一项关键的安全措施,确保仅向合法的客户端颁发令牌。
访问令牌和作用域
访问令牌是一个紧凑的代码,其中包含有关用户及其权限的广泛数据。它充当数字密钥,促进服务器和用户设备之间的通信。访问令牌通常用于各种网站,可以使用户通过一个网站(如 Facebook)登录以访问另一个网站(如 Salesforce)。
访问令牌的组成
访问令牌通常由三个不同的部分组成,每个部分都有特定的用途
- 标头:此部分包含有关令牌的元数据,包括令牌类型和用于加密的算法。
- 载荷(声明):令牌的核心,包括与用户相关的信息、权限、组成员身份和过期详细信息。载荷决定用户是否可以访问特定资源,具体取决于其中授予的权限。开发人员可以将自定义数据嵌入到载荷中,从而实现多种应用,例如单个令牌授予对多个 API 的访问权限。
- 签名:一个哈希验证段,用于确认令牌的真实性。这使得令牌安全且难以篡改或复制。
访问令牌的一种常见格式是 JWT,如我们之前讨论的那样,它简洁但安全地编码了所有必要的信息。
作用域和权限
OAuth 2.0 中的作用域是定义客户端请求的访问级别和类型的参数。每个作用域都会转化为授予访问令牌的特定权限。例如,电子邮件的作用域将授予客户端应用程序访问用户电子邮件地址的权限。作用域的粒度允许对客户端可以使用访问令牌执行的操作进行精确控制,从而遵循最小权限原则。
令牌有效期和刷新令牌
出于安全原因,访问令牌的有效期本质上很短,从而减少了在意外泄露的情况下滥用令牌的机会窗口。Okta 允许自定义 令牌有效期以适应不同的安全态势。一旦访问令牌过期,将不再能够用于访问资源。
在采用时,刷新令牌的作用是在不需要用户再次进行身份验证的情况下扩展会话。刷新令牌可以交换为新的访问令牌,从而保持用户对应用程序的访问连续性。在用户保持登录状态较长时间的应用程序中,使用刷新令牌至关重要。
令牌存储
关于令牌存储,基于浏览器的应用程序(例如使用 Okta 等服务的应用程序)对访问令牌的安全存储至关重要,这是用户会话管理的一个关键方面。这些令牌通常使用以下几种方法之一进行存储:浏览器内存存储、会话 Cookie 或浏览器本地/会话存储。内存存储因其对 XSS 攻击的强大防御能力而受到青睐,它将令牌保存在应用程序的 JavaScript 内存空间中,尽管它会在页面刷新或关闭时丢失令牌。会话 Cookie 通过 JavaScript 无法访问而提供增强的安全性,从而减少 XSS 漏洞,但需要仔细实施以避免 CSRF 攻击。本地和会话存储选项虽然方便,但由于容易受到 XSS 攻击,通常不建议用于访问令牌等敏感数据。存储方法的选择将取决于使用传统网页、移动设备或单页应用的应用程序。
安全性和过期
访问令牌的安全性在保护用户身份验证和授权过程中至关重要,尤其是在通过互联网传输时。加密这些令牌至关重要,因为它确保其内容保持机密,并且不受未经授权的访问。同样重要的是使用安全的通信通道(特别是 HTTPS)来防止传输中的令牌被拦截和泄露。此外,令牌的签名组件(尤其是在 JWT 中)在验证其真实性和完整性方面起着至关重要的作用。此签名确认令牌未被更改并且是可信机构真实颁发的,从而防止与令牌伪造和重放攻击相关的风险。
访问令牌本质上是使用过期机制设计的,这是一种战略选择,旨在降低与令牌被盗或滥用相关的风险。令牌的这种有限寿命需要定期更新,通常通过刷新令牌进行管理,从而确保主动的会话管理,并减少未经授权使用的机会。客户端应用程序中这些令牌的存储和处理也会对其整体安全性产生重大影响。安全的存储方法(例如内存或加密的 Cookie),以及对令牌更新流程的仔细管理,对于防止未经授权的访问和维护用户会话和访问控制的健壮性至关重要。
身份验证工作流程
身份验证与授权
在我们深入了解 Okta 中的身份验证之前,我们应该花一点时间来了解身份验证和授权之间的区别。简单来说,身份验证是提供证据来证明身份,而授权是指在授予访问权限后的权限和特权。
正如我们在整个博客中所讨论的那样,身份引擎和 UD 对于 Okta 中的身份管理至关重要。回顾一下,身份引擎用于注册、身份验证和授权用户。UD 用作 Okta 中的主目录服务,其中包含用户、组、配置文件和策略,同时也是用户数据的真实来源。UD 可以通过 Okta 端点代理与 AD 或 LDAP 等其他目录服务同步。
身份管理可以通过 Okta 或外部 IdP(如 Google Workspace)进行管理。本质上,当请求访问应用程序时,会生成重定向到授权服务器的端点 API 进行身份验证,以提供身份证明。
以下是最终用户、资源服务器和授权服务器之间的主要身份验证协议
- OIDC:建立在 OAuth 授权框架之上的身份验证协议。工作流程需要在此访问令牌请求期间获取 ID 令牌 (JWT)。
- SAML:采用 XML 格式的开放标准协议,用于促进 SP 和 IdP 之间的用户身份数据交换。
在 Okta 中,关于身份验证有很多灵活性和自定义选项。支持基本身份验证,其中通过 HTTP 使用简单的用户名和密码方案以及其他参数和配置。
身份验证中的 SAML
如前所述,SAML 是一种登录标准,可帮助根据 HTTP(s) 请求和异步会话促进用户访问应用程序。随着时间的推移,为每个应用程序使用基本凭据很快成为一种挑战,因此引入了联合身份,允许跨不同的 SP 进行身份验证,并由身份提供程序促进。
SAML 主要是一种基于 Web 的身份验证机制,因为它依赖于最终用户、IdP 和 SP 之间的流量流动。SAML 身份验证流程可以由 IdP 或 SP 发起,具体取决于最终用户首先访问何处以进行应用程序访问。
SAML 请求通常由 SP 生成,而 SAML 响应由 IdP 生成。响应包含 SAML 断言,其中包含有关经过身份验证的用户的身份的信息以及 IdP 的签名。
请务必注意,在 SAML 工作流程中,IdP 和 SP 通常不直接通信,而是依赖最终用户的浏览器进行重定向。通常,SP 信任 IdP,因此通过用户的 Web 浏览器转发到 SP 的身份数据在授予对所请求应用程序的访问权限时是受信任的。
在上面的图表中的步骤 5 中,在用户使用 IdP 进行身份验证后,SAML 断言将作为此响应的一部分发送。请记住,该断言采用 XML 格式,并且可能非常广泛,因为它包含 SP 用于解析和依赖的最终用户身份验证的身份信息。OneLogin 提供了 SAML 断言的通用示例。Auth0 还提供了这些示例的解码器和解析器,如下图所示。
IdP 与 SP 的职责
在讨论服务提供商 (SP) 和身份提供商 (IdP) 的角色和职责时,请记住,SP 旨在为最终用户提供对应用程序的访问,而 IdP 则提供身份验证和授权。SP 和 IdP 通常设置为彼此信任,并承担各自指定的职责。根据最终用户的不同,身份验证和授权的工作流程可以是 SP 发起的,也可以是 IdP 发起的,其中 RESTful API 端点通常用于每个工作流程。对于身份验证,请求和响应在 IdP 和 SP 之间发送,但通常会通过最终用户的浏览器进行代理。
尽管 Okta 主要是一个 IdP 并提供身份验证和授权服务,但它也可以用作 SP。之前我们讨论过 Okta 的集成网络如何允许各种第三方应用程序通过其仪表板连接并可供用户访问。我们还解释了身份验证工作流程如何由 SP 发起,这意味着用户可以访问其 Okta 仪表板来请求访问应用程序。同时,可以建立第三方 IdP,例如 Google Workspace 或 Azure AD,它将处理用户的身份验证和授权。如果用户使用此类型的设置请求访问,Okta 将重定向用户到 Azure AD 进行身份验证。
单因素身份验证与多因素身份验证
单因素身份验证 (SFA) 是最简单的身份验证形式,它要求用户提供一个凭据对象进行身份验证。通常,用户熟悉基于密码的身份验证方法,其中提供用户名和密码来验证自己的身份。当然,如果使用的凭据被盗,这会带来安全隐患,因为攻击者可以使用这些凭据登录并访问相同的资源。
多因素身份验证 (MFA) 与 SFA 类似,只是它要求提供两种或多种类型的凭据或证据进行身份验证,通常是按顺序进行的。例如,可以提供基于密码的凭据,并在 IdP 验证后,请求移动设备身份验证器应用程序、短信消息、电子邮件等提供 OTP。常见的身份验证因素类型是用户知道的、拥有的或固有的。这也增加了攻击者的复杂性,基于 OTP 和 MFA 令牌过期的随机字符串生成。
Okta 启用了其他类型的身份验证方法,例如无密码、基于风险、生物识别、交易等。有关身份验证方法和描述的完整列表,请参见此处。
添加到 Okta 组织的每个应用程序或集成都有一个身份验证策略,该策略验证尝试访问每个应用程序的用户的条件。身份验证策略还可以帮助根据这些条件强制执行因素要求,其中 UD 和用户配置文件用于分析有关用户的信息。身份验证策略可以为应用程序和用户全局设置,也可以在应用程序级别设置时更加精细,以满足特定用户条件。身份验证策略可以更新、克隆、预设和合并(如果策略重复)。可以使用 Okta 表达式语言 (EL) 将定义这些精细条件的规则应用于这些身份验证策略。
客户端和服务器端通信
了解前端(用户浏览器交互)和后端(服务器到服务器通信)之间的区别在基于 Web 的身份验证系统中至关重要。前端交互通常涉及用户界面和操作,而后端通道处理关键交换,例如 SAML 断言或 OAuth 令牌,这对于安全身份验证至关重要。
在 Okta 的框架中,浏览器和服务器之间的相互作用是安全性和用户体验的关键。当用户通过 Okta 登录时,浏览器首先会向 Okta 验证身份,然后 Okta 会发回必要的令牌。这些令牌会转发到应用程序服务器,应用程序服务器会使用 Okta 对其进行验证,从而确保在后台安全地交换令牌。
Okta 的令牌管理以严格的安全性为标志。颁发的令牌(例如 ID 令牌和访问令牌)在用户的浏览器、Okta 和应用程序服务器之间安全交换。HTTPS 和 OAuth 2.0 等协议保护这些传输。令牌轮换和自动吊销等功能进一步增强了安全性,防止未经授权的访问。
将 Okta 集成到应用程序中会重塑其设计和安全性。这卸载了重要的安全责任,使开发人员可以专注于核心功能。这种集成导致了模块化架构,其中身份验证服务与应用程序逻辑分离。
结论
我们已经揭示了 Okta 架构和服务的复杂性,深入了解了它作为现代身份验证和授权领导者的作用。借助该平台对 OAuth、OIDC 和 SAML 等协议的利用,Okta 站在可扩展、集成解决方案的最前沿,与 Azure AD 和 Google Workspace 等平台无缝协作。
Okta 的 SaaS 设计,具有 RESTful API,使其成为多功能的身份提供商 (IdP) 和服务提供商 (SP)。然而,它的受欢迎程度也带来了潜在的安全漏洞。对于网络安全专业人士来说,了解 Okta 的复杂性对于在不断演变的威胁中保持领先至关重要。本简介为即将到来的对 Okta 攻击面的更深入分析、威胁检测实验室的设置以及对常见攻击的探索奠定了基础。
有了这些知识,您现在可以更好地分析、理解和缓解与 Okta 生态系统相关的不断演变的网络安全挑战。