安全

我们如何让你的应用保持私密和隔离

这些都不用搭建者来写。登录、仅限公司内部访问、每个应用独立的数据,以及不被搜索引擎收录,在首次部署时就随应用一起配好。下面是具体说明,给需要审批签字的人看。TeamOnly正处于抢先体验阶段。本页描述的是它今天的构建和运行方式,有变化时我们会保持准确。我们不会声称拥有自己没有的认证。

每个请求都先登录

*.teamonly.app上的所有应用流量都先进入一个调度Worker。它根据主机名确定组织和应用,检查是否有有效会话,然后才把请求转发给应用。没有会话的访问者只会看到登录页,客户代码根本不会为他们运行。

登录方式有三种:Google OpenID Connect、Microsoft(Entra ID)OpenID Connect,或发送到公司邮箱的一次性验证码。对于Google和Microsoft,ID令牌在我们的服务器上验证,包括签名、受众、有效期和邮箱域名。Google的hd值从验证过的令牌中检查,而不是信任请求里的值。对于Microsoft,只接受工作或学校账号,并且令牌的签发方必须与它自己的租户一致。

邮箱验证码

除了Google或Microsoft,同事也可以在工作邮箱接收一个6位验证码。邮箱不在Google Workspace或Microsoft 365上的公司,就是这样使用TeamOnly的,无需任何配置。验证码证明他们能控制你公司某个域名下的邮箱,这和Google或Microsoft登录证明的是同一件事。它适用于任何邮件服务商。公司应用会拒绝Gmail或Outlook.com这类个人邮箱。

  • 验证码10分钟后过期。
  • 输错5次后验证码失效,需要重新获取。
  • 验证码只能在发起请求的浏览器里使用。被人从背后偷看到或被转发的验证码,在别的浏览器里没用。
  • 请求按邮箱地址和IP地址限速,所以没人能利用表单轰炸别人的收件箱。
  • 表单由Cloudflare Turnstile保护,它会确认发起请求的是人,而不是脚本。
  • 无论一个邮箱能否登录,表单给出的回应都一样,所以不会暴露谁有访问权限。
  • 验证码从signin@teamonly.app发出,并配置了SPF、DKIM和DMARC,邮件服务商可以核实邮件确实来自我们。
  • 验证码只以哈希形式存储,输入验证码时还会再次检查访问权限,以防期间有变化。

应用可以信任的身份

调度Worker会去掉传入请求上的所有身份标头,然后自己设置经过验证的邮箱和姓名,以及这个人在该应用里的角色。SDK通过ctx.user把它们提供给你的应用。

在门口
incoming request to expenses.acme.teamonly.appx-teamonly-user: ceo@acme.com    removed, not from usx-teamonly-user: dana@acme.com   added from verified sign-in
标头名称仅作示意。你的应用从SDK读取用户,而不是从标头读取。

每个应用独立的数据库和文件存储

每个应用都有自己的D1数据库(首次部署时创建),以及自己的R2文件存储前缀。这些是该应用唯一绑定的数据资源。应用作为独立脚本运行在Workers for Platforms的调度命名空间中,无法访问彼此的绑定。

我们专门测试过这一点:让一个应用尝试读取另一个应用的数据、Cookie或密钥。这些测试是在线上平台上运行的,每当负责隔离应用的部分发生变化,我们都会重新运行。

一张有三个房间的平面图:报销、库存和查询三个应用。每个房间里放着自己的数据、文件和密钥。报销应用想伸手进库存的房间,撞到了墙。库存应用想伸手进查询的房间,也撞到了墙。数据、Cookie和密钥都留在各自的房间里。

每个应用都在自己的房间里。数据、文件、Cookie和密钥都留在里面。

密钥存放在代码之外

密钥用npx teamonly secrets set设置,作为加密的Worker密钥存储,只绑定到那一个应用。它们不在你的代码仓库里,不在打包文件里,其他应用也看不到。技能文件会告诉你的AI永远不要把密钥写进代码。

Cookie只限于单个应用的网址

会话Cookie设置在应用的确切主机名上,比如expenses.acme.teamonly.app,并带有Secure、HttpOnly和SameSite。它们绝不会设在teamonly.app或组织的子域名上,所以一个应用读不到另一个应用的会话。

teamonly.app目前还不在公共后缀列表(Public Suffix List)上,所以浏览器在判断是否同站时,会把所有应用网址算作同一个站点。正因如此,每个会话Cookie都固定在它所属应用的确切网址上。如果情况有变,本页会注明。

客户代码一律视为不可信

我们假定任何应用都可能有错误或恶意代码,因为其中一部分是AI写的,而且谁都可能犯错。所以身份验证放在应用之外,每个应用只拿到自己的资源,应用发出的任何内容都无法改变登录的是谁。也正因为如此,应用只能给你公司里的人发邮件,每小时最多100个收件人,每天最多500个。

运行在哪里

一切都运行在Cloudflare上:代码用Workers和Workers for Platforms,数据库用D1,文件用R2,会话用KV。我们不运行自己的服务器。选择数据区域包含在Business套餐里,你加入时由我们和你一起配置。

和你一起配置的,以及我们绝不做的

在Business套餐中,我们会和你的IT团队一起配置Okta或其他SSO服务商。审计日志和数据区域也同样和你一起配置。它们包含在套餐里,但不是你自己打开就行的开关。

  • 和你一起配置
    Okta、OneLogin和其他SSO(Business套餐)
  • 和你一起配置
    审计日志(Business套餐)
  • 和你一起配置
    选择数据区域(Business套餐)
  • 绝不
    公开的、无需身份验证的应用

我们目前没有SOC 2或ISO认证。

报告安全问题

发邮件到hello@teamonly.dev,主题里写“Security”。每封邮件都有人看,我们会回复确认收到。在公开问题之前,请给我们合理的时间来修复。

常见问题

大家常问的问题

查看全部问答

一个应用能读取另一个应用的数据库吗?

不能。每个应用只能访问自己的数据库、文件存储和密钥。它没有任何其他应用资源的凭据或绑定,所以根本连不上。

应用能冒充其他用户吗?

对它自己和对我们都不能。传入请求中的身份标头会在门口被移除,替换成经过验证的标头,所以访问者无法冒充别人。应用看到的身份永远来自真实的登录。

应用会被搜索引擎收录吗?

不会。每个应用都在登录之后,所以爬虫只能到达登录页,而每个响应,包括登录页,都会发送noindex。

抢先体验

这周就让第一个工具上线。

TeamOnly正处于抢先体验阶段,所有套餐现在都可以购买。你可以免费试用14天,无需绑卡,也可以直接订阅。无论哪种方式,你的公司都会马上准备好,三条命令就能让你的第一个应用上线。

免费试用14天或者现在就订阅

试用无需绑卡。之后每月$19起,随时可取消。

还没准备好?先获取动态

请使用工作邮箱。我们很少发邮件,只在有值得一说的消息时才发。

有问题请发邮件到hello@teamonly.dev,会有真人回复。