親ディレクトリを削除できないようにしたい(子ディレクトリは削除できる)
お世話になっています。質問は2段階でお尋ねします。次のようなディレクトリ構造があるとします。
/parent/user1
/parent/user2
/parent/user3
各ユーザは自分のディレクトリやその中のファイルは削除しても構いませんが、parentディレクトリは削除させたくありません。以前、スクリプトのバグで削除するパスが /parent/ /user1
のようにスペースが入った状態で実行されたことがありました。この結果、/parent
以下全てのディレクトリが削除されてしまいました。そこで適切なパーミッション、スティッキービット、あるいはACLの設定を探しています。
Lunux/Mac OS XなどUNIX系のファイルシステムについて
実はこの話はHDFSで起きたことですが、HDFSのパーミッションやACLはLinuxのファイルシステムに準ずるとのことですので、まずLinuxやMacについてお尋ねします。
実験で次のようなコマンドを実行しました(Mac OS X 10.13.4)。
mkdir parent
cd parent
mkdir sub
ll
total 0
0 drwxr-xr-x 2 keisuke staff 64 Apr 19 13:59 sub/
cd ..
ll
total 0
0 drwxr-xr-x 3 keisuke staff 96 Apr 19 13:59 parent/
ここでparent
を別ユーザのものに設定します。
sudo chown root:nobody parent
Password:
ll
total 0
0 drwxr-xr-x 3 root nobody 96 Apr 19 13:59 parent/
さらにスティッキービットを設定します。
sudo chmod 1777 parent
Password:
ll
total 0
0 drwxrwxrwt 3 root nobody 96 Apr 19 13:59 parent/
スティッキービットを設定しつつ、権限は全開放したつもりです。
cd parent
ll
total 0
0 drwxr-xr-x 2 keisuke staff 64 Apr 19 13:59 sub/
サブディレクトリは私の所有です。
rm -rf sub
ll
total 0
当然ですが削除できます。
cd ..
rm -rf parent
ll
total 0
rootが所有するフォルダを私の権限で削除できてしまいました。
Wikipediaによるとスティッキービットは「ディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる」とあります。このとおりだとすると次の点が困ります。
- スティッキービットが立っているのに
parent
が削除できてしまった - 配下のファイルやディレクトリには
parent
の設定を反映させたくない
HDFSの場合
前述のとおり、実際に問題に対処したいのはHDFS (Hadoopのファイルシステム)です。多くの人がこのファイルシステム上で作業をしています。スクリプトのバグでhdfs dfs -rm -r /parent/ /myfiles/.../...
を誤って実行してしまったことがあります(スペースが空いていたので、全員のファイルを消してしまった)。再発防止を図りたいと思い、HDFSのパーミッション、スティッキービット、ACLについて調べているところです。もちろんスクリプトにも改修を加えて、削除などを実行する前にはパスを確認するようにしましたが、改修漏れがあるかも知れませんので抜本的な対策を考えています。
HDFSは社内の多くの人がこの上で作業をしています。事故を防ぐためのベストプラクティスをご存知でしたらご教示下さると幸いです。
よろしくお願いします。