SAML 中的服务提供者和实际应用程序之间如何/应该如何进行通信?

Posted

技术标签:

【中文标题】SAML 中的服务提供者和实际应用程序之间如何/应该如何进行通信?【英文标题】:How does/should the communication happen between Service Provider and Actual application in SAML? 【发布时间】:2017-06-05 09:51:09 【问题描述】:

我了解 IDP 和 SP 之间的通信在标准中得到了很好的定义。我想知道在独立 SP 和实际应用程序之间进行自定义通信的方法是什么。

我假设存在标准方法,而不是我自己重新发明***。但即使spring-saml security 只谈论“自定义机制”并没有说明它是什么。

有人能指出我正确的方向吗?我已经搜索过,但令我惊讶的是它没有写在任何博客、教程等地方。即使在 Shibboleth/Gluu 文档中,这部分也不知何故被遗弃了。

任何帮助将不胜感激。

【问题讨论】:

从纯 SAML 的角度来看,“实际应用程序”必须实现 SAML 服务提供者,例如就像 Spring SAML 示例应用程序一样。如果“实际应用程序”无法做到这一点,例如因为它是一些没有扩展点的产品,所以您需要检查应用程序在 SSO 方面的功能。例如。一些应用程序允许使用自定义 HTTP 请求标头来提供 SSO。然后,您可以使用 HTTP 反向代理,它基于 SAML 断言注入该标头,例如带有 mod_auth_mellon 的 Apache http 服务器。 @BernhardThalmayr 如果我找到了 IdpProxy 场景的解决方案,我就不必担心这个问题。即使是 shibboleth 也没有办法做到这一点。你知道 IdpProxy 吗? @BernhardThalmayr 是否免费开放? 如果你从源代码构建它是免费的。 【参考方案1】:

问题本质上归结为“部署在受信任网络中的两个应用程序如何安全地相互通信以交换有关用户的安全信息”。这与 SAML 为通过不受信任的网络进行通信的应用程序解决的问题相同,并且由于身份验证点 (SP) 和应用程序都在同一个实体的控制下,它变得更容易 = 例如。更容易使用对称密码学。 SP 原则上可以使用前端通道(= 通过 Web 浏览器)或后端通道(= 通过网络直接相互之间)与应用程序通信。

有不同的方式来执行通信(使用一个、另一个或两个通道),大多数都可以使用一些可用的安全产品来实现。以下是一些想法:

SP 和应用程序共享同一个域(= 用户的网络浏览器通过共享 cookie 的 URL 访问它们)

您可以将您的 SP 配置为存储一个 cookie - 一条信息,包括例如验证用户的 UID 和到期时间,cookie 可以使用 SP 和应用程序都知道的共享秘密进行加密。这是使用的方法,例如由 OpenAM 或 Wildfly 使用共享域加密 cookie。 此方法的另一种方法是将有关经过身份验证的用户的信息从 SP 发送到应用程序,例如作为加密的 HTTP POST 参数 - 与 SAML 类似的方法,只是更基本。 可以通过使用另一个安全共享存储来增强相同的方法 - 例如数据库并仅发送对记录的引用(例如唯一的秘密会话 ID)

SP 可用作应用程序的 HTTP 代理

在这种情况下,您可以将身份验证信息作为 HTTP 标头传递给应用程序,您必须确保通过 SP 是可以访问应用程序的唯一途径。这仅在 SP 是例如的一部分时才实用。负载均衡器(例如 Apache / nginx 插件)。

SP 和应用程序可以使用标准的身份验证机制来传递身份验证数据

您可以使用例如Kerberos(无论如何都基于共享秘密加密)或 OAuth

每个选项可能具有不同的攻击媒介和可能的漏洞。

我的观点是,将 SAML 功能直接添加到应用程序中,使用支持 SAML 的 HTTP 代理,或处理 SP 和应用程序之间最后一英里身份验证的标准产品(例如 OpenAM)是最好的方法。实施自定义安全机制似乎很容易,但有很大的空间犯错误,从而使整个解决方案易受攻击。

【讨论】:

感谢您的回答。我的想法与 Front Channel 的想法相同,但正如您所说,这就像 SAML 解决的相同问题。你知道 OpenAM 是否支持复杂的 IDP 代理用例吗?喜欢基于用户/电子邮件后缀的 IDP 选择?我实际上想要这样的东西实现 SAML v2 IDP 代理,因为没有开源解决方案,我想让 SP 在提供 SSO 的同时与多个 IDP 通信,如果每个应用程序都有 SP,那么单点登录将不会不会发生,因为他们可能使用不同的 IDP 进行了身份验证,所以我想要一些代理 IDP。 让我解释一下用例:属于外部组织的多个用户,多个 IDP。但是 SP 是一个组织(一种 SaaS)的一部分,每当一个 SP 联系 IDP 时,如果用户浏览器已经通过该中间 IDP 进行了身份验证,它应该能够进行身份验证。我认为这个链接会描述得更清楚:spaces.internet2.edu/display/GS/SAMLIdPProxy OpenAM 可以充当 IDP 代理,是的,它可以根据一系列标准定义要连接到哪个 IDP - 但是使用 OpenAM 产品启用这些用例是困难的。这是一个非常复杂(且陈旧)的产品,您可能需要专门的咨询。您的需求更接近于企业单点登录——来自开源的 Gluu 可能能够解决这个问题 (gluu.org),而 CAS (apereo.org/projects/cas) 可能会更好。 即使 Gluu 也只有基于 SP 的 IDP 选择,而我需要基于用户。 Gluu 建议不要使用 CAS(gluu.org/blog/to-cas-or-not-to-cas)。谢谢你的帮助。它有帮助。 从商业方面我知道来自 www.efecte.com 的 IDM 可以很好地做到这一点 - 好吧,我实现了它:) 但最简单的方法 - 如果没有一个产品完全符合你的要求需要,或者如果没有预算 - 最有可能自定义 Spring SAML。

以上是关于SAML 中的服务提供者和实际应用程序之间如何/应该如何进行通信?的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的 SAML 2.0 服务提供者

使用 SAML 和身份提供者的微服务身份验证

服务提供者之间的 SAML 2.0 身份验证断言(C#、.net、MVC4、组件空间)

SAML 工件的用途是啥?

如何设置本地测试 SAML2.0 身份提供程序?

SAML - SSO(转)