macOSでACL
ファイルやディレクトリ のアクセス権をrwxの組み合わせでやってくれていれば楽なのに、拡張されたACLなるものが設定されたファイル・フォルダが多い最近のmacOSです(最近と言いつつ軽く10年以上?そんな状態みたい。Mac OS X 10.4から導入された模様)。ls- lすると drwx------+ ってな感じで後ろに+マークがついている連中です。ちなみに@がつく連中もあり、こっちは拡張属性が付与されているということです。(拡張ACLの+と拡張属性の@は@が優先されて表示される?)
拡張属性はファイルシステムが解釈しないファイル・フォルダに関するメタデータのことで例えばファイルに青いラベルをつけてそれを ls -l@ ってしてみると com.apple.metadata:_kMDItemUserTags 55 って属性が追加されているのが見えますがそれは余談。
拡張ACLです。ls -le すると内容を見ることができます。
以下、ある共有フォルダ内のフォルダの情報。
drwx------+ 6 sharedUser1 wheel 204 5 10 18:56 B 0: group:admin inherited allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit 1: group:staff inherited allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit 2: user:sharedUser1 inherited allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit 3: user:scan inherited allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit 4: group:sharedGroup1 inherited allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit
とても横に長いですけど、B フォルダについての情報です。これをHight SierraまでのmacOS ServerではGUIで分かりやすく表示してくれて、かつ簡単に設定させてくれたんですよね。でもファイル共有機能がなくなったmacOS Serverにその機能は無くなりました。ファイル共有の機能自体がServerを入れなくても動作するようにしたって事みたいだけど、結果、ちょっと難儀しています。
もちろんターミナルから拡張属性の追加・削除は可能で、chmod +aあるいは-aでそれが可能とのこと。
TESTExtr.txtってファイルに対して
# ls -le TESTExtr.txt -rw-r--r--@ 1 user group 0 5 10 19:46 TESTExtr.txt # chmod +a "group:everyone deny delete" TESTExtr.txt # ls -le TESTExtr.txt -rw-r--r--@ 1 user group 0 5 10 19:46 TESTExtr.txt 0: group:everyone deny delete
って感じで、group:everyone deny deleted って拡張ACLが加わるとFinderの情報を見るで自分に読み書きの権限があることが確認できるのに、削除しようとするとパスワードが要求されるようになります。まぁパスワード入れたら消せるのだけど。
拡張ACLを削除する場合は以下。
# chmod -a "group:everyone deny delete" TESTExtr.txt
# ls -le TESTExtr.txt
-rw-r--r--@ 1 user group 0 5 10 19:46 TESTExtr.txt
#
その拡張ACLを削除すると難なくFinderから削除可能になりますね。
この場合、"0: group:everyone deny delete"っていうACLを丸ごと削除しているので、
chmod -a#0 TESTExtr.txt
でもいいのです。0番目を空にする、つまり削除するって意味、ですかね。
再帰オプション -R も当然効きます。ACLの全削除は-Nオプションとのこと。
+a, -aの他に =a もあって、これは置き換えるってことみたいっすね。chmod =a#2 〜 とかやると3番目のエントリを置き換えるようです。
Appleも公式に特に共有フォルダでの挙動で他の人のファイルを編集できないなんて時に
sudo chmod -R +a “group:YourGroupName:allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit” /Volumes/volumename/path/to/share
を実行してねってサポートを出しています。
macOS でホストされている SMB 上のファイルをユーザが編集または認証できない場合 [Apple サポート]
もう少し勉強すると、"0: group:everyone deny delete" ってのは、誰 許可or不許可 何 って順番で書かれているとのこと。不許可が deny で許可が allow っすね。この「何」の部分にいろんな項目をカンマで繋いで書き込まれているのが冒頭の横に長いやつということでしょう。許可・不許可の前にinheritedってのがありますが、これはなんでしょう?
まぁつまり、Mac上でよくわからないけど削除できなかったり移動できなかったりファイルを作ることができなかったりする場合は、拡張ACLをどうにかすれば良さそうなのですが、冒頭に書いたあるフォルダの情報を見れば分かるように、非常に見づらいし項目が多い。大変です。なのだけど、「このファイルはあるグループには見せるけど、あるグループには見せないし、編集権限は特定のユーザのみにした上で誰にも消させない」なんて設定を共有フォルダの中では行いたいわけで、避けては通れなさそうなのですよね。
ってことで、この辺の制御をGUIでやるものは何かないかって探すと、昔から有名なTinkerTool SystemやMacPilotってことみたいです。Macの隠しコマンドを使うためのユーティリティって紹介されるもので、TinkerTool Systemが$14、MacPilotは月額$1.33でした。MacPilotはLite版がMac App Store に置かれているのでそれだとどうでしょ。2000円ぐらいだったので購入してみました。
これはデスクトップフォルダの情報ですけど、ACLをこのように編集することが可能なようです。
先程 これはなんでしょう?って書いた inherited は Entry Inherited にチェックを入れた状態のようです。継承されたエントリ?
しばらくこれで様子をみましょうか…