すべての新しいファイルとディレクトリに特定のアクセスマスクがあり、ディレクトリにスティッキービットが設定されているディレクトリ(t
1、これらのディレクトリ内のファイルの削除を制限する)をセットアップしたいと思います。
最初の部分は、親ディレクトリのデフォルトACLを設定する必要があることを理解しています。ただし、新しいディレクトリは親からt
ビットを継承しません。したがって、非所有者はサブディレクトリ内のファイルを削除できます。修正できますか?
これは、グループのメンバーacltestがグループファイルを作成および変更できるようにする構成ですが、ファイルの所有者と「その他」以外はファイルの削除と名前の変更を許可しません。ユーザー名levを使用して、022のumaskを想定します。
groupadd acltest
usermod -a -G acltest lev
Rootアカウントとlevアカウントからログアウトします。ログインしてrootになるか、Sudoを使用します。
mkdir /tmp/acltest
chown root:acltest /tmp/acltest
chmod 0770 /tmp/acltest
chmod g+s /tmp/acltest
chmod +t /tmp/acltest
setfacl -d -m g:acltest:rwx /tmp/acltest
setfacl -m g:acltest:rwx /tmp/acltest
ACLはスティッキービットを設定できず、スティッキービットはサブディレクトリにコピーされません。ただし、inotifyまたは同様のソフトウェアを使用して、新しいディレクトリなどのファイルシステムの変更を検出し、それに応じて対応することができます。
たとえば、Debianでは:
apt-get install inotify-tools
次に、/usr/local/sbin/set_sticky.sh
のようにinotifyのスクリプトを作成します。
#!/usr/bin/env bash
inotifywait -m -r -e create /tmp/acltest |
while read path event file; do
case "$event" in
*ISDIR*)
chmod +t $path$file
;;
esac
done
root:chmod 0700 /usr/local/sbin/set_sticky.sh
の実行権限を付与します。次に、ブート時に、たとえば/etc/rc.local
または適切なRCファイルから実行します。
/usr/local/sbin/set_sticky.sh &
もちろん、この例では、/tmp/acltest
は再起動時に消えるはずです。そうでなければ、これは魅力のように機能するはずです。
スティッキービットのないディレクトリは、ハイフン-
値の前1000
は これ以上の権限値と一致する接頭辞 と見なされます。
$ find . -type d \! -perm -1000
したがって、ここに、親ディレクトリにスティッキービットが設定されているディレクトリのスティッキービットとsetgid
を設定する方法があります。
find
ステートメントはネストできない でなければ、ネストされたfind
ステートメントが必要になります。
これが、再帰的な条件付きの pipe がスティッキービットなしで見つかったディレクトリに採用される理由です。 -k
test スティッキービット(この場合は親ディレクトリのビット)が設定されている場合、trueを返します。
$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
こちらをご覧ください より多くのfind
の楽しみと setgid
についての説明 。
次のように、関数mkdirを作成し、vi ~/.bashrc
ファイルの最後に追加できます。
mkdir(){
/bin/mkdir "$@"
find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
}
-k
オプションは、GUIDではなくスティッキービットが設定されているかどうかをチェックします。ここでもg+s
で設定されています。これらのオプションについてはman test
を確認してください
また、これを行うことができます:
unalias mkdir;
source ~/.bashrc
これにより、新しいサブディレクトリのスティッキービットが設定されますが、親にスティッキービットが設定されている場合のみです。
この方法は機能しているように見えましたが、すべてのユーザーにとって確実ではありません!