如何执行基本的 Spring Boot 应用程序安全性

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.0RSALDAP、依赖项来增强安全性。

我应该使用哪一种?这些是否可以防止 DDOS 攻击以及蛮力攻击?

我是否必须在应用程序的部署环境中进行修改?

Raj*_*eev 8

Spring Security 提供了各种默认的安全攻击实现来确保应用程序是安全的。

由于您要求包括一些基本且可靠的安全措施。下面是我的一些想法,可以改进一点。

  1. 正如您所说,您已禁用“CSRF 令牌”,当您认为您的应用程序应该高度安全时,这并不好。通常情况下,大多数人禁止(在演示代码),因为他们将不能够调用/logoutURL与GET方法,因为它需要你通过提交其POST_csrf令牌。很好,你在生产中已经照顾好了。

  2. 会话固定攻击:这是一种攻击类型,通过提供相同网站的JSESSIONIDURL 并附加到 URL 中,使用 URL 重写方法,可以窃取您当前的会话。默认情况下,Spring Security Framework 已经处理了这个问题,并且一旦用户登录它就会迁移会话。相应的配置是 -

    http.sessionManagement()
      .sessionFixation().migrateSession()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保护会话 cookie:恶意脚本可以从浏览器端读取您的 cookie 信息,因此您需要确保您的 cookie 是安全的,并且可以通过制作它们来由服务器端代码访问HttpOnly。为此,您可以在 application.properties 中使用以下配置 -

    server.servlet.session.cookie.http-only=true
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 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)
  5. 应用 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)

    }

  6. 密码散列:您没有使用安全配置。在将密码存储到数据库中时,您必须保持密码散列。

  7. 保护您的 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)