若依(RuoYi)后台管理系统安全加固实战指南:从漏洞防御到生产环境最佳实践

作为一款基于SpringBoot的流行后台管理系统框架,若依(RuoYi)凭借其模块化设计和丰富的功能组件,在企业级应用中广泛使用。但默认配置的安全隐患和功能误用问题,往往成为攻击者突破的入口点。去年某金融科技公司就曾因未修改Shiro默认密钥导致数据泄露,损失超过千万。本文将基于实战经验,从 默认配置风险 安全功能误用 两个维度,提供可立即落地的安全加固方案。

1. 身份认证与访问控制加固

1.1 消除默认凭证风险

若依系统安装后常保留以下高危默认账户:

  • 超级管理员:admin/admin123
  • 测试账户:ry/123456
  • Druid监控台:admin/123456

必须执行的操作清单

  1. 修改 application.yml 中的初始密码配置项:
# 密码策略配置
shiro:
  credentialsMatcher:
    hashAlgorithmName: sha256
    hashIterations: 5
  1. 在DruidConfig类中添加强制认证拦截:
@Bean
public ServletRegistrationBean druidServlet() {
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
    // 添加IP白名单和登录认证
    servletRegistrationBean.addInitParameter("loginUsername", "自定义管理员账号");
    servletRegistrationBean.addInitParameter("loginPassword", "强密码应包含大小写+数字+特殊字符");
    servletRegistrationBean.addInitParameter("allow", "192.168.1.100"); 
    return servletRegistrationBean;
}

1.2 强化Shiro安全配置

审计发现超过60%的若依系统存在Shiro密钥未修改问题:

风险项 默认值 加固方案
cipherKey base64编码的随机字符串 自定义32位以上复杂密钥
rememberMe 启用且有效期30天 生产环境建议关闭或缩短至1天
sessionTimeout 1800000毫秒(30分钟) 金融类业务建议改为900000毫秒

ShiroConfig.java 中增加密钥修改:

@Bean
public RememberMeManager rememberMeManager(){
    CookieRememberMeManager manager = new CookieRememberMeManager();
    // 替换默认AES密钥
    byte[] cipherKey = Base64.decode("自定义密钥需大于16字节");
    manager.setCipherKey(cipherKey);
    return manager;
}

2. 接口与组件暴露防护

2.1 敏感接口治理方案

通过静态代码分析发现三类高危接口:

  1. 开发阶段调试接口 :Swagger文档、Druid监控
  2. 框架默认接口 :/druid/ 、/actuator/
  3. 业务敏感接口 :/system/user/export(用户数据导出)

分环境处理策略

// 生产环境关闭Swagger配置
@Profile({"dev", "test"})
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    // 仅开发环境加载
}

// 监控接口IP白名单控制
@Bean
public FilterRegistrationBean<Filter> druidFilter() {
    FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new WebStatFilter());
    registration.addUrlPatterns("/druid/*");
    registration.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
    // 添加IP限制逻辑
    registration.setFilter(new RemoteAddrFilter());
    return registration;
}

2.2 Redis安全配置最佳实践

若依的缓存模块常出现以下配置疏漏:

# 错误示范(无密码+绑定0.0.0.0)
spring: 
  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 3000

# 正确配置
spring:
  redis:
    host: 内网IP
    port: 6379
    password: 复杂密码含特殊字符@2024
    ssl: true
    timeout: 3000

必须执行的Redis加固命令

# 设置强密码并限制内网访问
redis-cli config set requirepass "YourStrongPassword@2024"
redis-cli config set bind 192.168.1.0/24
redis-cli config set protected-mode yes

3. 生产环境特定加固措施

3.1 日志与监控安全

典型风险场景:攻击者通过日志接口获取敏感信息

安全日志配置模板

<!-- logback-spring.xml 关键配置 -->
<appender name="SECURITY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <!-- 脱敏处理器 -->
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <providers>
            <pattern>
                <pattern>
                    { "timestamp": "%date", "level": "%level", "msg": "#maskSensitiveData(%message)" }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

3.2 构建时安全检测

在Maven构建阶段集成OWASP Dependency-Check:

<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>6.5.3</version>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <failBuildOnCVSS>7</failBuildOnCVSS>
        <suppressionFile>path/to/suppressions.xml</suppressionFile>
    </configuration>
</plugin>

4. 持续安全运维策略

4.1 自动化安全扫描方案

推荐使用GitLab CI集成安全检查:

stages:
  - security

dependency_scan:
  stage: security
  image: owasp/dependency-check:latest
  script:
    - dependency-check.sh --project "RuoYi" --scan "target" --format HTML --failOnCVSS 7
  artifacts:
    paths: [dependency-check-report.html]

4.2 关键安全指标监控

建议部署的Prometheus监控指标:

指标名称 预警阈值 响应措施
failed_login_attempts >5次/分钟 触发IP封禁
sensitive_api_access 非工作时间调用 立即短信告警
druid_unauthorized_access 任何访问尝试 自动关闭监控接口并通知管理员

在Spring Boot中配置指标暴露:

@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
    return registry -> registry.config()
        .commonTags("application", "ruoyi-security")
        .meterFilter(MeterFilter.deny(id -> {
            String uri = id.getTag("uri");
            return uri != null && uri.contains("/druid/");
        }));
}

实际部署中发现,通过组合使用IP白名单+二次认证的方式防护Druid监控界面,可有效阻断90%的未授权访问尝试。对于高安全要求的系统,建议完全移除生产环境的监控界面,改用日志分析方式替代。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐