标签系统
标签用于对 Tailscale tailnet 中的设备进行身份验证和标识。它们类似于服务账户,但具有更多灵活性。
什么是标签?
标签是 Tailscale 提供的设备标识系统:
- 为非用户设备提供身份
- 基于目的管理访问控制策略
- 支持多个标签 per 设备
- 灵活的标签所有权
标签特点
- 适用于服务器和设备
- 可以分配多个标签
- 在 tailnet 策略文件中定义
- 只有指定的标签所有者可以分配标签
使用场景
# 示例:一个设备有多个角色
tag:postgresql # 数据库服务器
tag:prod # 生产环境
tag:web-server # Web 服务器先决条件
标签是免费功能,适用于所有计划。但需要特定权限:
- 需要是 tailnet 的所有者、管理员或网络管理员才能在 tailnet 策略文件中定义标签
- 需要是标签所有者才能将标签分配给设备
限制
- 不能从设备移除所有标签
- 不能使用 --advertise-tags 标志移除标签
- IP sets 不支持标签
- 标签设备只能 SSH 到其他标签设备
- 一些限制围绕使用标签定义组或作为 SSH 源存在
使用场景
服务设备管理
标签非常适合管理不希望链接到特定用户的服务设备:
- Web 应用服务器
- 数据库服务器
- CI/CD 运行器
- IoT 设备
多用户管理
标签允许多个用户管理设备:
{
"tagOwners": {
"tag:database": ["group:dba", "alice@example.com"]
}
}最佳实践
1. 清晰的命名规范
推荐命名:
- tag:prod-postgresql # 生产 PostgreSQL 服务器
- tag:nonprod-db # 非生产数据库
- tag:prod-emea-web # EMEA 生产 Web 服务器
- tag:ci-cd-runner # CI/CD 运行器
避免:
- tag:foo-bar # 无法识别用途
- tag:temp # 模糊不清2. 使用认证密钥
使用带有预分配标签的认证密钥:
tailscale up \
--auth-key=tskey-key \
--advertise-tags=tag:prod,tag:web3. 避免用于用户设备
标签仅用于非人类机器。用户只能通过指定的用户账户访问 Tailscale。
不要用于:
- MacBook 或 Android 等用户设备
- 联系个人用户
- 终端用户设备身份验证
4. 谨慎考虑所有者
在 tagOwners 部分仔细考虑每个标签的所有者。
工作原理
定义标签
在 tailnet 策略文件的 tagOwners 部分定义标签:
{
"tagOwners": {
"tag:server": ["dave@example.com"]
}
}标签所有权
标签可以有空的所有者列表。所有标签都隐式由 tailnet 的所有者、管理员和网络管理员拥有。
应用标签
可以使用管理控制台、Tailscale CLI 或 Tailscale API 应用标签:
管理控制台
1. 在管理控制台的 Machines 页面
2. 找到设备
3. 点击"..."菜单
4. 选择"Edit tags"
5. 添加所需标签
6. 点击"Save"CLI
# 添加单个标签
sudo tailscale login --advertise-tags=tag:server
# 添加多个标签
sudo tailscale login \
--advertise-tags=tag:server,tag:development
# 移除所有标签
sudo tailscale login --advertise-tags=API
curl https://api.tailscale.com/api/v2/device/12345/tags \
-u "tskey-<key>" \
-H "Content-Type: application/json" \
--data-binary '{"tags": ["tag:prod", "tag:web"]}'高级标签层次结构
标签所有者非常灵活。可以分配多个所有者,可以是用户、组或甚至其他标签。
{
"tagOwners": {
"tag:deployment-1": ["alice@tailscale.com"],
"tag:prod-2": ["tag:deployment-1"],
"tag:test-2": ["tag:deployment-1"]
}
}使用示例
示例 1: Web 应用服务器
{
"tagOwners": {
"tag:web": ["group:devops"]
},
"groups": {
"group:devops": ["ops@example.com"]
},
"acls": [
{
"action": "accept",
"src": ["tag:web"],
"dst": ["tag:db:3306,80,443"]
}
]
}示例 2: 数据库服务器
{
"tagOwners": {
"tag:database": ["group:dba"]
},
"groups": {
"group:dba": ["dba@example.com"]
},
"acls": [
{
"action": "accept",
"src": ["tag:application"],
"dst": ["tag:database:5432"]
}
]
}示例 3: CI/CD 运行器
{
"tagOwners": {
"tag:ci-cd": ["group:engineering"]
},
"groups": {
"group:engineering": ["dev@example.com"]
},
"acls": [
{
"action": "accept",
"src": ["tag:ci-cd"],
"dst": ["tag:ci-cd:*"]
}
]
}标签与用户身份验证
标签与用户身份验证并行。它们为基于服务的设备(如 Web 服务器或应用连接器)提供与用户账号相同的角色。
重要:设备无法同时具有用户账号和标签。应用标签会移除用户账号。同样,用户账号会移除所有标签。
密钥过期
标记设备的密钥过期默认禁用:
- 第一次应用标签并验证时
- 重新验证 2022 年 3 月 10 日前标记的设备
如需更改,可以从管理控制台或使用 Tailscale API 启用或禁用密钥过期。
在 Tailscale 生态系统中
标签与几乎所有其他 Tailscale 功能无缝工作:
出口节点
虽然端用户设备可以作为出口节点,但更常见的是使用基于标签的身份。
子网路由器
虽然端用户设备可以作为子网路由器,但更常见的是使用基于标签的身份。
应用连接器
应用连接器设备严格是基于服务的,必须使用基于标签的身份验证。
访问控制
使用标签在 tailnet 中选择和服务设备创建访问控制策略:
ACL
{
"acls": [
{
"action": "accept",
"src": ["tag:prod"],
"dst": ["tag:prod:*"]
}
]
}授权
{
"grants": [
{
"src": ["tag:prod"],
"dst": ["tag:tailsql"],
"ip": ["*"]
}
]
}自动组
autogroup:tagged 自动组选择所有具有基于标签身份的设备。
最佳实践
1. 定义清晰的命名约定
推荐模式:
Server Role:
- tag:app-server
- tag:database
- tag:queue
Application Name:
- tag:support-console
- tag:finance-reporting
- tag:operations-dashboard
Environment:
- tag:prod
- tag:staging
- tag:dev
Location:
- tag:americas
- tag:emea
- tag:south-asia2. 使用复合标签
由于标签不会为访问规则"连接",使用复合标签:
tag:prod-app # 生产应用服务器
tag:nonprod-db # 非生产数据库服务器
tag:prod-app-finance # 生产财务报告应用3. 文档化标签使用
维护清晰的文档记录如何在 tailnet 中使用和管理标签。
4. 使用测试
使用测试验证 tailnet 策略文件:
{
"tests": [
{
"src": "group:sre",
"accept": ["tag:prod:1234"]
}
]
}故障排除
无法分配标签
检查步骤:
- 确认标签已定义
- 检查标签所有者
- 验证权限
- 查看错误消息
标签不生效
可能原因:
- ACL 规则不正确
- 标签未正确分配
- 设备未重新验证
- 策略文件语法错误
权限问题
- 确认是标签所有者
- 检查用户角色
- 验证 ACL 规则
- 查看审计日志