前言
原文链接:https://tailscale.com/blog/tailscale-key-management
Tailscale 分为控制平面和数据平面。数据平面由直接的 WireGuard 链路构建,提供网络中任意两台机器之间的端到端加密。控制平面负责验证用户身份、验证机器密钥,并将对等方的公钥分发给网络中的每一台机器。本文档专注于控制平面中的密钥管理。如需了解更多关于 Tailscale 的概述,请参阅“Tailscale 工作原理”。
机器密钥
每当安装 Tailscale 客户端的机器都会首先生成一个 curve25519 机器私钥。控制平面的协调服务器会发布其自身的 25519 公钥(客户端通过公共 TLS 证书验证,可选地进行证书固定)。然后,客户端和控制服务器通过 ECDH 进行通信,具体使用的是小型 NaCl crypto_box
消息。
常见的机器密钥策略是要求预先授权。尝试加入需要机器授权的 Tailscale 网络时,必须先由网络管理员或自动化策略检查批准该机器。
ECDH crypto_box
握手过程可以证明服务器,客户端持有特定的机器私钥,并允许服务器基于此密钥施加策略。
节点密钥
在登录时,客户端会生成一个节点私钥。这是与机器密钥不同的 curve25519 密钥。该密钥的公钥部分会被传输到控制服务器,并与特定的机器密钥关联。
控制服务器将节点密钥与特定身份绑定。通常情况下,它会为节点密钥生成一个唯一的认证 URL 并返回给客户端,要求最终用户在网页浏览器中完成交互流程。这通常会触发与组织的身份提供商(如 OAuth2 或 SAML)的认证流程,并可能包括多因素认证(MFA)步骤。控制服务器将节点密钥与人类身份绑定,并可以根据策略确定该密钥的使用方式。
节点公钥用于配置 WireGuard 对等节点。它会被分发到该节点允许通信的所有机器。一旦密钥自动轮换或手动禁用,撤销消息会立即发送。
在某些策略设置下,客户端可以随意重新生成节点密钥,并通过证明对旧密钥和新密钥的所有权来替换旧密钥。控制服务器也可以要求定期重新生成密钥,作为常规的密钥轮换,这大大增加了从被攻破的客户端中提取凭据的难度。
网络映射
一旦获得授权,客户端会保持一个长时间轮询的 HTTPS 请求连接到控制服务器,以便快速获取网络更新。因此,授权和撤销授权几乎可以在整个网络中即时生效,除非发生部分网络故障导致客户端与控制服务器分离,在这种情况下,密钥可以缓存几小时。
发送给客户端的网络映射仅包含与该客户端相关的网络元素,即用户或该机器的标签被允许通信的机器。
TLS
机器和节点密钥的协商完全通过TLS进行,以确保在网络中严格代理所有连接的情况下实现最大兼容性。这减轻了要求所有流量都必须使用TLS的组织的认证负担。
当需要进行交互式用户身份验证时,Tailscale 客户端会在用户的机器上使用其首选的网页浏览器显示一个控制服务器的 URL,并通过 TLS 进行 OAuth2 或 SAML 流程。
分布式防火墙
从控制服务器发送到各个 Tailscale 客户端的网络地图中包含一组 IP:端口过滤规则。这些过滤规则控制哪些对等节点可以连接到该机器,并限制暴露的服务。此列表源自 Tailscale 网络的 ACL(访问控制列表)。网络管理员可以根据机器标签和用户组来指定防火墙规则,Tailscale 控制服务器会将这些规则编译成每个网络中机器的自定义过滤规则集。
用户组可以由网络管理员在控制服务器中手动配置,也可以从组织的身份服务提供商自动导入。
机器标签可以在用户通过客户端授权流程时,由具有相应权限的用户设置。
这些策略工具使网络管理员能够使用高层次的概念、组织单元和人员来定义网络。通过在控制服务器中将这些对象编译为简单的 IP:端口过滤列表,复杂的策略决策被保留在控制服务器中,而不进入 Tailscale 客户端和控制协议,从而实现了清晰的职责分离。