web-dev-qa-db-ja.com

ACLを介して新しいディレクトリにデフォルトでスティッキービットを設定しますか?

すべての新しいファイルとディレクトリに特定のアクセスマスクがあり、ディレクトリにスティッキービットが設定されているディレクトリ(t 1、これらのディレクトリ内のファイルの削除を制限する)をセットアップしたいと思います。

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

5
Lev Levitsky

これは、グループのメンバー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

rootchmod 0700 /usr/local/sbin/set_sticky.shの実行権限を付与します。次に、ブート時に、たとえば/etc/rc.localまたは適切なRCファイルから実行します。

/usr/local/sbin/set_sticky.sh &

もちろん、この例では、/tmp/acltestは再起動時に消えるはずです。そうでなければ、これは魅力のように機能するはずです。

8
Christopher

親に基づいて再帰的にスティッキービットを設定する

スティッキービットのないディレクトリは、ハイフン-値の前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についての説明

2

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

これにより、新しいサブディレクトリのスティッキービットが設定されますが、親にスティッキービットが設定されている場合のみです。

この方法は機能しているように見えましたが、すべてのユーザーにとって確実ではありません!

0
Vincent