首页
/ RuoYi-Vue安全合规改造技术指南:基于等保三级标准的全生命周期防护方案

RuoYi-Vue安全合规改造技术指南:基于等保三级标准的全生命周期防护方案

2026-04-28 10:54:01作者:申梦珏Efrain

1. 安全风险评估与合规框架

1.1 现状风险分析

当前RuoYi-Vue框架在身份认证、权限控制、数据保护等方面存在多项安全隐患,主要体现在:

  • 密码策略未达到等保三级复杂度要求,缺乏定期更换机制
  • JWT令牌有效期过长(默认2小时),存在被盗用风险
  • 操作日志未覆盖全部敏感操作,日志留存时间不足6个月
  • 敏感数据在存储和传输过程中未实施完整加密保护

1.2 合规依据与参考标准

本改造方案严格遵循《信息安全技术 网络安全等级保护基本要求》(GB/T 22239-2019)三级标准,重点覆盖以下技术要求:

  • 身份鉴别(8.1.1.1):应采用两种或以上组合的鉴别技术实现用户身份鉴别
  • 访问控制(8.1.2.1):应基于角色分配权限,实现最小权限原则
  • 安全审计(8.1.4.1):应对重要用户行为、系统资源的异常使用等进行审计
  • 数据保护(8.1.5.1):应采用加密技术保证敏感数据在传输和存储过程的保密性

2. 安全防护体系架构

2.1 整体防护框架

构建"纵深防御"安全体系,实现从网络边界到应用层的全栈防护:

  1. 网络层:HTTPS传输加密、WAF部署
  2. 应用层:身份认证强化、权限精细化管理
  3. 数据层:敏感信息加密存储、数据脱敏
  4. 审计层:全链路操作日志、异常行为监控

2.2 安全组件集成方案

安全防护架构图

图1:RuoYi-Vue安全防护体系架构图

3. 核心安全模块改造实施

3.1 身份认证与访问控制

3.1.1 密码策略加固

合规依据:GB/T 22239-2019 8.1.1.2 身份鉴别信息应具有复杂度要求并定期更换

实施步骤

  1. 修改密码验证逻辑,在用户管理服务中添加强度检测:

    // ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
    private void validatePasswordStrength(String password) {
        if (password.length() < 8) {
            throw new UserException("密码长度不能少于8位");
        }
        if (!password.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$")) {
            throw new UserException("密码必须包含大小写字母、数字及特殊符号");
        }
    }
    
  2. 添加密码定期更换机制,在登录验证时检查密码有效期:

    // ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
    public void checkPasswordExpire(SysUser user) {
        long passwordAge = System.currentTimeMillis() - user.getPwdUpdateDate().getTime();
        if (passwordAge > 90 * 24 * 60 * 60 * 1000L) { // 90天有效期
            throw new UserException("密码已过期,请更换密码");
        }
    }
    

3.1.2 JWT令牌安全增强

合规依据:GB/T 22239-2019 8.1.1.5 当进行远程管理时,应采取必要措施防止鉴别信息在传输过程中被窃听

实施步骤

  1. 缩短JWT令牌有效期至30分钟:

    // ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
    @Bean
    public JwtTokenProvider jwtTokenProvider() {
        JwtTokenProvider provider = new JwtTokenProvider();
        provider.setSecretKey(secretKey);
        provider.setExpiration(1800000); // 30分钟
        return provider;
    }
    
  2. 实现令牌自动刷新机制:

    // ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
    public boolean needRefresh() {
        return System.currentTimeMillis() > expireTime - 300000; // 剩余5分钟时刷新
    }
    

3.2 权限管理精细化

3.2.1 按钮级权限控制

合规依据:GB/T 22239-2019 8.1.2.3 应实现权限的最小化分配

实施步骤

  1. 为所有操作按钮配置独立权限标识:

    // ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
    public class SysMenu {
        // 添加按钮权限标识字段
        private String permission;
        // getter/setter方法
    }
    
  2. 在前端页面实现权限控制:

    <!-- ruoyi-ui/src/views/system/user/index.vue -->
    <el-button 
      v-hasPermi="['system:user:remove']" 
      type="danger" 
      icon="el-icon-delete" 
      @click="handleDelete">
      删除
    </el-button>
    

3.2.2 数据权限分级控制

合规依据:GB/T 22239-2019 8.1.2.4 应根据数据的重要性和敏感程度进行分级管理

实施步骤

  1. 增强数据权限切面,实现更细粒度的权限控制:
    // ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
    private void handleDataScopeSql(StringBuilder sql, LoginUser loginUser) {
        SysUser user = loginUser.getUser();
        // 数据权限过滤逻辑
        if (!user.isAdmin()) {
            sql.append(" AND dept_id IN (");
            sql.append(StringUtils.join(getUserDataScope(user), ","));
            sql.append(")");
        }
    }
    

3.3 安全审计与日志管理

3.3.1 操作日志全面覆盖

合规依据:GB/T 22239-2019 8.1.4.3 审计记录应包括事件的日期和时间、用户、事件类型等

实施步骤

  1. 扩展日志记录字段,包含更详细的操作信息:

    // ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java
    private String requestParams;  // 请求参数
    private String responseResult; // 返回结果
    private Long operDuration;     // 操作耗时
    
  2. 添加敏感操作二次确认机制:

    <!-- ruoyi-ui/src/views/system/role/index.vue -->
    <el-button 
      v-hasPermi="['system:role:delete']" 
      type="danger" 
      icon="el-icon-delete" 
      @click="handleDeleteRole">
      删除角色
    </el-button>
    
    <script>
    handleDeleteRole(role) {
      this.$confirm('此操作将永久删除该角色,是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 执行删除操作
      })
    }
    </script>
    

3.3.2 日志存储与备份策略

合规依据:GB/T 22239-2019 8.1.4.4 审计记录应至少保存6个月

实施步骤

  1. 创建日志备份定时任务:

    // ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
    @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
    public void backupOperLog() {
        log.info("开始备份操作日志...");
        operLogService.backupLog();
        log.info("操作日志备份完成");
    }
    
  2. 配置日志表自动分区:

    -- sql/ry_20250522.sql
    CREATE TABLE sys_oper_log (
      id BIGINT PRIMARY KEY AUTO_INCREMENT,
      oper_time DATETIME NOT NULL,
      -- 其他字段...
      PARTITION BY RANGE (TO_DAYS(oper_time)) (
        PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
        PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01')),
        -- 按月创建分区...
      )
    );
    

3.4 敏感数据保护

3.4.1 传输加密配置

合规依据:GB/T 22239-2019 8.1.5.2 应采用加密或其他保护措施实现敏感数据的传输保密性

实施步骤

  1. 配置HTTPS协议:

    # ruoyi-admin/src/main/resources/application.yml
    server:
      port: 443
      ssl:
        key-store: classpath:keystore.p12
        key-store-password: changeit
        key-store-type: PKCS12
        key-alias: tomcat
    
  2. 强制所有HTTP请求重定向至HTTPS:

    // ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
    @Bean
    public FilterRegistrationBean<HttpsFilter> httpsFilter() {
        FilterRegistrationBean<HttpsFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new HttpsFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
    

3.4.2 存储加密实现

合规依据:GB/T 22239-2019 8.1.5.3 应采用加密或其他保护措施实现敏感数据的存储保密性

实施步骤

  1. 实现AES加密工具类:

    // ruoyi-common/src/main/java/com/ruoyi/common/utils/security/AesUtils.java
    public class AesUtils {
        private static final String KEY = "your-256-bit-key";
        
        public static String encrypt(String content) {
            // AES-256加密实现
        }
        
        public static String decrypt(String encryptedContent) {
            // AES-256解密实现
        }
    }
    
  2. 对敏感字段进行加密存储:

    // ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
    @Override
    public int insertUser(SysUser user) {
        // 加密身份证号
        user.setIdCard(AesUtils.encrypt(user.getIdCard()));
        // 其他敏感字段加密...
        return userMapper.insertUser(user);
    }
    

4. 安全基线配置

4.1 服务器安全加固

  1. 禁用不必要的服务和端口:

    # 关闭Telnet服务
    systemctl disable telnet.socket
    # 只开放必要端口
    firewall-cmd --permanent --zone=public --add-port=443/tcp
    firewall-cmd --reload
    
  2. 设置文件系统权限:

    # 设置应用目录权限
    chmod -R 700 /data/web/disk1/git_repo/GitHub_Trending/ru/RuoYi-Vue
    # 设置日志文件权限
    chmod -R 600 /var/log/ruoyi
    

4.2 应用安全配置

  1. 配置安全响应头:

    // ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
    @Bean
    public FilterRegistrationBean<SecurityHeaderFilter> securityHeaderFilter() {
        FilterRegistrationBean<SecurityHeaderFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new SecurityHeaderFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
    
  2. 禁用不安全的HTTP方法:

    // ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS).denyAll()
            // 其他配置...
    }
    

5. 攻击场景模拟测试

5.1 权限越权测试

测试步骤

  1. 使用普通用户账号登录系统,获取JWT令牌
  2. 修改请求参数,尝试访问管理员接口:
    curl -X GET "https://your-domain.com/system/user/list" \
      -H "Authorization: Bearer {normal-user-token}"
    
  3. 验证系统是否返回403 Forbidden错误

预期结果:非授权用户无法访问管理员接口,响应状态码为403

5.2 敏感信息泄露测试

测试步骤

  1. 访问系统登录页面,查看页面源代码
  2. 检查是否包含敏感信息(如数据库连接信息、密钥等)
  3. 使用工具扫描响应包中的敏感数据:
    curl -s "https://your-domain.com/login" | grep -i "password\|secret\|key"
    

预期结果:页面源代码及响应中不包含任何敏感信息

6. 合规检查清单与实施计划

6.1 合规检查清单

安全领域 检查项 合规要求 完成标志
身份认证 密码复杂度 至少8位,包含大小写字母、数字及特殊符号 密码策略配置生效
身份认证 令牌有效期 JWT令牌有效期≤30分钟 配置文件中expiration=1800000
访问控制 按钮级权限 所有操作按钮均配置独立权限标识 权限表包含system:user:remove等按钮权限
安全审计 日志留存 审计日志保存≥6个月 日志表分区存储且自动备份
数据保护 传输加密 所有HTTP通信采用HTTPS 服务器配置SSL且HTTP自动跳转
数据保护 存储加密 敏感字段采用AES-256加密 用户表身份证号字段加密存储
安全基线 服务加固 只开放必要服务和端口 防火墙仅开放443端口

6.2 分阶段实施时间表

阶段 时间 主要任务 输出物
准备阶段 第1周 系统安全评估、需求分析 《安全评估报告》
开发阶段 第2-4周 身份认证、权限管理模块改造 代码变更记录、单元测试报告
测试阶段 第5-6周 安全功能测试、渗透测试 《安全测试报告》
部署阶段 第7周 生产环境部署、安全基线配置 部署文档、配置清单
验收阶段 第8周 合规检查、等保测评准备 《合规检查报告》

7. 扩展阅读

  1. 《信息安全技术 网络安全等级保护基本要求》(GB/T 22239-2019)
  2. RuoYi-Vue官方文档:doc/若依环境使用手册.docx
  3. Spring Security官方安全指南:ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  4. 《Java安全编码标准》(GB/T 28452-2012)
登录后查看全文
热门项目推荐
相关项目推荐