基于 UniFi 全家桶的企业 Wi-Fi 客户端管理

背景

北京办公室员工的数量逐渐增长,Wi-Fi 设备也越来越多。早期连接公司网络只要共享一下 Wi-Fi 密码即可,但随着时间的推移,这种方式暴露出以下问题:

  1. 任何知道密码的人都可以将任何设备连接至公司局域网(无论是否是公司员工、无论是否是公司允许的设备)。
  2. 员工离职后,无法禁止其再次连接公司网络。
  3. 在 UniFi Controller UI 上看到的客户端名称为自己设置的 Hostname。由于只有仅少数人会特意配置自己的 Hostname,导致难以查找此客户端的归属人。

可选的解决方案

对于问题 3,使用 UniFi 全家桶的我们只有一种方案:提前配置 UniFi Controller,根据 MAC 地址创建对应的客户端名称。另外还可同时配置 DHCP 服务,为特定客户端预留 IP。
对于问题 1 和 2:

  • a. 与 SSO 结合,配置 Radius 服务。
  • b. 配置 802.1X 访问权限认证。
  • c. 使用 MAC 地址白名单,明确限制可连接的客户端。

我们选择的是方案 c。原因如下:

  • 方案 a 和 b 需要较长时间调研和实施,我们没有相关经验。
  • 目前企业规模不大,能够接受配置 MAC 白名单。
  • 实现方案 c 的同时可以一并解决问题 3,一举两得。

自动化

手动维护一份文档式的列表用于记录员工信息与对应的设备列表、MAC 地址,不仅费时费力,还难以和 UniFi 的实际配置保持一致。UniFi Controller 的 MAC Address Whitelist UI 也不太顺手,例如不提供批量编辑、删除操作:


因此我们选择用 UniFi Controller 的 API,在 GitHub 上找到第三方维护的 PHP SDK。借助封装好的 SDK,只需要调用 create_user()update_user() 方法,我们很容易就开发了一个 CLI 小脚本,并定义了一套 YAML 配置文件:

lei.li@rightcapital.com: # 设备所有者
  - mac: 78:7e:61:...    # 设备 MAC 地址
    description: iPad    # 设备名称 / 描述
    white_list: true     # 是否加入 Wi-Fi 设备白名单

meimei.han@rightcapital.com:
  - mac: 78:7e:61:...
    description: iMac
    white_list: false   # iMac 使用有线网络连接,因此不需要加入白名单

# 以此类推...

我们把配置文件和 PHP 小脚本全部存放在一个 Git 仓库,配置好 GitLab CI,并在本地网关中安装了 GitLab CI Runner 以便于从局域网访问 UniFi Controller API。
需要增删设备时,提交到该仓库并创建 PR 即可,符合公司要求的设备经过 review 后合并到 master 分支,随后自动触发 CI 调用脚本把白名单以及设备信息配置好:

最终在 UniFi Dashboard 即可清晰明了地查看客户端列表和拓扑图:

拓展

在先前的文章中,我们介绍了将定时任务监控项代码化的实践过程。后续可考虑将小脚本和 YAML 格式配置文件改进为 Terraform Provider 和 HCL 语法的资源声明,每个客户端都是独立的 resource,借助 Terraform 帮助我们更加可靠地管理它们。


weixin.qq.com/r/pEjWziT (二维码自动识别)

编辑于 06-22