跳到主要内容

安全

TelegramOS 安全:租户隔离、身份认证、静态数据加密、审计记录与出站请求控制。

平台在多个层面实施安全控制,以保护租户数据、防止未授权访问并确保安全运行。本页描述的是运行中的代码实际执行的内容。

租户隔离

层面机制防止什么
租户边界每一条资源记录(账号、代理、机器人、对话、钱包)都带有所属用户的 ID。读写查询的范围限定为调用者自己的租户,加上授予了特定权限(例如 inbox:read、accounts:delete)的团队租户;查询失败时范围回退为仅所有者。外部或格式错误的 ID 返回 404,而不是 403。一个租户通过 API 或界面读取或修改另一个租户的数据。
按账号运行时每个活跃账号在工作进程管理器内作为独立的子进程运行,拥有自己解密后的会话、自己的 MTProto 连接、自己的设备指纹和自己的代理。没有任何连接在账号之间复用。所有工作进程共享工作进程管理器容器的 CPU 和内存限制;没有按进程的沙盒。一个账号的 Telegram 会话被另一个账号的工作进程观察或复用。
按账号代理一个账号只绑定一个代理;将多个账号分配到同一代理会被拒绝。平台租用的代理以按账号的供应商子用户形式开通,并在账号释放时拆除。轮换按账号进行。Telegram 通过共享出口 IP 关联账号。
租用账号回收租户只会获得当前在账号池中未分配的账号。租期结束时(订阅或套件到期加 5 天宽限期,或显式归还),回收工作进程会删除双方的每一条聊天、清除租户绑定,并将账号连同其完好的会话返回账号池,以便后续租户接收。会话已失效的账号会被隔离,绝不再出售。付费永久删除($1)会登出会话、擦除加密的会话数据块并永久退役该账号。新租户继承上一位租户的对话,以及上一位租户保留重新进入账号的途径。
活跃会话强制检查每 6 小时,平台会列出每个租用账号的活跃 Telegram 会话。未知会话会触发一条安全通知,附带两个操作:“是我”和“终止”。在你做出决定之前不会终止任何会话,但上一位租户批准的会话除外,它们会在账号易手时被撤销。通过在平台之外打开的会话对租用账号进行未授权访问。
隐藏的服务对端与 Telegram 系统账号(peer 777000,以及 hidden_telegram_peers 表中的任何 ID)的对话仅对租用账号由收件箱 API 过滤掉。自有账号始终可以看到它们。过滤在读取时应用;记录本身仍会存储。租用者读取底层手机号的登录验证码。

身份认证

密码要求

要求取值
最小长度12 个字符
最大长度72 字节(bcrypt 限制);非英文字符和表情符号占用多个字节
字符组合没有组合规则;密码不能与您的邮箱或姓名相同
已泄露的密码新密码会与 Have I Been Pwned 列表比对;只发送 SHA-1 哈希的前 5 个字符,若该服务 2 秒内未响应则跳过检查
现有密码按旧规则设置的密码在更改之前仍然有效
存储bcrypt,成本因子 12
社交登录账户在“设置”中设置密码之前可以没有密码

无论邮箱是否存在,失败的登录耗时相同,因此登录端点无法被用来枚举账户。

会话与令牌

项目取值
访问令牌RS256 JWT,15 分钟
刷新令牌随机 512 位令牌,7 天,每次使用时轮换,允许 30 秒的重用宽限
CookieHttpOnly、Secure、SameSite=None;刷新 Cookie 的作用范围限定为 /auth
服务端会话记录过期记录在 7 天后清除
API 密钥tgp_ 前缀,以 SHA-256 哈希存储,默认有效期 90 天,每用户最多 20 个
已停用用户is_active = false 的用户在登录、刷新和 API 密钥认证时均被拒绝

双因素认证(TOTP)

设置取值
算法TOTP(RFC 6238),6 位数字,30 秒步长,接受一个步长的时钟漂移
重放防护已被接受的验证码在其窗口剩余时间内会被拒绝
备用码8 个验证码,每个仅可使用一次,以 SHA-256 哈希存储
密钥存储配置了 TOTP 加密密钥时以 Fernet 静态加密
尝试次数限制每账户 10 次失败尝试,之后锁定 15 分钟,与来源 IP 无关

速率限制

端点限制
POST /auth/login每 IP 每分钟 10 次请求
POST /auth/register每 IP 每分钟 5 次请求,另加下面的邮件发送上限
POST /auth/forgot-password, /resend-verification每 IP 每小时 5 封邮件;每地址:每 60 秒发送一次,每天 10 次
POST /auth/reset-password, /verify-email每 IP 每分钟 30 次请求;每个验证码有效期 10 分钟,5 次错误尝试后失效
团队变更(邀请、更新、移除)按用户的变更限制器

限制使用 Redis 中的原子滑动窗口。超出限制时,平台返回 HTTP 429,并带有等于窗口长度的 Retry-After 头。多次 429 之后没有应用层锁定。在边缘侧,平台位于 Cloudflare 之后,nginx 终结 TLS 1.2/1.3 并启用 HSTS,fail2ban 会封禁产生畸形请求的主机。

加密

静态数据

数据加密方式
Telegram 会话字符串使用平台会话密钥的 Fernet(AES-128-CBC + HMAC-SHA256)。可选的信封格式:按账号的数据密钥,由平台密钥(标准模式)或由所有者口令通过 Argon2id 派生的密钥(保险库模式,见下文)包裹。
代理凭据Fernet,同一平台密钥
机器人 API 令牌AES-256-GCM,密钥通过 HKDF-SHA256 从平台主密钥派生
出站 Webhook 签名密钥Fernet
TOTP 密钥Fernet,需配置 TOTP 加密密钥
密码、备用码、刷新令牌、API 密钥仅以哈希存储(密码用 bcrypt,其余用 SHA-256)
消息正文、对话元数据、联系人应用层不加密;以明文行存储在 Postgres 中
附件(MinIO,每文件 20 MB)服务端不加密;访问经由租户范围限定的流式端点
数据库备份不加密;存储在数据库主机的本地卷上,没有异地副本

没有外部 KMS,也没有自动密钥轮换。加密密钥是由运营方管理的环境密钥,保存在数据库之外。轮换密钥是一项人工操作。

保险库模式(口令加密的会话)

对于自有账号,你可以用一个口令(至少 10 个字符)重新包裹会话。包裹密钥通过 Argon2id(t=3,m=64 MiB,p=4)派生;平台密钥不再能解密该会话,因此没有口令的数据库转储毫无用处。代价是:自动化只在解锁窗口打开期间运行(默认 1 小时,最长 24 小时)。派生密钥在内存中交给工作进程,绝不落盘。保险库模式开启时会拒绝导出会话。租用账号不能使用保险库模式。

传输中

所有公网流量均为 HTTPS(TLS 1.2 或 1.3,带 preload 的 HSTS),位于 Cloudflare 之后。Telegram 流量以 MTProto 经由账号的代理发出,由 Telegram 自身的协议进行端到服务器的加密。

连接与会话监控

  • 每个账号的每一次 Telegram 连接尝试都会写入 connection_audit_log,包含代理主机和端口、API ID、设备型号、连接类型、成功或错误、耗时,以及连接是否来自服务器 IP。
  • 租用账号会接受上文所述的 6 小时活跃会话扫描;待处理的提示显示在“通知”下,类型为 security。
  • 没有基于地理位置的告警,没有设备指纹漂移检测,也没有基于健康评分的自动会话终止。

审计记录

日志记录内容谁可以读取保留期
团队审计日志team.create、team.member.invite、team.member.update、team.member.remove、team.member.leave,附带操作者、IP 地址、User Agent 以及变更前后的快照所有者和管理员(audit:logs:read);每个用户都可以读取自己的操作无限期保留
平台审计日志session_export、代理生命周期(proxy_created、proxy_updated、proxy_deleted、proxy_assigned、proxy_unassigned、proxy_rotated)、会话强制检查(enforcement_check、prompt_emitted、check_failed)运营方无限期保留
连接审计上文所述的每次连接记录运营方无限期保留
账号健康日志每个账号的健康评分输入运营方90 天
Webhook 投递事件类型、载荷、HTTP 状态、响应的前 400 字节、尝试次数工作区已投递保留 7 天,失败保留 30 天

团队审计日志可通过 GET /audit/logs 获取(可按 team_id、action、resource_type 筛选)。见 API。

SSRF 防护

平台在四处代表你发起出站 HTTP 请求。每一处都有自己的防护:

调用方防护
事件 Webhook(收件箱)新 URL 必须是 https://。注册时以及每次投递前都会解析主机名,投递只发往经过校验的地址;拒绝回环、私有、链路本地、运营商 NAT、保留和组播地址(IPv4 与 IPv6)、localhost 以及 *.local。已保存的端点若现在解析到被拒绝的地址,将以明确的错误失败而不会被投递。投递不跟随重定向,10 秒后超时,在大约 8 小时内最多重试 6 次,连续 5 次最终失败后该端点会被关闭。
机器人 Webhook URL注册时通过 DNS 解析;若任一解析出的地址为私有、回环、链路本地、多播、未指定或保留地址则被拒绝。
流程 HTTP 请求节点在请求时解析,且连接被固定到已验证的公网 IP(杜绝 DNS 重绑定);总超时 15 秒,连接超时 5 秒。请求不签名。
API 连接器仅允许 http:// 或 https://。保存和测试连接器时会解析主机名,请求只发往经过校验的地址;拒绝回环、私有、链路本地、运营商 NAT、保留和组播地址(IPv4 与 IPv6,包括 IPv4 映射地址和数字编码形式)、localhost 以及 *.local。不跟随重定向。
结账重定向 URL解析后若落在私有或回环地址则被拒绝。

接受纯 http:// 的 Webhook 目标;请尽可能使用 HTTPS。

机器人 Webhook 验证

入站机器人更新使用按机器人的 X-Telegram-Bot-Api-Secret-Token 密钥进行验证(见机器人)。出站事件 Webhook 带有签名:每次投递都携带 X-TGP-Signature,即使用端点密钥对时间戳和原始正文计算的 HMAC-SHA256,另有 X-TGP-Timestamp 和 X-TGP-Delivery——见 API › Webhook。由流程的 HTTP 请求节点发出的请求不签名;请用秘密路径或允许列表保护这些端点。

报告安全漏洞

请通过应用内支持(控制台中的支持气泡)报告,或者如果你没有账户,通过 @TelOsNotif_Bot 报告。没有安全邮箱。请附上复现步骤和受影响的端点。不要针对你不拥有的账号或工作区进行测试。范围、范围外项目以及响应目标(24 小时内确认收到,经核实的高严重性问题目标在 14 天内修复)见 /security。另见支持。

报告此页面的问题
安全 | TelegramOS文档