# 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密码 ```sql -- 为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. 前端调用示例 ```typescript // 带密码的文件下载 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. 密码管理 ```typescript // 验证密码格式 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密码验证层,在原有安全机制基础上提供了额外的保护。建议在测试环境充分验证后再部署到生产环境。