JBoss APIman 中的策略和端点安全

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在这篇关于 APIman(新的 JBoss API 管理框架)系列文章的第五篇文章中,我们将研究 apiman 如何使您能够在策略级别以及在端点级别为其托管和非托管服务提供安全性端点。

无意中不安全?

如果您仔细阅读本系列的第一篇文章 ( https://dzone.com/articles/impatient-new-users ),您可能已经注意到,在创建端点由 apiman API 网关管理的服务的过程中,我们还无意中使该服务处于非常不安全的状态,因为未经授权的客户端应用程序可以绕过网关并直接访问该服务。我们在本系列的最新帖子 ( https://dzone.com/articles/adding-basic-authentication ) 中讨论了如何在策略中为托管服务端点配置身份验证。此身份验证策略在客户端通过 API 网关访问托管服务时为客户端提供用户名/密码安全性,但它不能保护服务免受完全绕过网关的未经授权的访问尝试。为了使服务免受未经授权的客户端应用程序的影响,还应该配置端点级别的安全性。

在本文中,我们将检查 APIman 策略级别和端点级别的安全性、它们的比较方式以及它们的不同之处。

apiman 提供的补充安全类型

开始讨论我们将在本文中检查的不同但互补的安全类型的最佳方式是使用图表。涉及的节点是将访问我们服务的客户端应用程序、apiman API 网关和托管我们服务的服务器:

让我们从左到右浏览图表,首先看一下策略级别安全性。

策略级安全

Apiman 包括几个预定义的策略 OOTB。这些策略支持根据调用服务的速率、访问服务的客户端应用程序的 IP 地址、授权和身份验证来控制对服务的访问。在本系列的最新文章中,我们展示了如何配置身份验证策略。为了简单起见,我们选择了 BASIC 身份验证。此 BASIC 身份验证策略为客户端应用程序和 apiman API 网关之间的通信通道提供安全性。从客户端到 API 网关的传入请求启动策略链,应用策略并请求客户端提供用户名和密码。如果该策略配置了 SSL 加密,则可以增强该策略提供的安全级别。

但是,此策略级别的安全性仅保护图表的左侧,即应用程序和 API 网关之间的通信通道。在这个通信通道中,应用程序扮演客户端的角色,API 网关扮演服务器的角色。

我们还想保护图表的右侧,其中 API 网关扮演客户端的角色,服务扮演服务器的角色。

(同样值得注意的是,虽然策略安全保护托管服务,但它对保护非托管服务没有任何作用,因为可以直接访问此服务,而无需通过 API 网关。图中用红线说明了这一点。因此,虽然通过 apiman API 网关访问托管服务是安全的,但策略安全性并不保护非托管服务端点。)

端点级安全

与策略级安全性相比,端点安全性保护了图表的右侧。

Marc Savy 最近在 apiman 博客 ( http://www.apiman.io/blog/gateway/security/mutual-auth/ssl/mtls/2015/06/16/mtls-mutual-auth.html ) 上发表的一篇文章描述了如何在 API 网关和托管服务之间配置相互验证的 TLS(传输层安全性)。使用双向 TLS,配置双向身份验证,以便在建立连接之前验证客户端和服务器的身份。

在设置相互 TLS 时,创建了包含节点私钥的密钥库和包含管理该节点应信任的其他节点的公共证书的信任库。 API 网关在其 apiman.properties 文件中配置为引用密钥库和信任库。通过将 Implementation 选项卡中的 API Security 下拉菜单设置为 MTLS/Two-Way-SSL,该服务配置了相互身份验证。最后,该服务被编程为启用了相互身份验证。配置双向 TLS 后,图表右侧的通信通道(从 API 网关到服务)变得安全了。

我们还应该注意,与策略安全不同,端点安全还可以保护服务免受绕过 API 网关的尝试。使用 Mutual TLS,创建双向信任模式。 API 网关信任服务,服务也信任 API 网关。但是,服务不信任客户端应用程序。如大“X”字符所示,表示应用程序无法绕过 API 网关直接访问服务。

最后一点需要记住的是,端点安全级别适用于对服务发出的所有请求,无论配置了什么策略。

比较和对比

总而言之,策略级安全性和端点级安全性之间的区别是:

策略级安全

端点级安全

保护应用程序(客户端)和 API 网关(服务器)之间的通信

保护 API 网关(客户端)和服务(服务器)之间的通信

在 API 网关策略中配置

在 apiman.properties 和密钥/证书基础设施中为 API 网关配置为一个整体

在运行时由策略应用

适用于所有服务请求,无论为服务配置的策略如何

不保护非托管服务免受未经授权的客户端访问

保护非托管服务端点免受未经授权的客户端访问

作者致谢

一如既往,作者要感谢 Marc Savy、Eric Wittmann 和 apiman 团队对撰写本文的审阅意见和建议!

参考