親に基づいて固定ビットを再帰的に設定

親に基づいて固定ビットを再帰的に設定

tすべての新しいファイルとディレクトリに特定のアクセスマスクがあり、ディレクトリにも固定ビットセット(このディレクトリ内のファイルの削除を制限する固定ビット)があるディレクトリを作成したいと思います。

最初の部分では、親ディレクトリのデフォルトACLを設定する必要があることを理解しました。ただし、新しいディレクトリはt親ディレクトリからこのビットを継承しません。したがって、所有者でない人もサブディレクトリのファイルを削除できます。この問題を解決できますか?

答え1

グループメンバーシップを許可する構成であり、テスト、グループファイルの作成と変更と同時に、所有者および「他人」を除き、ファイルの削除および名前の変更は許可されません。ユーザー名を使用して、レフそしてumaskが022であると仮定します。

groupadd acltest
usermod -a -G acltest lev

ルートアカウントからログアウトしてレフアカウント。ログインしてルートになるか、以下を使用してください。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

次にスクリプトを作成します。inotify、良い/usr/local/sbin/set_sticky.sh

#!/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

実行許可chmod 0700 /usr/local/sbin/set_sticky.sh。次に、起動時に(たとえば)/etc/rc.localまたは適切なRCファイルで実行します。

/usr/local/sbin/set_sticky.sh &

もちろん、この例では/tmp/acltest再起動時に消える必要があります。それ以外の場合、これは魅力のように動作します。

答え2

親に基づいて固定ビットを再帰的に設定

固定ビットがないディレクトリは、次の文で見つけることができます。ここで、-値の前のハイフンは次1000のように処理する必要があります。この特権値とより高い特権値に一致するプレフィックス

$ find . -type d \! -perm -1000

setgidしたがって、固定ビットと固定ビットが設定されている親ディレクトリを持つディレクトリを設定する方法は次のとおりです。

findそうでない場合は、入れ子になった文が必要です。findドアは入れ子にすることはできません。

だから代わりに管路再帰条件を使用すると、固定ビットなしで見つかったディレクトリに使用されます。 -kテスト固定ビット(この場合は親ディレクトリの固定ビット)が設定されている場合はtrueを返します。

$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done

ねえもっと楽しくfindの説明setgid

答え3

次のように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

これにより、新しい子ディレクトリに固定ビットを設定する必要がありますが、親ディレクトリに固定ビットが設定されている場合にのみ適用されます。

この方法は効果があるようですが、すべてのユーザーに効果があるかどうかはわかりません!

関連情報