El Captianのrootless
OS X El Captianになってrootlessという仕組みが導入されました。そう来たか・・・大胆な方法にちょっと感動してしまった。
rootlessとは、System Integrity Protectionというのが正式名称で、要するに、root権限でも変更できないようにディレクトリ、ファイル、プロセスを保護する仕組みです。ついに来たrootの格下げです。
例えば、/ディレクトリ配下で、 ls -ld@ /*
を実行するといくつかのディレクトリに拡張属性の com.apple.rootless
が付与されていることがわかります。
drwxr-xr-x@ 4 root wheel 136 10 30 10:01 /System com.apple.rootless 0 drwxr-xr-x@ 39 root wheel 1326 10 18 08:47 /bin com.apple.FinderInfo 32 com.apple.rootless 0 lrwxr-xr-x@ 1 root wheel 11 10 30 10:07 /etc -> private/etc com.apple.FinderInfo 32 com.apple.rootless 0 drwxr-xr-x@ 60 root wheel 2040 10 30 10:25 /sbin com.apple.FinderInfo 32 com.apple.rootless 0 lrwxr-xr-x@ 1 root wheel 11 10 30 10:07 /tmp -> private/tmp com.apple.FinderInfo 32 com.apple.rootless 0 drwxr-xr-x@ 13 root wheel 442 12 2 19:51 /usr com.apple.FinderInfo 32 com.apple.rootless 0 lrwxr-xr-x@ 1 root wheel 11 10 30 10:07 /var -> private/var com.apple.FinderInfo 32 com.apple.rootless 0
com.apple.rootless属性のあるディレクトリは、中を変更することはできません。シンボリックリンクの/tmpや/varはリネームや削除はできませんが、リンク先の/privateはrootlessではないので、中身は変更できます。
rootlessの対象かどうかをこの属性で判断しているのかはわかりませんが、他にも/Applications配下のSafari.appなど純正アプリにもcom.apple.rootlessが付与されています。
drwxr-xr-x@ 3 root wheel 102 6 23 05:25 /Applications/Safari.app com.apple.rootless 0
しかし、特例なのか僕の環境には元々あったからなのか判りませんが、 /usr/local
ディレクトリだけは自由に作成・削除できますね(OS X 10.11.1で確認)。homebrewで問題になっていたようなので、後から開放されたのかもしれません。
rootless導入の目的は、セキュリティ強化のためであり、ユーザーがマルウェアなどで安易に管理者権限のパスワードを入力したとしても、一定の保護が働くのでリスクが減らせます。
しかし、Macで開発をしているユーザーにとっては、いきなりroot権限に制限がかかったものだから混乱があったみたいで、rootlessを無効にしてしまう方法もあるようだけど、それだけはしたくないなあ。
アップルから見れば、UNIXなツールとしてのOS Xにとって、/usr配下もその一部のはずです。今までは自由に変更できたのはバージョン管理の点ではいささか疑問があったけれど、rootlessでそこが明確になったので、僕的にはすっきりしました。
とはいえ、スーパーユーザーであるはずのrootがスーパーでなくなってしまうって・・・もはやUNIX的なシンプルさや美しさはないのかもしれないが、この大胆さがアップルの強さなのだろう。
ちなみにxattrコマンドを使って、適当なディレクトリにcom.apple.rootlessを設定してみたい誘惑にかられますが、万が一うまくいって自分で戻すことが出きなかったら面倒なのでやってません。