微服务——如何解决安全和用户认证?

Microservices - how to solve security and user authentication?

关于微服务架构的讨论很多。我缺少的 - 或者可能是我还不明白的是,如何解决安全和用户身份验证问题?

例如:我开发了一个微服务,它为工作流引擎提供了一个 Rest 服务接口。该引擎基于 JEE,并在 GlassFish 或 Wildfly 等应用程序服务器上运行。 工作流引擎的核心概念之一是,每次调用都以用户为中心。这意味着根据当前用户的角色和访问级别,工作流引擎会产生单独的结果(例如,以用户为中心的任务列表或处理取决于用户在流程中的角色的开放任务)。

在我看来,这样的服务不是到处都可以访问的。例如,如果有人计划实施一个现代 Ajax 基于 JavaScript 的应用程序,该应用程序应该使用工作流微服务,则存在两个问题:

1) 为了避免 JavaScript/Ajax 的跨脚本问题,JavaScript Web 应用程序需要部署在与微服务运行相同的域下

2) 如果微服务强制进行用户身份验证(在我的场景中就是这种情况),应用程序需要提供透明的身份验证机制。

如果客户端需要访问多个以用户为中心的微服务并强制进行用户身份验证,情况就会变得更加复杂。 我总是以一种架构结束,其中所有服务和客户端应用程序 运行 在同一域下的同一应用程序服务器上。

如何解决这些问题?这种架构的最佳实践是什么?

你的问题是关于两个独立的问题。

通过实施 CORS 可以轻松解决从其他来源访问您的服务的问题。对于非浏览器客户端,跨源根本不是问题。

关于服务身份验证的第二个问题通常使用 token based authentication 来解决。

您的微服务之一的任何调用者都将从该特定服务的授权服务器或 STS 获取访问令牌。

您的客户端通过已建立的会话 (cookie) 或通过随请求发送有效令牌来向授权服务器或 STS 进行身份验证。

简短回答:检查 OAUTH,并管理需要访问其他微服务的每个微服务中的凭据缓存。 "manage" 我的意思是,注意安全。特别注意谁可以访问这些凭据并让网络拓扑成为你的朋友。创建反映微服务依赖关系图的 DMZ 层和其他内部层。

答案很长,请继续阅读。你的问题很好,因为虽然你的问题反复出现,但没有简单的灵丹妙药可以满足你的需要。

与我目前看到的所有与微服务相关的内容一样,没有什么是真正新鲜的。每当您需要让分布式系统代表某个用户做事时,您就需要分布式凭证来启用此类解决方案。自大型机时代以来就是如此。没有办法违反这一点。

Auto SSH从某种意义上说,就是这样的东西。也许这听起来像是描述简单事物的美化方式,但最终,它使一台机器中的进程能够使用另一台机器中的服务。

在网格世界中,Globus Toolkit, for instance, bases its distributed security 使用以下内容:

  • X.509 证书;
  • MyProxy - 管理凭据存储库并帮助您定义一系列证书颁发机构,直至找到根证书颁发机构,默认情况下应该信任它;
  • OpenSSH 的扩展,它是 Linux 发行版的事实上的标准 SSH 实现。

OAUTH 或许就是您所需要的。这是一种提供具有额外限制的授权的方式。例如,假设某个用户对某个服务具有读写权限。当您发出 OAUTH 授权时,您不一定将完整的用户权限授予第三方。您只能授予读取权限。

另一个答案中提到的 CORS 在终端客户端(通常是 Web 浏览器)需要跨网站单点登录时很有用。但是你的问题似乎更接近于一个集群,在这个集群中你有许多由你管理的微服务。不过,您可以利用 Grid 领域开发的解决方案来确保跨站点分布的集群的安全性(例如,出于高可用性原因)。

完全的安全是可望不可及的。因此,如果凭据永远有效,或者如果您没有足够小心地对收到的任何信息保密,那么所有这些都没有用。为此,我建议使用层对网络进行分区。每一层都有不同程度的保密和对外开放。

如果您不想负担 OAUTH 所需的基础设施,您可以使用基本 HTTP 或创建您自己的令牌。

使用 basic HTTP authentication 时,客户端需要在每次请求时发送凭据,因此无需在服务器端保持会话状态以进行授权。

如果您想创建自己的机制,请更改您的登录请求,以便返回令牌作为对成功登录的响应。具有相同令牌的后续请求将充当基本 HTTP 身份验证,其优点是它发生在应用程序级别(与基本 HTTP 身份验证中的框架或应用程序服务器级别相反)。