java gzip 机密
1.简介
安全性是现代软件系统中异常重要的元素。 它本身就是一个巨大的主题,它包含许多不同的方面,因此切勿事后思考。 很难做到所有事情都正确,特别是在分布式微服务体系结构的情况下,尽管如此,在本教程的这一部分中,我们将讨论最关键的领域并建议您如何使用它们。
如果您的团队或组织中有安全专家,那么这是一个不错的开始。 如果没有,您最好雇用一名,因为开发人员的专业知识在这里可能相差很大。 无论如何,请不要制定自己的安全方案。
目录
最后,在开始使用之前,请将Java SE安全编码指南作为您团队中任何Java开发人员的必读材料。 此外,Java SE平台官方文档还包括与Java安全性有关的所有规范,指南和API的完整摘要。
2.线下
在任何分布式系统中,许多数据在不同组件之间传输。 将其投影到微服务体系结构上 ,每个服务要么与其他服务直接通信,要么传递消息或事件。
使用安全传输可能是保护传输中的数据免于被拦截或篡改的最基本方法。 对于基于Web的通信,通常意味着使用HTTPS (或更确切地说, HTTP over SSL / TLS )来保护隐私并保持数据完整性 。 有趣的是,尽管对于HTTP / 2来说 ,安全传输的存在仍然是可选的,但它主要仅与SSL / TLS一起使用 。
除了HTTPS之外 ,还有许多其他依赖TLS来确保通信安全的协议,例如DTLS , SFTP , WSS和SMTPS等。 还值得一提的是Message Security Layer ,它是Netflix开源的可扩展且灵活的安全消息传递框架。
3.浏览器中的安全性
在网络浏览器方面,通过支持HTTP严格传输安全性 ( HSTS ), HTTP公钥固定 ( HPKP ), 内容安全策略 ( CSP ), 安全cookie和同一站点的cookie ( JCG租车公司的客户和管理Web门户肯定会依赖其中的一些)。
在脚本方面,我们有Web密码API规范,该规范描述了一个JavaScript API,用于在Web应用程序中执行基本的加密操作(哈希,签名生成和验证以及加密和解密)。
4.认证和授权
识别各种可能的参与者(用户,服务,合作伙伴和外部系统)以及允许他们在系统中做什么是确保微服务安全的另一个方面。 它与两个不同的过程密切相关,即身份验证和授权 。
认证是确保实体是其声称的身份或身份的过程。 而授权是指定和施加此特定实体具有的访问权限,权限和特权的过程。
对于目前的大多数应用程序,尽管存在很多缺点 ,但单因素身份验证 (通常基于提供密码)仍然是事实上的选择。 从好的方面来说, 多种因素身份验证的不同方法虽然缓慢但肯定会得到越来越广泛的采用。
关于授权 ,基本上有两种流行的模型: 基于角色的访问控制 (也称为RBAC )和访问控制列表 ( ACL )。 正如我们稍后将要看到的那样,大多数安全框架都支持这两种模型,因此需要做出一个最适合您的微服务体系结构上下文的慎重决策。
如果我们将身份验证和授权转移到Web应用程序和服务上(例如使用JCG租车平台),则最有可能以两种行业标准告终: OAuth 2.0和OpenID 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 Car Rentals客户和支持人员的身份。
除了Keycloak之外 ,另一个值得考虑的开源替代方案是WSO2 Identity Server ,它也可能适用于JCG租车 。
WSO2 Identity Server是可扩展的开放源代码IAM解决方案,用于在企业和云环境(包括API,移动设备和物联网设备)之间联合和管理身份,无论它们基于什么标准。 – https://wso2.com/identity-and-access-management/features/
在您希望将微服务的身份管理完全外包的过程中,有大量的经过认证的OpenID提供程序和商业产品可供选择。
6.保护应用程序
应用程序和服务方面的安全性可能是最需要关注的地方。 在Java生态系统中,基本上有两个用于管理身份验证和授权机制的基础框架: Spring Security和Apache Shiro 。
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。 它是用于保护基于Spring的应用程序的实际标准。 – https://spring.io/projects/spring-security
确实,由于我们的保留服务基于Spring Boot和Spring 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 + JWT , jose4j , Java JWT和Apache CXF 。
如果我们将覆盖范围从Java扩展到更广泛的JVM,那么您可能会遇到其他一些库。 其中之一是Silhouette ,主要由Play Framework网络应用程序使用。
7.保守秘密
典型的微服务体系结构中的大多数(如果不是全部)服务将依赖某种类型的配置才能正常运行。 此配置通常特定于服务所部署到的环境,并且,如果您遵循12 Factor App方法,则您已经知道必须将这种配置外部化并与代码分开。
尽管如此,许多组织仍将配置存储在靠近服务的位置,存储在配置文件中,甚至在代码中进行了硬编码。 更糟糕的是,这样的配置通常包含敏感信息,例如访问数据存储,服务帐户或加密密钥的凭据。 这些数据被归类为机密,绝不应该泄漏。 像git-secrets这样的项目将帮助您防止将秘密和凭据提交到源代码控制存储库中。
幸运的是,有几种选择。 最简单的方法是使用加密并仅存储加密的值。 对于Spring Boot应用程序,您可以将Spring Boot CLI与Spring Cloud CLI一起使用来加密和解密属性值。
$ ./bin/spring encrypt --key <secret> <value>
d66bcc67c220c64b0b35559df9881a6dad8643ccdec9010806991d4250ecde60
此类加密值应在配置中以特殊的{cipher}
前缀作为前缀,例如在以下YAML片段中:
spring:
data:
cassandra:
password:"{cipher}d66bcc67c220c64b0b35559df9881a6dad8643ccdec9010806991d4250ecde60"
要配置对称密钥,我们只需要设置encrypt.key
属性或更好的属性即可,请使用ENCRYPT_KEY
环境变量。 通过为Spring Boot应用程序中的属性源提供加密支持, Jasypt的Spring 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发布了宝贵的“ 加密存储”和“ 密码存储”备忘单,并针对最新的安全性做法进行了更新。
9.扫描您的依存关系
微服务集合中的每个微服务很可能依赖于多个框架或库,而这些框架或库又具有自己的依赖关系集。 使依赖关系保持最新状态是安全措施的另一个方面,因为可能会在其中任何一个中发现漏洞。
OWASP依赖项检查是一个开放源代码解决方案,可用于扫描Java应用程序以识别已知漏洞组件的使用。 它具有适用于Apache Maven , Gradle , SBT的专用插件,并且已集成到每个JCG租车服务的构建定义中。
OWASP依赖项检查是一个开放源代码解决方案,可用于扫描Java应用程序以识别已知漏洞组件的使用。 它具有适用于Apache Maven , Gradle , SBT的专用插件,并且已集成到每个JCG租车服务的构建定义中。 Reservation Service的pom.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 Mesos或Kubernetes协调微服务部署,则有很多与安全相关的功能是免费的。 但是,最有趣的发展发生在新生的基础架构层,称为服务网格 。
到目前为止 ,最先进的,可立即投入生产的服务网格包括Istio , Linkerd和Consul Service Mesh 。 尽管我们将在本教程的后面部分进一步讨论这些问题,但是值得一提的是,它们遵循最佳安全实践和约定而引起了很多关注。
13.密封云
到目前为止,我们已经讨论了与托管环境完全无关的开源解决方案,但是如果您打算在云中部署微服务 ,那么了解云提供商提供的托管选项将更有意义。
让我们快速了解一下该领域的领导者为您提供的服务。 Microsoft Azure包括用于对密钥和小秘密(例如密码)进行加密的Key Vault ,但是与安全相关的服务的完整列表非常全面。 它还具有一个安全中心 ,一站式服务,用于统一安全管理和高级威胁防护。
Google Cloud提供的与安全相关的产品列表令人印象深刻。 在许多服务中,还有一个专用于管理加密密钥的服务 ,即密钥管理服务 (或简称为KMS ),令人惊讶的是,它不直接存储机密(它只能加密您应该存储在其他位置的机密)。 安全门户是学习选项的重要资源。
AWS 是该领域的长期领导者,有许多安全产品可供选择。 它甚至提供了两种不同的服务来管理您的加密密钥和机密: 密钥管理服务 ( KMS )和机密管理器 。 除了托管产品, 值得一提的开源知己从Lyft该商店的秘密DynamoDB使用加密静止。 对云安全网页的引用将帮助您入门。
14.结论
对于我们大多数人来说,安全是一个难题。 在实施微服务体系结构时应用适当的安全边界和措施更加困难,但绝对必要。 在本教程的这一部分中,我们重点介绍了您可能会遇到的一系列关键主题,但这远非详尽。
15.下一步是什么
在本教程的下一部分中,我们将讨论微服务体系结构中的各种测试实践和技术。
java gzip 机密