SpringBoot⼗种安全措施
Spring Boot⼤⼤简化了Spring应⽤程序的开发。它的⾃动配置和启动依赖⼤⼤减少了开始⼀个应⽤所需的代码和配置量,如果你已经习惯了Spring和⼤量XML配置,Spring Boot⽆疑是⼀股清新的空⽓。
Spring Boot于2014年⾸次发布,⾃那以后发⽣了很多变化。安全性问题与代码质量和测试⾮常相似,已经⽇渐成为开发⼈员关⼼的问题,如果你是开发⼈员并且不关⼼安全性,那么也许认为⼀切理所当然。本⽂⽬的是介绍如何创建更安全的Spring Boot应⽤程序。
马特雷布尔与Simon Maple合作完成了这篇⽂章,他们都是为安全公司⼯作,热爱Java,并希望帮助开发⼈员创建更安全的应⽤程序。我们认为撰写这篇⽂章将是回馈社区的有趣⽅式。
1.在⽣产中使⽤HTTPS
传输层安全性(TLS)是HTTPS的官⽅名称,你可能听说过它称为SSL(安全套接字层),SSL是已弃⽤的名称,TLS是⼀种加密协议,可通过计算机⽹络提供安全通信。其主要⽬标是确保计算机应⽤程序之间的隐私和数据完整性。
过去,TLS / SSL证书很昂贵,⽽且HTTPS被认为很慢,现在机器变得更快,已经解决了性能问题,Let's Encrypt提供免费的TLS证书,这两项发展改变了游戏,并使TLS成为主流。
截⾄2018年7⽉24⽇,Google Chrome 将HTTP⽹站标记为“不安全”。虽然这在⽹络社区引起了相当多的争议。知名安全研究员特洛伊亨特创建了⼀个?跟踪不使⽤HTTPS的⼤型⽹站的⽹站。
Let’s Encrypt TLS证书可以⾃动化⽣成和更新,由于他们是免费的,所以没有理由不去做!的加密是如何做到这⼀点的有⽤指南。
要在Spring Boot应⽤程序中强制使⽤HTTPS,您可以扩展WebSecurityConfigurerAdapter并要求安全连接。
@Configuration
public class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
}
}
另⼀个重要的事情是使⽤HTTP严格传输安全性(HSTS)。HSTS是⼀种Web安全策略机制,可以保护⽹站免受协议降级攻击和cookie劫持。服务器使⽤名为Strict-Transport-Security的响应头字段将HSTS策略传送到浏览器。Spring Security默认发送此标头,以避免在开始时出现不必要的HTTP跃点。
2.使⽤Snyk检查你的依赖关系
你很可能不知道应⽤程序使⽤了多少直接依赖项,这通常是正确的,尽管依赖性构成了整个应⽤程序的⼤部分。攻击者越来越多地针对开源依赖项,因为它们的重⽤为恶意⿊客提供了许多受害者,确保应⽤程序的整个依赖关系树中没有已知的漏洞⾮常重要。
Snyk测试你的应⽤程序构建包,标记那些已知漏洞的依赖项。它在仪表板在应⽤程序中使⽤的软件包中存在的漏洞列表。
此外,它还将建议升级的版本或提供补丁,并提供针对源代码存储库的拉取请求来修复您的安全问题。Snyk还确保在你的存储库上提交的任何拉取请求(通过webhooks)时都是通过⾃动测试的,以确保它们不会引⼊新的已知漏洞。
每天都会在现有项⽬和库中发现新的漏洞,因此监控和保护⽣产部署也很重要。Snyk拍摄快照并监控你的部署,以便在发现新漏洞时,你可以通过JIRA,slack或电⼦邮件⾃动收到通知,并创建拉取请求以提供新漏洞的升级和补丁。
Snyk可通过Web UI和CLI获得,因此您可以轻松地将其与CI环境集成,并将其配置为在存在严重性超出设定阈值的漏洞时中断构建。
你可以免费使⽤Snyk进⾏开源项⽬或使⽤有限数量的私有项⽬。
3.升级到最新版本
定期升级应⽤程序中的依赖项有多种原因。安全性是让您有升级动⼒的最重要原因之⼀。该start.spring.io起始页⾯采⽤了最新的春季版本的软件包,以及依赖关系,在可能的情况。
基础架构升级通常不如依赖项升级具有破坏性,因为库作者对向后兼容性和版本之间的⾏为更改的敏感性各不相同。话虽如此,当你在配置中发现安全漏洞时,您有三种选择:升级,修补程序或忽略。
在对应⽤程序进⾏必要的更改以使⽤较新版本之后,就应⽤程序的整体运⾏状况⽽⾔,升级是最安全的。
4.启⽤CSRF保护
跨站点请求伪造(Cross-Site Request Forgery )是⼀种攻击,强制⽤户在他们当前登录的应⽤程序中执⾏不需要的操作。如果⽤户是普通⽤户,⼀个成功攻击可能涉及请求的状态更改,如转移资⾦或更改其电⼦邮件地址,如果⽤户具有提升管理员的权限,则CSRF攻击可能会危及整个应⽤程序。
Spring Security具有出⾊的CSRF⽀持,如果您正在使⽤Spring MVC的<form:form>标签或Thymeleaf @EnableWebSecurity,默认情况下处于启⽤状态,CSRF令牌将⾃动添加为隐藏输⼊字段。
如果你使⽤的是像Angular或React这样的JavaScript框架,则需要配置CookieCsrfTokenRepository以便JavaScript可以读取cookie。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
<p>
如果你正在使⽤Angular,这就是你需要做的。如果您使⽤的是React,则需要读取XSRF-TOKENcookie并将其作为X-XSRF-TOKEN标题发回。
springboot框架的作用当请求通过HTTPS发⽣时,Spring Security会⾃动加⼊⼀个secure标识到XSRF-TOKENcookie 。Spring Security对于CSRF cookie 不使⽤SameSite=strict 的标志,但它在使⽤Spring Session或WebFlux会话处理时会使⽤,这对会话cookie有意义,因为它有助于识别⽤户,但是没有为CSRF cookie提供太多价值,因为CSRF令牌也需要在请求中。
5.使⽤内容安全策略防⽌XSS攻击
内容安全策略(CSP)是⼀个增加的安全层,可帮助缓解XSS(跨站点脚本)和数据注⼊攻击。要启⽤它,你需要配置应⽤程序以返回Content-Security-Policy标题。你还可以在HTML页⾯中<meta http-equiv="Content-Security-Policy">使⽤标记。
Spring安全性默认提供了许多安全标头:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Spring Security * 默认情况下不添加 CSP。你可以使⽤以下配置在Spring Boot应⽤程序中启⽤CSP标头。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.contentSecurityPolicy("script-src 'self' ample; object-src ample; report-uri /csp-
report-endpoint/");    }
}<p>CSP是防⽌XSS攻击的良好防御,请记住,打开CSP能让CDN访问许多⾮常古⽼且易受攻击的JavaScript库,这意味着使⽤CDN不会为安全性增加太多价值。
你可以在securityheaders测试你的CSP标头是否有⽤。
6.使⽤OpenID Connect进⾏⾝份验证
OAuth 2.0是⾏业标准的授权协议。它使⽤scope来定义授权⽤户可以执⾏的操作的权限。但是,OAuth 2.0不是⾝份验证协议,并且不提供有关经过⾝份验证的⽤户的信息。
OpenID Connect(OIDC)是⼀个OAuth 2.0扩展,提供⽤户信息,除了访问令牌之外,它还添加了ID令牌,以及/userinfo可以从中获取其他信息的端点,它还添加了发现功能和动态客户端注册的端点。
如果使⽤OIDC进⾏⾝份验证,则⽆需担⼼如何存储⽤户、密码或对⽤户进⾏⾝份验证。相反,你可以使⽤⾝份提供商(IdP)为你执⾏此操作,你的IdP甚⾄可能提供多因素⾝份验证(MFA)等安全附加组件。
要了解如何在Spring Boot应⽤程序中使⽤OIDC,请参阅Spring Security 5.0和OIDC⼊门。要总结如何使⽤它,你需要向项⽬添加⼀些依赖项,然后在l⽂件中配置⼀些属性。
spring:
security:
oauth2:
client:
registration:
okta:
client-id: {clientId}
client-secret: {clientSecret}
scope: openid email profile
provider:
okta:
issuer-uri: {yourOktaDomain}/oauth2/default
注意:issuer-uri仅在Spring Security 5.1中⽀持使⽤,Spring Security 5.1正在积极开发中并计划于2018年9⽉发布。
你可以使⽤像Keycloak这样的开源系统来设置⾃⼰的OIDC服务器。如果你不想在⽣产中维护⾃⼰的服务器,可以使⽤Okta的Developer API。
7.管理密码?使⽤密码哈希!
以纯⽂本格式存储密码是最糟糕的事情之⼀。幸运的是,Spring Security默认情况下不允许使⽤纯⽂
本密码。它还附带了⼀个加密模块,可⽤于对称加密,⽣成密钥和密码散列(也就是密码编码)。
PasswordEncoder 是Spring Security中密码哈希的主要接⼝,如下所⽰:
public interface PasswordEncoder {
String encode(String rawPassword);
boolean matches(String rawPassword, String encodedPassword);
}
Spring Security提供了⼏种实现,最受欢迎的是BCryptPasswordEncoder和Pbkdf2PasswordEncoder。
对于⼀般的密码管理,我们建议使⽤SCrypt或Argon2, SCrypt现在已经过时了(已经有⼀段时间了),并且有⼀个额外的复杂因
素,BCrypt没有这个因素,这使得暴⼒破解变得加倍地困难。它由着名的密码学家/安全⼈员(Colin Percival)编写,并且在⼏乎所有编程语⾔中都有很好的库,SCrypt也得到Latacora的认可。
Spring Security 5.1(即2018年9⽉下旬)将附带UserDetailsPasswordService API,允许您升级密码存储。
8.安全地存储秘密
应谨慎处理敏感信息,如密码,访问令牌等,你不能以纯⽂本形式传递,或者如果将它们保存在本地存储中。由于(GitHub)的历史已经⼀次⼜⼀次证明,开发⼈员并没有仔细考虑如何存储他们的秘密。
⼀个好的做法是将保密信息存储在保管库中,该保管库可⽤于存储,提供对应⽤程序可能使⽤的服务的访问权限,甚⾄⽣成凭据。HashiCorp的Vault使得存储机密变得很轻松,并提供了许多额外的服务。
如果您对此感兴趣,请务必花⼀些时间查看Spring Vault,它为HashiCorp Vault添加抽象,为客户提供基于Spring注释的访问,允许他们访问、存储和撤销机密⽽不会迷失在基础架构中。以下代码段显⽰了使⽤注释从Spring Vault中提取密码的⽅便程度。
@Value("${password}")
String password;
9.使⽤OWASP的ZAP测试您的应⽤程序
OWASP ZAP安全⼯具是针对在运⾏活动的应⽤程序进⾏渗透测试的代理。它是⼀个受欢迎的(超过4k星)免费的开源项⽬,托管在GitHub上。
OWASP ZAP⽤于查漏洞的两种⽅法是Spider和Active Scan。
Spider⼯具以URL种⼦开头,它将访问并解析每个响应,识别超链接并将它们添加到列表中。然后,它将访问这些新到的URL并以递归⽅式继续,为您的Web应⽤程序创建URL映射。
Active Scan⼯具将根据潜在漏洞列表⾃动测试你选择的⽬标。它提供了⼀个报告,显⽰Web应⽤程序可被利⽤的位置以及有关漏洞的详细信息。
10.让你的安全团队进⾏代码审查
代码评审对任何⾼性能软件开发团队都⾄关重要。在Okta,我们所有的⽣产代码和官⽅开源项⽬都需要通过我们的专家安全团队进⾏分析,你的公司可能没有安全专家,但如果你正在处理敏感数据,也许你应该这样做!
欢迎⼤家加⼊Java⾼级架构/互联⽹(严禁培训机构、⼴告,最⼲净的技术交流):号:1083683150(备注:技术或者4000G架构师资源)
平台本⼈收集个⼤量资源(4000G架构师资源,1000G⼤数据资源),只做分享,欢迎⼤家关注获取,保证免费,⾮任何机构
更多精彩请扫码关注—— 名称:java版web项⽬ id :java_project

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。