macOSのMDM制限によりNix Storeのマウント失敗するようになった
macOSでNixを使用している環境で、突然 /nix がマウントできなくて開発できなくなってしまった。
/nix をマウントする際に暗号化解除ためのパスワードの求められるが、そんなものを設定した覚えもない。Keychainにはパスワードが保存されているが、うまく動かない。
復元できるデータしか存在しないため、一度消して作り直そうと試みるが途中でエラーがでるようになってしまった。
Determine-nixの場合は以下のようなエラーが出力される
The following macOS configuration profile includes a 'Restrictions - Media' policy, which interferes with the Nix Store volume:
A computer-wide profile:
* Name: xxx
* Version: 1
* Description:
* ID: xxxx
* UUID: xxxx
* Installation Date: xxxx-xx-xx xx:xx:xx +0000
See https://dtr.mn/suis-premount-dissented
nix-installerの場合は /usr/sbin/diskutil mount" "Nix Store" の際に失敗してしまう。
結論
内蔵ディスクのマウントが制限されると Nix のインストールに失敗するようになる。
ここまでの症状からもわかるように Nix Storeがマウントできないためである。
MDMの構成プロファイルによって制限できるので、システム管理者に許可設定を含むプロファイルを配布してもらう必要がある。
具体的に許可が必要な設定は「ハードディスクメディアのアクセス設定(macOS 10.15)」の「内蔵ディスク」の許可権限が必要でした。
とはいえ、これは出力されているURLに記載されている内容の通りでした。
ここに書かれていないことで、この記事として新規となる情報は、 Nix Store をマウントできなくなっても消して作り直しても問題ないということぐらいだろうか。
細かい経緯
macOS のアップデートしたら起動時に FileVault 化がされてなかったため、するように促されました。おそらく構成プロファイルが更新されてから、再起動しておらず、起動時に初めて表示されたのでしょう。
FileVault化を拒否するわけにもいかないのでしてみたところ暗号化されたファイルシステムのマウントが失敗してパスワードキーを求められるようになりにNix Storeにアクセスできなくなりました。
おそらくこのときにマウントに失敗していて、パスワードはあっているがマウントに失敗するためユーザにパスワードを要求したのではないかと考えられます。
ということで、これに必要な権限を与えて貰う必要があり、plistで表現した場合、以下のXMLになるのでしょう。
<key>PayloadType</key>
<string>com.apple.systemuiserver</string>
<key>PayloadContent</key>
<dict>
<key>mount-controls</key>
<dict>
<key>harddisk-internal</key>
<array>
<string>allow</string>
</array>
</dict>
</dict>
よくわかっていないですが、Determine-nixに対して例外を設定することができるなら、Determine-nixのみ許可を与えるとよりよいでしょう。
おまけの学び
- nix-installerはshellスクリプトで実装されているが、Determine-nixのインストーラはRustで実装されている
-
/usr/sbin/diskutil mountに失敗するが mount コマンドでマウントするとmountができるが暗号化されているので結局なにもできない- diskutilによるmountが制限されるだけで、自分でmountすればもしかしたら許可して貰う必要はないかもしれない
Discussion