我正试图找出使用Spring Cloud和Netflix堆栈构建和实现微服务的最佳方法,特别是使用Eureka和Feign。我有几个与安全相关的问题:
我看到您可以使用用户名/密码凭据配置Eureka Server。这可以防止未经授权的应用程序,但随后每个应用程序必须共享凭据才能访问Eureka。是否有一种简单的方法来创建凭证注册表,以便每个微服务都可以拥有它? (将它挂钩到Spring Security的堆栈中会很好 - UserDetailService
等等)
一旦微服务连线并通过假装进行通信,是否可以将原始请求上使用的凭证共享/传递给其他微服务的其他呼叫?因此,如果“Jim”在 FooService 上请求/foos
,在 BarService 上请求 FooService 请求/bars
, BarService 会知道是Jim要求他们吗?
吉姆> FooService> BarService - BarService知道正在处理Jim的请求......
答案 0 :(得分:1)
大卫。您可能想看看我撰写的关于保护Spring云服务的文章。由于组织之间的安全实现差别很大,因此Spring团队在很大程度上将这个主题留给了开发人员。此示例在eureka和配置服务器上使用基本身份验证。
http://www.baeldung.com/spring-cloud-securing-services
一些小小的问题应该是:除了对系统其余部分进行的任何其他类型的身份验证之外,还必须在配置和发现服务器上定义身份验证。这两个服务器必须处理它们自己的身份验证,因为它们通常需要在auth服务器启动之前运行(因为它从配置服务中提取配置并向发现服务注册)。
服务通信服务是一种不同的野兽。像大卫所说,你必须问自己的问题是,你是否使用ip安全服务运行,它们是否在整个网络上运行,在你的应用程序中发生了身份验证。没有这些问题,很难给出具体的建议。
该领域的一些一般性建议可能是:
如果您的服务在IP防火墙后面运行,您可以指定一个唯一的标头来验证任何进入的服务。这样您就不需要为内部网络指定权限,只需识别每个服务即可足够了。您甚至可以白名单列出特定的IP地址,以便始终允许。
如果您正在运行这些暴露在网络上的服务,您可能希望将所有流量引导回网关(这也应该是您的应用程序进行身份验证的地方)。如果你得到403,那么你应该以编程方式执行登录并使用会话ID重试请求。如果使用spring-session配置系统,则每个服务都会自动提取该服务的身份验证详细信息。
这些只是众多可能性中的两个。我不太确定你在编写这些安全配置时有多舒服,所以如果你想要一些更多的帮助,请将你的问题简化为一个场景,我将尝试为你的用例编写一个通用的解决方案。