Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-27-minio-bucket-password-security.md
T
2025-08-02 21:06:47 +08:00

6.6 KiB
Raw Blame History

MinIO Bucket密码安全功能实施记录

📅 变更信息

  • 变更时间: 2025-01-27 16:30:00
  • 变更类型: 安全加固 - Bucket密码验证
  • 影响范围: 文件存储系统安全机制
  • 变更人员: 系统管理员

🔐 功能概述

新增安全层

为私有bucket添加访问密码验证机制,在原有预签名URL基础上增加额外的安全保护层。

安全机制

  1. 预签名URL: 临时有效的文件访问链接
  2. Bucket密码验证: 额外的访问密码验证
  3. 访问限制: 支持访问次数限制和过期时间
  4. 访问日志: 完整的访问记录和审计

📋 实施内容

1. 数据库表结构 ✅

文件: script/minio-security-implementation.sql

新增表:

  • sys_bucket_access_password - bucket访问密码表
  • sys_bucket_access_record - bucket访问记录表

表结构特点:

  • 支持密码加密存储(MD5 + 盐值)
  • 支持访问次数限制
  • 支持密码过期时间
  • 支持访问记录审计

2. 实体类创建 ✅

文件:

  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysBucketAccessPassword.java
  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysBucketAccessRecord.java

功能:

  • bucket密码信息管理
  • 访问记录数据模型
  • 完整的审计字段

3. 服务层实现 ✅

文件:

  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysBucketAccessPasswordService.java
  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysBucketAccessPasswordServiceImpl.java

核心功能:

  • validateBucketPassword() - bucket密码验证
  • recordBucketAccess() - 访问记录
  • checkAccessLimit() - 访问次数限制
  • resetBucketPassword() - 密码重置

4. Mapper接口 ✅

文件:

  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysBucketAccessPasswordMapper.java
  • backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysBucketAccessRecordMapper.java

5. 控制器更新 ✅

文件: backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysFileAccessController.java

更新内容:

  • 所有文件访问接口增加bucket密码参数
  • 添加密码验证逻辑
  • 保持向后兼容性(密码为空时跳过验证)

6. 前端API更新 ✅

文件: web/src/api/system/file.ts

更新内容:

  • 所有API方法增加bucketPassword参数
  • 添加密码验证和提示功能
  • 保持向后兼容性

🔐 安全机制详解

密码验证流程

  1. 用户身份验证: 检查用户是否已登录
  2. 文件权限检查: 验证用户是否有权限访问文件
  3. Bucket密码验证: 验证bucket访问密码
  4. 访问限制检查: 检查访问次数和过期时间
  5. 预签名URL生成: 生成临时访问链接
  6. 访问记录: 记录所有访问行为

密码安全特性

  • 加密存储: MD5 + 盐值加密
  • 盐值策略: 基于bucket名称的盐值
  • 访问限制: 支持最大访问次数限制
  • 过期机制: 支持密码过期时间设置
  • 审计日志: 完整的访问记录

访问控制策略

  • 启用状态: 可启用/禁用密码验证
  • 过期时间: 支持密码过期设置
  • 访问次数: 支持访问次数限制
  • IP追踪: 记录访问者IP地址
  • 用户代理: 记录浏览器信息

📊 技术实现细节

后端安全特性

  • ✅ 密码验证: 基于MD5 + 盐值的密码验证
  • ✅ 访问限制: 支持访问次数和过期时间限制
  • ✅ 访问日志: 完整的访问行为记录
  • ✅ IP追踪: 记录访问者IP地址
  • ✅ 错误处理: 完善的异常处理机制
  • ✅ 向后兼容: 密码为空时跳过验证

前端安全特性

  • ✅ 密码参数: 支持bucket密码参数传递
  • ✅ 密码验证: 前端密码格式验证
  • ✅ 错误处理: 友好的错误提示
  • ✅ 向后兼容: 保持现有接口兼容性

🚀 使用方式

1. 设置Bucket密码

-- 为ruoyi bucket设置访问密码
INSERT INTO sys_bucket_access_password (bucket_name, access_password, password_salt, is_active, max_access_count, create_by, tenant_id) VALUES 
('ruoyi', 'e10adc3949ba59abbe56e057f20f883e', 'ruoyi_salt_2025', 1, 0, 1, 0);

2. 前端调用示例

// 带密码的文件下载
const { data: downloadUrl } = await getFileDownloadUrl(ossId, 'your_bucket_password')

// 带密码的文件预览
const { data: previewUrl } = await getFilePreviewUrl(ossId, 'your_bucket_password')

// 安全下载文件
await secureDownloadFile(ossId, fileName, 'your_bucket_password')

3. 密码管理

// 验证密码格式
const isValid = validateBucketPassword('your_password')

// 获取密码提示
const hint = getBucketPasswordHint('ruoyi')

⚠️ 注意事项

1. 密码安全

  • 默认密码: 当前默认密码为 123456(MD5加密后)
  • 密码强度: 建议使用强密码,至少6位字符
  • 定期更换: 建议定期更换bucket访问密码

2. 兼容性考虑

  • 向后兼容: 密码参数为可选,不传密码时跳过验证
  • 渐进式升级: 可以逐步为不同bucket启用密码验证
  • 错误处理: 密码验证失败时返回友好错误信息

3. 性能考虑

  • 密码验证: 每次文件访问都会进行密码验证
  • 访问记录: 所有访问都会记录到数据库
  • 缓存策略: 可以考虑缓存密码验证结果

📈 安全效果

安全层级

  1. 第一层: 用户身份验证(Sa-Token)
  2. 第二层: 文件权限检查
  3. 第三层: Bucket密码验证 ⭐ 新增
  4. 第四层: 预签名URL(临时有效)
  5. 第五层: 访问次数和过期限制

安全提升

  • 额外保护: 在预签名URL基础上增加密码验证
  • 访问控制: 支持访问次数和过期时间限制
  • 审计能力: 完整的访问记录和审计功能
  • 风险降低: 即使URL泄露,也需要密码才能访问

🔄 后续优化

1. 密码管理界面

  • 🔄 添加bucket密码管理界面
  • 🔄 支持密码重置和修改
  • 🔄 密码强度检测

2. 访问监控

  • 🔄 实时访问监控大屏
  • 🔄 异常访问告警
  • 🔄 访问统计分析

3. 安全增强

  • 🔄 支持更安全的加密算法(如bcrypt)
  • 🔄 支持多因素认证
  • 🔄 支持IP白名单

📝 备注: 本次变更为MinIO文件存储增加了bucket密码验证层,在原有安全机制基础上提供了额外的保护。建议在测试环境充分验证后再部署到生产环境。