【问题标题】:How to perform a basic Spring Boot application security [closed]如何执行基本的 Spring Boot 应用程序安全性 [关闭]
【发布时间】:2021-07-09 17:27:40
【问题描述】:

我期待在生产环境中部署我的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();
    }


}


在生产环境中应该启用CSRF,虽然我现在不处理任何 csrf 令牌

  • GET 端点:请注意,/users/** 包含一些 GET 端点,其中包含 用户信息,我可以对访问者应用限制吗他们?

  • POST 端点:我还找到了一些保护 POST 的方法,方法是使用 JSON Web Token ,这是最佳实践吗?

Spring还提供OAuth2.0RSALDAP等依赖项来增强安全性。

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

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

【问题讨论】:

    标签: java spring spring-boot spring-security


    【解决方案1】:

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

    既然您要求包含一些基本和可靠的安全措施。以下是我的一些想法,可以改进一点。

    1. 正如您所说,您已禁用“CSRF 令牌”,当您认为您的应用程序应该高度安全时,这并不好。通常,大多数人禁用(在演示代码中),因为他们将无法使用 GET 方法调用 /logout URL,因为它要求您通过 POST 使用 _csrf 令牌提交它。很好,你已经在生产中照顾了。

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

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

      server.servlet.session.cookie.http-only=true
      
    4. 在 Https 上运行您的应用程序:确保您在生产中使用 https,并且在这种情况下,您只能通过在 application.properties 中添加以下配置来强制您的 cookie 通过 https 协议传输。

       server.servlet.session.cookie.secure=true
      

      并强制 https 连接在 configure() 方法中添加以下行(但这还不够,因为您还必须使用 keytool 设置公钥/私钥)

         http.requiresChannel().requiresSecure();
      
    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/");
      }
      

      }

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

    7. 保护您的 application.properties' 安全性不仅应防止外部人员使用,还应防止内部人员使用。就像数据库密码或任何其他配置密码的加密和解密一样。关注here,了解如何保护您的应用程序属性。

    GET 端点:注意 /users/** 包含一些 GET 端点 包含用户信息,我可以对访问者应用限制吗 他们?

    是的,您可以申请。但这取决于您的要求。我能想到的一个例子是IP Address filtering。例如,如果您只希望那些在美国的用户可以访问,或者如果您知道用户的 IP 范围等。

      .antMatchers("/foos/**").hasIpAddress("xx.xxx.xxx.xx")
    

    POST Endpoints:我还找到了一些方法来保护 POST,方法是使用 JSON Web Token ,这是最佳实践吗?

    JWT 主要用于 RESTful Web 服务。如果您的应用程序暴露了其他端点并且需要经过身份验证的访问,那么 JWT 是最佳选择。

    Spring还提供了OAuth2.0、RSA、LDAP、依赖项来增强 安全。

    这些是不同的身份验证和授权方式。其中一些有多个流程来进行身份验证和授权,但是当它们被外部用户访问时,相同的安全因素将应用于这些流程。

    是否需要它们完全取决于您的项目要求。例如,如果您正在开发一个供内部组织使用的应用程序,其中用户/员工在组织级别设置了所有内容,并且您希望每个人都可以访问此应用程序,那么 LDAP 集成会更好。

    当您有多个微服务时,OAuth2.0 会更好 + 您想要任何社交登录实现,例如 Login with GoogleLogin with Facebook,那么您可以遵循 OAuth2.0 集成

    这些是否可以防止 DDOS 攻击以及暴力攻击?

    没有。这应该通过调整各种安全参数来解决,例如限制会话时间、检查安全标头、处理内存泄漏、为 POST 请求应用超时,以便没有人可以发布巨大的请求负载等。你必须做一些减轻此类安全攻击的工作量。

    PS:从安全配置中删除permitAll()

    .defaultSuccessUrl("/dashboard",true)
        .permitAll()
    

    【讨论】:

    • 非常感谢您花这么多时间回答我的问题,关于您对DDOS 的回答,我会考虑您所说的一切,我认为它必须以其他方式处理,但我不确定,GET 端点可以被IP 过滤,因为我确实保留了它们,JWT 是我理解的必须,我唯一错过的是 应用 CSP 但我会搜索网络以了解更多信息!再次感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 2020-01-03
    • 2017-01-13
    • 1970-01-01
    • 2021-07-24
    • 2014-10-29
    • 2015-10-10
    • 2014-12-07
    相关资源
    最近更新 更多