--- sidebar_position: 8 title: Security, Desensitization, and Audit sidebar_label: Security description: MindSpace tenant isolation, file and HTML security, PII handling, sharing, and audit controls --- # 安全、脱敏与审计 ## 安全目标 - 用户之间严格隔离。 - 私人区默认拒绝公开和外链。 - Agent 只能访问任务授权资产。 - 生成 HTML 不得危害平台会话或访问者。 - 发布内容可追溯、可下线、可复查。 - 安全控制由服务端执行,前端提示不构成安全边界。 ## 威胁模型 需要覆盖: - 路径穿越和符号链接逃逸。 - 猜测或枚举资产 ID。 - 修改请求中的 `user_id`、`space_id` 或 `category_id`。 - MIME 伪造、恶意压缩包和文件炸弹。 - XSS、恶意跳转、追踪像素和 Cookie 读取。 - HTML 引用私人文件或跨用户资源。 - 分享 token 泄露和密码暴力破解。 - Agent prompt injection 和越权工具调用。 - 自定义正则导致 ReDoS。 - 日志泄露敏感正文、token 和路径。 - 竞态绕过配额、下线或发布扫描。 ## 用户隔离 - 所有 repository 方法显式接收 actor 和 owner。 - 所有查询包含所有权条件。 - 对不存在和无权访问统一返回 404。 - 管理员访问走独立服务和审计动作。 - 测试必须包含用户 A 使用用户 B 的每类 ID。 禁止: ```text GET /files?path=/users/john/private/a.pdf ``` 允许: ```text GET /assets/{opaque_asset_id} ``` 服务端根据当前身份解析真实存储 key。 ## 路径和存储安全 - 文件名仅用于展示,不参与存储 key。 - 规范化 Unicode 和路径分隔符。 - 拒绝绝对路径、`..`、空字节和设备名。 - 本地存储使用 `openat` 类安全模式或完成 canonical path 校验。 - 禁止跟随指向根目录外的符号链接。 - 对象存储 key 由服务端生成。 - 临时目录按任务隔离并设置权限与 TTL。 ## 文件上传安全 - 服务端检测文件签名和 MIME。 - 配置允许类型和大小。 - 压缩包限制层数、文件数量、展开总大小和压缩比。 - 扫描恶意文件和宏。 - 未扫描文件进入 quarantine,不可预览、下载或交给 Agent。 - 图片重新编码以移除不必要元数据。 - 文档解析在资源受限的隔离进程中执行。 ## HTML 和页面安全 ### 首期默认策略 - 禁止任意外部 JavaScript。 - 移除 inline event handler。 - 禁止 `javascript:` URL。 - 禁止未授权 iframe、object、embed 和 form action。 - 限制 meta refresh。 - 外部图片走代理或复制到公开资源。 - 禁止页面域读取管理域 cookie。 ### CSP 基线 按实际构建调整,但原则为: ```text default-src 'none' img-src 'self' data: style-src 'self' 'unsafe-inline' script-src 'self' font-src 'self' connect-src 'none' frame-src 'none' base-uri 'none' form-action 'none' frame-ancestors 'self' ``` 如果模板需要脚本,使用平台签名和版本化脚本,不允许页面自由写入。 ### 预览 sandbox - iframe 使用最小 sandbox 权限。 - 默认不启用 `allow-same-origin` 与 `allow-scripts` 的危险组合。 - 预览域与管理域隔离。 - 预览 URL 短期有效。 ## 私有资源引用检查 发布构建器解析: - HTML `src`、`href`、`srcset`。 - CSS `url()` 和 `@import`。 - JavaScript 中平台资源引用,首期建议禁止用户 JavaScript。 - 页面 manifest。 每个资源必须: - 属于发布者。 - 是当前页面版本允许的资源。 - 已复制为公开资源。 - 通过安全扫描。 发现私人、OA、跨用户或不存在资源时阻断发布。 ## 敏感信息类型 默认检测: - 手机号 - 邮箱 - 身份证 - 银行卡 - 地址 - 人名 - 公司名 - 金额 - 合同编号 - 病历号 - 学号 - 工号 - 精确地理位置 - API key、access token 和私钥 规则需要按国家、地区、语言和场景版本化,不能仅依赖单一正则。 ## 脱敏策略 | 策略 | 示例 | | --- | --- | | 保留前后 | `138****1234` | | 星号替换 | `********` | | 标签替换 | `[手机号]` | | 范围模糊 | `上海市***` | | 金额区间 | `约 1-2 万元` | | 删除 | 移除字段 | | 仅摘要 | 不输出原文 | | 禁止发布 | 高风险或无法可靠脱敏 | 脱敏必须: - 生成新资产。 - 保留来源关联。 - 记录规则版本和用户选择。 - 对输出再次扫描。 - 不在扫描 finding 中保存完整敏感值。 ## 风险和发布决策 | 风险 | 行为 | | --- | --- | | none | 允许发布 | | low | 提示,可发布 | | medium | 展示详情并明确确认 | | high | 阻断,必须处理 | | critical | 隔离内容并通知安全处置 | 密钥、私钥、完整身份证、银行卡和跨用户资源引用默认至少为 high。 ## 分享链接安全 - token 使用加密安全随机数,至少 128 bit 熵。 - 数据库只保存 token hash。 - 可设置过期、撤销和最大访问次数。 - 密码使用强哈希,不与用户密码共用。 - 密码尝试按 IP、token 和设备限流。 - 响应头禁止搜索引擎索引受保护页面。 - 私密链接页面不得在用户公开主页展示。 - 复制链接 UI 明确显示访问模式和过期时间。 ## 认证和会话 - 密码使用 Argon2id 或当前推荐强哈希。 - 安全、HttpOnly、SameSite cookie。 - 敏感操作考虑近期登录确认。 - 登录和密码尝试限流。 - 账号冻结立即撤销活跃会话。 - CSRF、CORS 和 origin 校验按部署方式配置。 ## Agent 安全 - Agent 不接收用户根目录。 - 输入使用只读临时挂载或受控下载接口。 - 输出只允许写入任务目录。 - 默认禁用网络,按任务允许域名。 - 工具调用受权限策略检查。 - 文档中的 prompt injection 视为不可信内容。 - Agent 不能改变自己的权限范围。 - 任务 token 与用户登录 token 完全分离。 ## 审计策略 高风险动作同步写审计: - 私人文件预览和下载。 - Agent 读取私人资产。 - 创建脱敏副本。 - 发布、重新发布和下线。 - 修改分享密码和过期时间。 - 管理员读取或处置用户内容。 审计内容: - 谁。 - 何时。 - 从哪里。 - 对什么对象。 - 执行什么动作。 - 结果和风险等级。 - 请求和任务关联 ID。 审计中不得写入: - 密码。 - 分享 token。 - 文件正文。 - 完整敏感值。 - 可直接访问的内部存储 key。 ## 安全响应头 管理端: - CSP - HSTS - X-Content-Type-Options - Referrer-Policy - Permissions-Policy - frame-ancestors 公开页: - 独立 CSP - X-Content-Type-Options - Referrer-Policy - 对受保护页使用 `noindex, nofollow` - 下载资源设置正确 Content-Disposition ## 安全运营 - 规则版本和扫描器版本可追溯。 - critical 命中产生告警。 - 支持管理员紧急下线 Publication。 - 定期执行跨用户授权测试。 - 定期对账公开 bundle 与 Publication 状态。 - 依赖漏洞、恶意文件扫描器和密钥轮换纳入运维。 ## 安全验收清单 - 路径穿越无法读取任何系统或其他用户文件。 - 用户 A 无法通过替换 ID 操作用户 B 的资源。 - 私人原资产无法直接发布。 - 已下线页面无法从 CDN 或缓存继续访问。 - 发布页无法读取管理会话 cookie。 - XSS payload 在预览和正式页均被阻断。 - 分享密码无法被无速率限制地尝试。 - Agent 超时后 token 立即失效。 - 日志和审计不存在完整敏感值。