默认情况下通过 ACL 为新目录设置粘滞位?

Lev*_*sky 5 linux acl permissions

我想设置一个目录,其中所有新文件和目录都具有特定的访问掩码,并且目录还设置了粘滞位(t限制删除这些目录中的文件的那个)。

对于第一部分,我的理解是我需要为父目录设置默认ACL。但是,新目录不会t从父目录继承该位。因此,非所有者可以删除子目录中的文件。我能解决这个问题吗?

Chr*_*her 9

这是一种配置,允许组的成员acltest创建和修改组文件,同时禁止除所有者和“其他人”以外的文件的删除和重命名,什么也没有。使用用户名lev并假设 umask 为 022:

groupadd acltest
usermod -a -G acltest lev
Run Code Online (Sandbox Code Playgroud)

注销 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
Run Code Online (Sandbox Code Playgroud)

ACL 无法设置粘滞位,粘滞位不会复制到子目录中。但是,您可能会使用inotify或类似软件来检测文件系统中的更改,例如新目录,然后做出相应的反应。

例如,在 Debian 中:

apt-get install inotify-tools
Run Code Online (Sandbox Code Playgroud)

然后为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
Run Code Online (Sandbox Code Playgroud)

为其授予root执行权限:chmod 0700 /usr/local/sbin/set_sticky.sh。然后在启动时从,/etc/rc.local或者任何合适的 RC 文件运行它:

/usr/local/sbin/set_sticky.sh &
Run Code Online (Sandbox Code Playgroud)

当然,在这个例子中,/tmp/acltest应该在重启时消失。否则,这应该像魅力一样工作。