前言
Headscale 作为 Tailscale 控制服务器的开源实现,赋予了我们自建和完全掌控一个安全、便捷的虚拟私有网络的能力。然而,当我们网络中的设备和用户逐渐增多,角色的职责各不相同时,所有用户全通的网络环境就不太适用了。遵循最小权限原则,为不同用户组分配其工作所必需的最小访问权限,是保障网络安全的关键一步。
ACL是 Headscale 提供的强大支持,我们可以精确定义谁可以访问什么,从而实现网络隔离和精细化管理。
环境准备
Headscale版本
截止本文发布,版本为0.26.1
Headscale配置文件
修改config.yaml
,添加policy
字段,笔者的完整配置如下。如果采用file模式,注意映射/var/lib/headscale/policy.json到本地磁盘
server_url: https://hs.example.cn
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
grpc_listen_addr: 0.0.0.0:50443
noise:
private_key_path: ./noise_private.key
prefixes:
v6: fd7a:115c:a1e0::/48
v4: 100.100.0.0/16
allocation: sequential
derp:
server:
enabled: false
paths:
- /etc/headscale/derp.yaml
database:
type: sqlite
sqlite:
path: /var/lib/headscale/db.sqlite
write_ahead_log: true
dns:
magic_dns: true
override_local_dns: true
base_domain: bokro.network
nameservers:
global:
- 223.5.5.5
- 114.114.114.114
- 2400:3200::1
- 2400:3200:baba::1
extra_records_path: /var/lib/headscale/extra-records.json
# 重点如下
policy:
mode: file # 可选file和database
path: /var/lib/headscale/policy.json
用户组分配
xinyun
: 管理员用户,属于admin
组。dev1 dev2
: 开发人员,属于dev
组。test
: 其他人员,属于other
组。
网络资源
GitLab 服务器:
192.168.124.100
(开发团队需要访问)Nginx 服务器:
192.168.124.246
(开发团队需要访问)
实现目标
管理员 (admin): 拥有最高权限,可以访问网络内的所有设备和资源。
开发者 (dev): 只能访问他们组内的其他设备、GitLab 服务器和 Nginx 服务器。
其他人员 (other): 权限最低,只能访问自己名下的其他设备,不能访问任何其他用户或服务器。
ACL配置文件
请将以下文件写入/var/lib/headscale/policy.json对应的本次磁盘文件内,如果您使用0.26版本,请删除所有的Tag(见github issue #2641)
{
"groups": {
"group:admin": [
"xinyun@"
],
"group:dev": [
"dev1@",
"dev2@"
],
"group:other": [
"test@"
]
},
"tagOwners": {},
"hosts": {
"gitlab": "192.168.124.100/32",
"nginx": "192.168.124.246/32"
},
"acls": [
{
"action": "accept",
"src": [
"group:admin"
],
"dst": [
"*:*"
]
},
{
"action": "accept",
"src": [
"group:dev"
],
"dst": [
"nginx:80,443",
"gitlab:22,80,443",
"group:dev:*"
]
},
{
"action": "accept",
"src": [
"group:other"
],
"dst": [
"group:other:*"
]
}
],
"ssh": []
}