Headscale ACL访问权限控制配置说明

前言 Headscale 作为 Tailscale 控制服务器的开源实现,赋予了我们自建和完全掌控一个安全、便捷的虚拟私有网络的能力。然而,当我们网络中的设备和用户逐渐增多,角色的职责各不相同时,所有用户全通的网络环境就不太适用了。遵循最小权限原则,为不同用户组分配其工作所必需的最小访问权限,是保障

前言

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 (开发团队需要访问)

实现目标

  1. 管理员 (admin): 拥有最高权限,可以访问网络内的所有设备和资源。

  2. 开发者 (dev): 只能访问他们组内的其他设备、GitLab 服务器和 Nginx 服务器。

  3. 其他人员 (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": []
}

Comment