适用于Java开发人员的微服务:管理安全性和机密

1.简介

安全性是现代软件系统中异常重要的元素。 它本身就是一个巨大的主题,它包含许多不同的方面,因此切勿事后思考。 很难正确解决所有问题,尤其是在分布式微服务体系结构的情况下,尽管如此,在本教程的这一部分中,我们将讨论最关键的领域并建议您如何使用它们。

如果您的团队或组织中有安全专家,那么这是一个不错的开始。 如果没有,您最好雇用一名,因为开发人员的专业知识在这里可能相差很大。 无论如何,请不要制定自己的安全方案。

最后,在开始使用之前,请将Java SE安全编码指南作为您团队中所有Java开发人员的必读材料。 此外,Java SE平台官方文档还包括与Java安全性有关的所有规范,指南和API的完整摘要。

2.线下

在任何分布式系统中,许多数据在不同组件之间传输。 将其投影到微服务体系结构上 ,每个服务要么与其他服务直接通信,要么传递消息或事件。

使用安全传输可能是保护传输中的数据不被截取或篡改的最基本方法。 对于基于Web的通信,这通常意味着使用HTTPS (或更确切地说, HTTP over SSL / TLS )来保护隐私并保持数据完整性 。 有趣的是,尽管对于HTTP / 2而言 ,安全传输的存在仍然是可选的,但它主要仅与SSL / TLS一起使用

除了HTTPS之外 ,还有许多其他依赖TLS来确保通信安全的协议,例如DTLSSFTPWSSSMTPS等。 还值得一提的是Message Security Layer ,它是Netflix开源的可扩展,灵活的安全消息传递框架。

3.浏览器中的安全性

在网络浏览器方面,通过支持HTTP严格传输安全性HSTS ), HTTP公钥固定HPKP ), 内容安全策略CSP ), 安全cookie同一站点的cookieJCG租车公司的客户和管理Web门户肯定会依赖其中的一些)。

在脚本方面,我们有Web密码API规范,该规范描述了一个JavaScript API,用于在Web应用程序中执行基本的加密操作(哈希,签名生成和验证以及加密和解密)。

4.认证和授权

识别各种可能的参与者(用户,服务,合作伙伴和外部系统)以及允许他们在系统中做什么是确保微服务安全的另一个方面。 它与两个不同的过程密切相关,即身份验证授权

身份验证是确保实体是其声称的身份或身份的过程。 而授权是指定和施加此特定实体具有的访问权限,权限和特权的过程。

对于目前的大多数应用程序,尽管存在很多缺点 ,但单因素身份验证 (通常基于提供密码)仍然是事实上的选择。 从好的方面来看, 多种因素身份验证的不同方法虽然缓慢但肯定会得到越来越广泛的采用。

关于授权 ,基本上有两种流行的模型: 基于角色的访问控制 (也称为RBAC )和访问控制列表ACL )。 正如我们稍后将要看到的那样,大多数安全框架都支持这两种模型,因此需要做出一个最适合您的微服务体系结构上下文的慎重决策。

如果我们将身份验证授权转移到Web应用程序和服务上(例如使用JCG租车平台),则很可能最终会遵循两个行业标准,即OAuth 2.0OpenID Connect 1.0

所述 的OAuth 2.0 授权框架允许第三方应用程序获取到HTTP服务的有限访问,无论是在通过编排资源所有者和HTTP服务之间的批准相互作用代表资源所有者的,或通过允许第三方应用程序来代表自己获取访问权限。 https://tools.ietf.org/html/rfc6749

OpenID Connect 1.0 是基于 OAuth 2.0 协议 的简单身份层 它允许客户端基于授权服务器执行的身份验证来验证最终用户的身份,并以可互操作且类似于REST的方式获取有关最终​​用户的基本配置文件信息 -https:// openid。网络/连接/

这两个标准与JSON Web令牌JWT )规范密切相关,该规范通常用作OAuth 2.0承载令牌

JSON Web令牌(JWT)是一种紧凑的,URL安全的方法,用于表示要在两方之间转移的声明。 https://tools.ietf.org/html/rfc7519

在无数数据泄露和个人信息泄漏(您好, Mariott )中,安全性变得前所未有的重要。 熟悉,遵循并保持最佳安全实践和建议是绝对必要的。 关于该主题的两个出色的指南, OAuth 2.0安全性最佳实践JSON Web令牌最佳实践 ,当然属于必读类别。

5.身份提供者

最终确定身份验证授权决定后,下一个明显的问题是,您应该自己实施所有事情,还是四处寻找现有解决方案? 承认事实,您的要求是否如此独特,以至于您不得不浪费工程时间并构建自己的实现? 是您业务的核心吗? 令人惊讶的是,有多少组织陷入DIY模式并一遍又一遍地重新发明了轮子。

对于JCG租车平台,我们将使用Keycloak 已建立的开源身份和访问管理解决方案,该解决方案完全支持OpenID Connect)

Keycloak 是针对现代应用程序和服务的开源身份和访问管理解决方案。 它使只需很少甚至没有代码即可轻松保护应用程序和服务的安全。 - https://www.keycloak.org/about.htmlЕщ

Keycloak随附了非常全面的配置和安装指南,但值得一提的是,我们将使用它来管理JCG租车公司客户和支持人员的身份。

除了Keycloak之外 ,另一个值得考虑的开源替代方案是WSO2 Identity Server ,它也可能适用于JCG租车

WSO2 Identity Server是一个可扩展的开放源代码IAM解决方案,用于在企业和云环境(包括API,移动设备和物联网设备)之间联合和管理身份,无论它们基于什么标准。 https://wso2.com/identity-and-access-management/features/

在您寻求完全外包微服务的身份管理的过程中,有大量的经过认证的OpenID提供程序和商业产品可供选择。

6.保护应用程序

应用程序和服务方面的安全性可能是最需要关注的地方。 在Java生态系统中,基本上有两个用于管理身份验证授权机制的基础框架,即Spring SecurityApache Shiro

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。 它是用于保护基于Spring的应用程序的实际标准。 https://spring.io/projects/spring-security

确实,由于我们的保留服务基于Spring BootSpring WebFlux构建 ,因此支持Spring Security的选择显而易见。 将成熟的OpenID Connect集成到服务中实际上需要几行配置。 下面的代码片段仅说明了实现此目的的一种可能方法。

@EnableReactiveMethodSecurity
@EnableWebFluxSecurity
@Configuration
public class WebSecurityConfiguration {
    @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
    private String issuerUri;

    @Bean
    SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http){
        http
            .cors()
            .configurationSource(corsConfigurationSource())
            .and()
            .authorizeExchange()
            .pathMatchers(HttpMethod.OPTIONS).permitAll()
            .anyExchange()
            .authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();
        return http.build();
    }

    @Bean
    ReactiveJwtDecoder jwtDecoder() {
        return ReactiveJwtDecoders.fromOidcIssuerLocation(issuerUri);
    }
}

spring.security.oauth2.resourceserver.jwt.issuer-uri指向Keycloak领域的JCG Car Rentals实例。 如果Spring Security超出范围,则肯定值得考虑Apache Shiro

Apache Shiro 是一个功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理…– https://shiro.apache.org/

pac4j安全引擎还鲜为人知,它还致力于保护Web应用程序和Web服务。 在JCG租车平台的管理门户网站依靠pac4j与整合Keycloak使用ID连接

由于OpenID Connect使用JWT (及相关规范),因此您可能需要使用其中一个库来实现相关规范。 使用最广泛的工具包括Nimbus JOSE + JWTjose4jJava JWTApache CXF

如果我们将覆盖范围从Java扩展到更广泛的JVM,那么您可能会遇到其他一些库。 其中之一是Silhouette ,主要由Play Framework网络应用程序使用。

7.保守秘密

典型的微服务体系结构中的大多数(如果不是全部)服务将依赖某种类型的配置才能正常运行。 此配置通常特定于服务所部署到的环境,并且,如果您遵循12 Factor App方法,则已经知道必须将这种配置外部化并与代码分开。

尽管如此,许多组织仍将配置存储在靠近服务的位置,配置文件中,甚至在代码中进行了硬编码。 更糟糕的是,这样的配置通常包含敏感信息,例如访问数据存储,服务帐户或加密密钥的凭据。 此类数据被归类为机密信息,绝不应该泄漏。 像git-secrets这样的项目将帮助您防止将秘密和凭据提交到源代码控制存储库中。

幸运的是,有几种选择。 最简单的方法是使用加密并仅存储加密的值。 对于Spring Boot应用程序,您可以将Spring Boot CLISpring Cloud CLI一起使用来加密和解密属性值。

$ ./bin/spring encrypt --key <secret> <value>
d66bcc67c220c64b0b35559df9881a6dad8643ccdec9010806991d4250ecde60

此类加密值应在配置中以特殊的{cipher}前缀作为前缀,如以下YAML片段中所示:

spring:   
  data:     
    cassandra:       
      password:"{cipher}d66bcc67c220c64b0b35559df9881a6dad8643ccdec9010806991d4250ecde60"

要配置对称密钥,我们只需要设置encrypt.key属性或更好的属性即可,请使用ENCRYPT_KEY环境变量。 通过为Spring Boot应用程序中的属性源提供加密支持, JasyptSpring Boot集成以类似的方式工作。

使用加密的属性是可行的,但是非常幼稚,可以说是更好的方法是利用专用的秘密管理基础结构,例如HashiCorp的 Vault

保险柜 保护,存储并严格控制对令牌,密码,证书,API密钥和现代计算中其他机密的访问。 https://learn.hashicorp.com/vault/#getting-started

保管箱使秘密管理变得安全且非常容易。 在Spring Boot之上构建的服务(例如,来自JCG Car Rentals平台的Reservation Service)可能会受益于一流的Spring Cloud Vault集成

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

Spring Cloud Vault提供的强大功能之一就是能够将Vault密钥/值存储插入为应用程序属性源。 Reservation Service通过使用bootstrap.yml配置文件来利用它。

spring:
  application:
    name: reservation-service
  cloud:
    vault:
      host: localhost
      port: 8200
      scheme: https
      authentication: TOKEN
      token: <token>
      kv:
        enabled: true

尽管Vault可能是最著名的,但仍有许多不错的替代方案非常适合微服务体系结构 。 先驱者之一是Keywhiz ,这是一个用于管理和分发机密的系统,由Square开发并开源。 另一个是Knox ,该服务用于存储和旋转其他服务使用的机密,密钥和密码,该服务来自Pinterest

8.照顾好您的数据

数据可能是您可能拥有的最重要的资产,因此,应格外小心地进行管理。 信用卡号码,社会安全号码,银行帐户或/和个人身份信息PII )等某些数据非常敏感,应该安全地进行操作。 这些天通常假定必须对其进行加密(在未经授权的访问或盗窃的情况下,这会阻止数据可见性)。

在“ 确保机密安全”部分中,我们讨论了管理加密密钥的方法,但是您仍然必须决定是否应在应用程序级别或存储级别对数据进行加密。 尽管两种方法各有优缺点,但并非所有数据存储都支持静态加密 ,因此您在这里可能没有选择。 在这种情况下,您可能会发现OWASP Foundation发布了宝贵的Cryptographic StoragePassword Storage备忘单,并且针对最新的安全性做法保持了最新状态。

9.扫描您的依存关系

服务集合中的每个微服务很可能依赖于多个框架或库,而这些框架或库又具有自己的一组依赖关系。 使依赖关系保持最新状态是安全措施的另一个方面,因为可能会在其中任何一个中发现漏洞。

OWASP依赖项检查是一个开放源代码解决方案,可用于扫描Java应用程序以识别已知漏洞组件的使用。 它具有适用于Apache MavenGradleSBT的专用插件,并且已集成到每个JCG租车服务的构建定义中。

OWASP依赖项检查是一个开放源代码解决方案,可用于扫描Java应用程序以识别已知漏洞组件的使用。 它具有适用于Apache MavenGradleSBT的专用插件,并且已集成到每个JCG租车服务的构建定义中。 Reservation Servicepom.xml的以下片段说明了使用情况。

<plugin>
	<groupId>org.owasp</groupId>
	<artifactId>dependency-check-maven</artifactId>
	<version>4.0.0</version>
	<executions>
		<execution>
			<goals>
				<goal>check</goal>
			</goals>
		</execution>
	</executions>
</plugin>

为了了解OWASP依赖项检查报告的输出内容,让我们看一下保留服务中已知漏洞中识别出的一些依赖项。

相依性 CPE 座标 最高严重度 CVE计数 CPE信心 证据计数
jul-to-slf4j-1.7.25.jar cpe:/ a:slf4j:slf4j:1.7.25 org.slf4j:jul-to-slf4j:1.7.25 1个 最高 28
jcl-over-slf4j-1.7.25.jar cpe:/ a:slf4j:slf4j:1.7.25 org.slf4j:jcl-over-slf4j:1.7.25 1个 最高 29
slf4j-api-1.7.25.jar cpe:/ a:slf4j:slf4j:1.7.25 org.slf4j:slf4j-api:1.7.25 1个 最高 29

由于JCG租车有一对夫妇,其使用组件的Node.js的 ,它是重要的审核他们的软件包的依赖的安全漏洞也是如此。 最近引入的npm audit 命令扫描每个项目中的漏洞,并自动将所有兼容的更新安装到易受攻击的依赖项。 下面是执行审计命令的示例。

$ npm audit

                       === npm audit security report ===
found 0 vulnerabilities
 in 20104 scanned packages

10.包装

自从Docker将容器推向大众以来,它们就成为了包括Java应用程序在内的各种应用程序的实际打包和分发模型。 但是强大的功能伴随着巨大的责任:容器内部的漏洞可能会使您的应用程序严重暴露。 幸运的是,我们有Clair容器的漏洞静态分析。

Clair 是一个开源项目,用于 静态分析 应用程序容器(当前包括 appc Docker )中 的漏洞 https://github.com/coreos/clair

请不要忽略可能来自容器的威胁,并使漏洞在发布任何图像之前进行强制性扫描。

更进一步,让我们谈谈容器运行时沙箱gVisor ,它通过在运行时对容器进行围栏来对安全性有另一种看法。

gVisor 是用Go编写的用户空间内核,它实现了Linux系统表面的很大一部分。 它包括一个 名为 runsc 开放式容器计划(OCI) 运行时 ,它在应用程序和主机内核之间提供隔离边界。 https://github.com/google/gvisor

这项技术是相当新的,仍然存在一定的局限性,但是它为安全地运行容器开辟了一个全新的视野。

11.看你的日志

通过泄露敏感或个人身份信息PII ),应用程序或服务日志多久成为一次安全漏洞,这真是令人惊讶。 解决此类问题的常用方法是使用屏蔽,过滤, 清理数据匿名化

OWASP日志备忘单是一份重点文档,旨在提供有关构建应用程序日志记录机制(尤其是与安全日志记录有关)的权威指南。

12.编排

到目前为止,我们主要集中在如何使用专用的库和框架使安全措施成为应用程序和服务的组成部分。 一切都很好,但是随着时间的流逝,您可能会一次又一次地看到相同的模式。 如果我们可以将这种重复的跨领域关注点转移到其他地方,那不是很好吗? 这很合理,并且在某种程度上已经在发生……

如果您使用Apache MesosKubernetes协调微服务部署,则有很多与安全相关的功能是免费的。 但是,最有趣的发展发生在新生的基础架构层,称为服务网格

到目前为止 ,最先进的,可立即投入生产的服务网格包括IstioLinkerdConsul Service Mesh 。 尽管我们将在本教程的后面部分进一步讨论这些问题,但是值得一提的是,它们遵循最佳安全性惯例和约定引起了很多关注。

13.密封云

到目前为止,我们已经讨论了与托管环境完全无关的开源解决方案,但是如果您打算在云中部署微服务 ,那么了解云提供商提供的托管选项将更有意义。

让我们快速了解一下该领域的领导者为您提供的服务。 Microsoft Azure包括用于对密钥和小秘密(例如密码)进行加密的Key Vault ,但是与安全相关的服务的完整列表非常全面。 它还具有一个安全中心 ,一站式服务,以进行统一的安全管理和高级威胁防护。

Google Cloud提供的与安全相关的产品列表令人印象深刻。 在许多服务中,还有一个专用的服务来管理加密密钥,即密钥管理服务 (或简称为KMS ),令人惊讶的是,它不直接存储机密(它只能加密本应存储在其他位置的机密)。 安全门户是学习选项的重要资源。

AWS 该领域的长期领导者,有许多安全产品可供选择。 它甚至提供了两种不同的服务来管理您的加密密钥和机密,即密钥管理服务KMS )和Secrets Manager 。 除了托管产品, 值得一提的开源知己Lyft该商店的秘密DynamoDB使用加密静止。 对云安全网页的引用将帮助您入门。

14.结论

对于我们大多数人来说,安全是一个困难的课题。 在实施微服务体系结构时应用适当的安全边界和措施更加困难,但绝对必要。 在本教程的这一部分中,我们重点介绍了您可能会遇到的一系列关键主题,但这远非详尽。

15.下一步是什么

在本教程的下一部分中,我们将讨论微服务体系结构中的各种测试实践和技术。

翻译自: https://www.javacodegeeks.com/2019/01/microservices-for-java-developers-managing-security-and-secrets.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值