团队与安全
理解多租户资源边界、角色权限、认证与审计
Clouisle 以团队隔离 Agent、工作流、知识库、模型授权、工具与 Skills。当前团队决定平台工作台查询和创建资源的边界。
团队角色
团队角色为所有者、管理员、成员和观察者。所有者负责所有权转让,不能被移除或直接离开;管理员可管理团队资源;更细的操作由全局角色权限和作用域角色共同决定。
权限
后端权限代码采用 resource:action 或 admin:resource:action。超级管理员绕过权限检查。非管理类资源还可通过团队或资源作用域角色授权。
授权在服务端强制且 fail-closed:团队资源统一走 check_team_access,Agent 走 check_agent_access(私有 Agent 仅创建者可读,创建者缺失的历史私有 Agent 回落到团队管理员判定,越权时返回 403 或 404 而不是空数据)。前端只是便利性:按权限隐藏菜单和按钮,并不是安全边界——绕过界面直接调用 API 同样会被拒绝;反过来说,界面上出现某个按钮也不代表后端一定放行。
会话与数据隔离
普通用户只能查看自己的会话与数据;拥有 admin:dashboard:access 权限(或超级管理员)可以查看团队全部会话,团队范围查询还需团队所有者/管理员角色。API 密钥按用户管理:用户只能查看和管理自己的密钥,仅超级管理员可跨团队查看全部。
认证与账户安全
站点可组合密码登录、邮箱验证、管理员审批、点击式验证码、密码策略、密码过期、单一会话、TOTP 和 SSO。SSO 支持多个连接;管理员可以禁用密码登录。有效会话默认 30 天(站点设置 session_timeout_days 控制),JWT 兜底令牌有效期 8 天。
人类验证是一次性的点击验证码,不是图片字符验证码:登录页取一个挑战(GET /api/v1/login/captcha),点击后由 POST /api/v1/login/captcha/click 换取一次性私有凭证,登录请求再带上 captcha_id + captcha_token;凭证缺失或失效分别返回 captcha_required / captcha_invalid。安全页只有 enable_captcha 这一个开关(默认 false),没有失败阈值、有效期或难度配置——它是降低自动化尝试的补充手段,不能替代登录锁定。
真正拦截暴力破解的是锁定机制:
- 账户锁定:同一账户连续失败达到
max_login_attempts(默认5)次后锁定lockout_duration_minutes(默认15)分钟。锁定在密码校验之前判定,锁定期间即使密码正确也返回account_locked(附剩余秒数);登录成功即清零计数。 - TOTP 锁定:校验在 300 秒窗口内失败
5次即锁定900秒(15 分钟),成功后计数清零,按用户维度计数。 - 按 IP 的登录计数:Redis 键
login:attempts:ip:<ip>、TTL3600秒,但当前只有读写 helper、未接入登录流程,不构成实际节流。
阈值都在站点设置的安全分组里调整,见 站点设置。
API 密钥
API 密钥以 clou_ 开头,通过 Authorization: Bearer 发送。密钥可绑定指定 Agent 与工作流(两个列表为空 = 允许访问全部,这是向后兼容的默认行为)、设置过期时间与启用状态;绑定校验在服务端执行,密钥访问未授权的 Agent/工作流返回 403。
rate_limit(默认 1000/分钟,0 表示不限)与 scopes 这两个字段会被保存和展示,但当前没有任何执行点读取——不要把它们当成生效的限流或权限收敛手段。密钥按用户管理:用户只能查看和管理自己的密钥,仅超级管理员可跨团队查看全部。
出站网络与 SSRF 防护
出站访问有两道相互独立的白名单:
- 外部抓取(SSRF 豁免):站点设置
ssrf_allowed_targets(JSON 数组,上限 200 条)。默认拒绝内网、回环、链路本地与保留地址;其中永久拦截、白名单也无法放开的是云元数据与特殊网段:metadata.google.internal、169.254.169.254、169.254.0.0/16、224.0.0.0/4、0.0.0.0/32。localhost/local默认拒绝但可以加白名单放行(本机部署的模型或内部服务是常见场景)。保存时会直接拒绝这些写法:*、0.0.0.0/0、::/0、裸0.0.0.0或::、与元数据网段重叠的 CIDR,以及含/ ? # @或空格的条目。只放行确切需要的主机或网段:豁免范围写得太宽,等于把 SSRF 防护整体关掉。 - 模型出口:在管理后台注册模型供应商时填写的 base URL 必须落在站点设置
model_endpoint_allowlist内(默认含 OpenAI、Anthropic、DashScope、硅基流动以及本地http://localhost:11434等约 20 条,上限 200 条)。模型流量只走这道白名单,不经过上面的 SSRF 屏蔽网段判断——所以本机跑 Ollama 只需把它加到模型白名单,不需要动ssrf_allowed_targets。接入自建或私有模型服务前先加白名单,否则保存模型时直接失败。
两者的校验方式不同:外部抓取会先解析主机名再校验解析出的 IP(避免用等价写法或 DNS 指向绕过拦截);模型出口则把 base URL 规范化为 scheme://host:port 形式(拒绝携带凭据、query、fragment 的写法)后与白名单做精确比对,命中后返回管理员批准的标准值(详见 站点设置 与 模型)。
审计与通知
管理后台记录资源操作、操作者和变更快照,并提供按事件、用户、团队和时间筛选。通知可在站内显示,也可通过邮件、钉钉、企业微信、飞书、Slack 或 Webhook 外发。
这篇文章对你有帮助吗?