Phi*_*kis 1 java spring spring-security spring-boot
我期待Spring Application在生产环境中部署我的,我想包括一些基本和可靠的security措施。
首先,我扩展 WebSecurityConfigurerAdapter到我的SecurityConfiguration.java
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService ;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// TODO Auto-generated method stub
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http.csrf().disable().authorizeRequests()
.antMatchers("/admin").hasAuthority("ADMIN")
.antMatchers("/ekab").hasAuthority("EKAB")
.antMatchers("/dimos").hasAuthority("DIMOS")
.antMatchers("/","/users/**","/aeds/**","/events/**","/reports/**","*/static/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login")
.defaultSuccessUrl("/dashboard",true)
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder getPasswordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
在生产环境中CSRF应该启用,虽然我现在不处理任何 csrf 令牌
GET端点:请注意,/users/**其中包含一些包含用户信息的GET端点,我可以对访问它们的人施加限制吗?
POST端点:我还找到了一些使用 JSON Web Token保护POST的方法,这是最佳实践吗?
Spring 还提供了OAuth2.0、RSA、LDAP、依赖项来增强安全性。
我应该使用哪一种?这些是否可以防止 DDOS 攻击以及蛮力攻击?
我是否必须在应用程序的部署环境中进行修改?
Spring Security 提供了各种默认的安全攻击实现来确保应用程序是安全的。
由于您要求包括一些基本且可靠的安全措施。下面是我的一些想法,可以改进一点。
正如您所说,您已禁用“CSRF 令牌”,当您认为您的应用程序应该高度安全时,这并不好。通常情况下,大多数人禁止(在演示代码),因为他们将不能够调用/logoutURL与GET方法,因为它需要你通过提交其POST与_csrf令牌。很好,你在生产中已经照顾好了。
会话固定攻击:这是一种攻击类型,通过提供相同网站的JSESSIONIDURL 并附加到 URL 中,使用 URL 重写方法,可以窃取您当前的会话。默认情况下,Spring Security Framework 已经处理了这个问题,并且一旦用户登录它就会迁移会话。相应的配置是 -
http.sessionManagement()
.sessionFixation().migrateSession()
Run Code Online (Sandbox Code Playgroud)
保护会话 cookie:恶意脚本可以从浏览器端读取您的 cookie 信息,因此您需要确保您的 cookie 是安全的,并且可以通过制作它们来由服务器端代码访问HttpOnly。为此,您可以在 application.properties 中使用以下配置 -
server.servlet.session.cookie.http-only=true
Run Code Online (Sandbox Code Playgroud)
在 Https 上运行您的应用程序:确保您在生产中使用 https,并且在这种情况下,您只能通过在 application.properties 中添加以下配置来强制您的 cookie 通过 https 协议传输。
server.servlet.session.cookie.secure=true
Run Code Online (Sandbox Code Playgroud)
并强制 https 连接在 configure() 方法中添加以下行(但这还不够,因为您还必须使用 keytool 设置公钥/私钥)
http.requiresChannel().requiresSecure();
Run Code Online (Sandbox Code Playgroud)
应用 CSP:用户内容安全策略,以避免任何 XSS 攻击。Spring security 默认提供各种安全头。但它不会添加内容安全策略标头,您可以将它们添加到您的安全配置文件中,如下所示
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.headers().contentSecurityPolicy("script-src
'self' https://myclientscriptlocation.example.com; object-src
https://myclientsideplugins.example.com; report-uri /cspreport-endpoint/");
}
Run Code Online (Sandbox Code Playgroud)
}
密码散列:您没有使用安全配置。在将密码存储到数据库中时,您必须保持密码散列。
保护您的 application.properties 的安全性不仅应防止外部人员使用,还应防止内部人员使用。像数据库密码或任何其他配置密码的加密和解密。请在此处了解如何保护您的应用程序属性。
GET 端点:请注意 /users/** 包含一些包含用户信息的 GET 端点,我可以对访问它们的人进行限制吗?
是的,你可以申请。但这取决于您在这里想要什么。我能想到的一个例子是,IP Address filtering. 例如,如果您只希望那些位于美国的用户可以访问,或者您知道用户的 IP 范围等。
.antMatchers("/foos/**").hasIpAddress("xx.xxx.xxx.xx")
Run Code Online (Sandbox Code Playgroud)
POST 端点:我还找到了一些使用 JSON Web Token 保护 POST 的方法,这是最佳实践吗?
JWT 主要用于 RESTful Web 服务。如果您的应用程序暴露了其余端点并需要经过身份验证的访问,那么 JWT 是最佳选择。
Spring 还提供了 OAuth2.0、RSA、LDAP、依赖项来增强安全性。
这些是不同的身份验证和授权方式。其中一些有多个流程来进行身份验证和授权,但是当外部用户访问它们时,将应用相同的安全因素。
无论您是否需要它们,这完全取决于您的项目要求。例如,如果您正在开发一个供内部组织使用的应用程序,其中用户/员工在组织级别设置了所有内容,并且您希望每个人都访问此应用程序,那么 LDAP 集成会更好。
当您有多个微服务+您想要任何社交登录实现时,OAuth2.0 会更好,Login with Google否则Login with Facebook您可以遵循 OAuth2.0 集成
这些是否可以防止 DDOS 攻击以及蛮力攻击?
不。这应该通过调整各种安全参数来解决,例如限制会话时间、检查安全标头、处理内存泄漏、为 POST 请求应用超时以便没有人可以发布巨大的请求负载等。你必须做一个为减轻此类安全攻击做一些工作。
PS:permitAll()从安全配置中删除。
.defaultSuccessUrl("/dashboard",true)
.permitAll()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |