让 FileVault 2 / APFS 加密卷和 Active Directory 共存
imbushuo
Please mind the gap
这篇文章对于大部分 Mac 用户来说是不需要的,因为你们家里可能没有一个 Active Directory……但是我家确实有一个。
背景知识:FileVault 2 和 APFS 加密卷使用一个高仿 macOS 登录界面的 EFI 程序实现卷解密和用户鉴权两个功能。在 iMac Pro 上,Apple T2 实现了对操作系统透明的 SSD 加解密功能,很不幸,对于其他 Mac 来说,你还需要手动提供密钥,且苹果没有提供类似 Bitlocker 网络解锁之类的功能(虽然 Mac 的固件有完整的 TCP/IP 栈和 Wi-Fi 支持)。于是我把 MacBook 加入了域之后就遇到了系统启动前的登录界面没有 Active Directory 账户的问题。这个问题对于跳过 First Setup 的定制镜像来说不应该存在。如果存在请继续看下文。
很明显我可以通过登录一个本地账户,然后登出本地账户再切换用户的方法来绕开加密卷的问题,但是这个方法非常繁琐,我依旧希望在不损失安全的情况下快捷地登录我的 Active Directory 账户来访问内网资源。搜索了一圈,果然一大群 IT Admin 在抱怨这个事情……然后水果也没修掉这个问题(可以说是 by design 了)。一个变通方法如下:
- 打开目录工具,进入 Active Directory 设置并确保 Mobile Account 启用。Mobile Account 即缓存域凭据以在设备脱离域控的情况下可以使用本地缓存凭据鉴权并登录系统,在 Windows 上是默认使用的(虽然不叫 Mobile Account)。具体如下图:
2. 做完这一步后,注销当前账户并重新登录 Active Directory 账户。正常情况下 macOS 会提示输入本地管理员凭据来创建一个 secureToken。输入凭据以继续。如果没有,见下一步。
- 确认 secureToken 已经启用:
BEN-MACBOOK:~ imbushuo$ sudo systemctl -secureTokenStatus imbushuo
2018-06-02 13:27:14.090 sysadminctl [816:38319] Secure token is ENABLED for user imbushuo
如果没有启用,使用命令
BEN-MACBOOK:~ imbushuo$ sudo sysadminctl -secureTokenOn <用户名>
来打开 Secure Token。
- 更新 PreBoot 数据。对于 FileVault 2 加密的磁盘:
BEN-MACBOOK:~ imbushuo$ sudo fdesetup sync
对于 APFS 加密卷:
BEN-MACBOOK:~ imbushuo$ sudo diskutil apfs updatePreboot disk1s1
卷名可能根据你的分区配置有所更改。
这样操作之后,已经登录过一次的 Active Directory 用户就会显示在 PreBoot 界面,并可以直接在 PreBoot 输入密码解锁卷并登录系统。这个方法也有一些问题:
如果 Active Directory 用户更新了密码(密码过期/管理员要求更改/在其他设备上更改了密码),PreBoot 需要重新同步。因此本地密码可能和目录不一致,对用户造成困扰。同理,如果用户因为管理原因(离职/离校/账户过期/账户被禁用)在目录中被注销或者禁止登录,PreBoot 也无法立即同步更改。
没有在这台 Mac 上登录过的 Active Directory 用户,需要一个本地用户或其他登录过的 AD 用户登录一次并登出后才能登录并使得自己的用户同步到 PreBoot 里。
如果是公用电脑,PreBoot 可能会被撑爆(几千个用户显示在那个屏幕?画美不看)。而且枚举登录过的用户名称在一些组织里是不妥的。 这种情况下又要数据安全又要目录登录的话,购买 iMac Pro (有自动加解密) 或者带有 TPM 的 PC。