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を設定してみたい誘惑にかられますが、万が一うまくいって自分で戻すことが出きなかったら面倒なのでやってません。