安全

ZenStudio 是自托管的。我们安全模型的简短版本是:我们不在链路上。你的数据留在你的 Supabase 项目里,你的提示词用你提供的密钥直达你选定的模型提供商,任何东西都不存在厂商侧的副本。下面讲的是软件为你看不到的那些部分做了什么。

架构

你的数据在哪里,谁能访问到它。

默认自托管

容器由你运行,Supabase 项目归你所有。应用数据、向量嵌入、追踪和凭据都存在你的数据库里、你选定的区域内。不存在厂商侧副本,也没有任何回传。

你的模型密钥

模型调用从你的部署直达你所配置的提供商,使用你的密钥。提示词与补全内容不经我们代理。

数据驻留跟随你的基础设施

驻留地就是你的 Supabase 区域和你模型提供商的区域,不涉及任何其他方。

凭据的处理方式

你粘贴进来的密钥和令牌会经历什么。

静态加密,而且不只是在数据库层

数仓凭据、SaaS 令牌、提供商 API 密钥、MCP 令牌和集成密钥,在到达数据库之前就已在应用代码中用 AES-256-GCM 加密,密钥源自 PROVIDER_CREDS_SECRET。数据库里存的是密文和每条记录各自的 IV。

带认证的加密

GCM 是带认证的:被篡改的密文会解密失败,而不是返回被改动过的数据。每次加密都生成一个新的 96 位随机 IV,因此相同的密钥不会产生相同的密文。

绝不回传给浏览器

连接列表刻意完全不包含那个加密字段。密钥在服务端、在使用的那一刻解密,不会发送给任何客户端。

密钥引用

配置里可以放 {{secret:NAME}} 这样的指针,在读取时按用户解析,因此共享的配置从不内嵌密钥本身。

租户隔离

一个账号的数据是如何与另一个隔开的。

行级安全

租户数据按所属用户由 Postgres 行级安全策略限定范围,由数据库强制执行,而不是靠应用代码。

行级安全用不上的地方显式限定范围

后台任务——定时刷新、同步和集群运行——以 service-role 客户端执行,此时行级安全是关闭的。这些路径会显式传入所有者筛选条件,且它们可用的工具被限定在一份硬编码的允许清单内,清单里的工具都遵守该筛选。

共享数据在 SQL 里遮蔽,不在界面里遮蔽

数据集被共享时,行筛选和列遮蔽由一个 SECURITY DEFINER 数据库函数施加。被遮蔽的列在结果里根本不存在,而不是被界面隐藏——因此不存在任何会返回它们的视图。

从构造上就是只读的

针对已连接数据库的每一条查询路径都有守卫,拒绝除 SELECT / WITH / SHOW / DESCRIBE / EXPLAIN 之外的一切;文档也要求连接器使用只读凭据。在厂商支持的情况下,只读还会在服务端再声明一次。

治理与可审计性

事后你能证明什么。

可察觉篡改的审计痕迹

受治理的动作由数据库触发器写入一份哈希链式审计日志——每条记录的哈希覆盖前一条,因此被删除或被修改的条目会让链断掉。这条链可以脱离产生它的那个数据库独立校验。

保留与归档

审计事件有可配置的保留期,并支持 NDJSON 归档导出。执行追踪和集群运行有各自的保留设置,按有界批次清理。

IAM、用户组与模型规则

资源通过带行筛选与列遮蔽的用户组授权来共享。某个账号可以调用哪些模型,由允许清单规则决定。

预算与完整追踪

每次模型调用都会记录用户、模型、令牌数和成本。月度上限可按用户和按用户组设置。

SAML 单点登录

支持通过你的身份提供商实现企业单点登录。

我们不作的承诺

把缺口直说出来。一个夸大其词的安全页面比没有更糟——设这一节,是为了让你的审核方从我们这里了解到边界,而不是从一次意外中发现。

没有第三方认证

ZenStudio 没有 SOC 2、ISO 27001 或 HIPAA 认证。由于是你自托管,你架构中被认证的边界是你自己的基础设施和你的 Supabase 项目——该部署的合规姿态由你来声明,我们不代你主张。

没有渗透测试报告

没有可供分享的第三方渗透测试。源码可供你自行审查,对许多采购方而言,这比一封摘要信更有说服力。

密钥管理由你负责

PROVIDER_CREDS_SECRET 是一个由你设置的环境变量。没有托管 KMS 集成,轮换它也不会自动重新加密任何内容——请把轮换当作一次有计划的操作来安排。

报告漏洞

请通过非公开渠道报告疑似漏洞,不要直接开公开 issue。可使用仓库上 GitHub 的私密安全公告功能,或联系 SECURITY.md中的安全联系方式。请告诉我们你做了什么、预期是什么、实际发生了什么;有概念验证会更好。我们会确认收到、在调查期间持续告知进展,并在修复发布时致谢——除非你希望我们不这么做。

自托管意味着这里大多数控制项由你来运维,而不是由我们代你运行。部署指引(包括本页提到的环境变量)在 docs/DEPLOYMENT.md.