ACL 机制与策略结构
Tailscale ACL(Access Control Lists)在 tailnet policy file(huJSON)中定义,采用声明式 deny-by-default 模式。所有设备间连接均需显式授权。ACL 语法核心为 src(来源)和 dst(目标)规则,授权粒度精确到用户、组、标签和 CIDR。
基础语法结构
- action:
accept(允许)或drop(拒绝,隐式 deny)。 - src/dst:支持
user:、group:、tag:、autogroup:、*。 - 端口协议:
dst格式为[identity]:[port]/[proto],如tag:prod:443/tcp。
Tags:服务节点身份体系
Tags(标签)是非用户设备专用身份标识,解决传统 IP-based ACL 的动态性问题。
Tag 创建与授权
- 节点申请 Tag:
tailscale up --advertise-tags=tag:server。 - ACL 引用:
"dst": ["tag:server:22"],仅 tag 所有者可广告该 tag。
Tag 层次与继承
- Tag 可嵌套(部署自动化场景),但 ACL 中直接引用具体 tag。
- 推荐命名:
tag:prod、tag:staging、tag:ci-runner。
Groups:用户组管理
Groups 将用户批量授权,简化大规模用户管理。
- ACL 引用:
"src": ["group:dev"]。 - Autogroups:系统内置
autogroup:internet(所有用户)、autogroup:member(已认证用户)、autogroup:nonroot。
Grants:新代 ACL 语法
Grants(授权 Grants)是 ACL 的超集,简化了复杂的跨域授权。
与传统 ACL 差异
- ACL:
"grants"直接写在规则里。 - Grants:独立
grants块,支持更丰富的条件(attr:、持续时间)。
OIDC 集成
Tailscale 支持 OIDC(OpenID Connect)实现 SSO,将外部身份提供商(IdP)与 tailnet 用户自动同步。
配置要点
- IdP(如 Google Workspace、Okta)配置 redirect URI 为
https://login.tailscale.com/oidc/callback. - ACL 中用户引用自动映射自 IdP 声明(email、groups)。
- 离职即失活:OIDC 用户离 IdP 后自动失去 tailnet 访问权限(fail-close)。
ACL 测试与调试
dry-run 验证
Tailscale 提供 ACL Policy Test 功能(在 admin console),可编写测试用例:
实时调试命令
常见陷阱与最佳实践
| 陷阱 | 说明 | 缓解 |
|---|---|---|
* 过度授权 |
"src": ["*"] 开放全网 |
最小权限原则,精确到 tag/user |
| 规则顺序 | ACL 按从上到下评估 | 将最精确规则置顶 |
| Tag 泄露 | tagOwner 缺失导致任意用户可广告 | 严格定义 tagOwners |
| 忽略 autogroup | 依赖 IP 而非身份 | 优先使用 user:/group:/tag: |
| 无测试用例 | 上线后才发现阻断 | Policy Test 覆盖关键场景 |
与 OIDC/SSO 深度集成
OIDC 用户自动映射到 ACL,组信息来自 IdP claims。建议:
- 分组策略:IdP Groups → Tailscale Groups → ACL Grants。
- 设备信任:结合设备认证(Mobile Device Management 条件访问)。
- 审计:Event Logs 记录所有 ACL 变更与连接尝试。