群组目录挑战

群组目录挑战

有个有挑战性的问题要问你。有一台 Linux 机器。需要创建一个目录,用户可以在其中创建文件,但只能删除/修改他们创建的文件。设置粘性位就足够简单了。但是我们希望特定的管理员用户能够从此目录中删除文件,而不是 root 用户。怎么做?NFS4_ACL 在那里是可能的。但我确信它们不会有帮助。有什么想法吗?用户:用户 1:上传器用户 2:上传器管理员 1:管理员<--- 应该能够管理组目录中的文件

dir 上的 sgid 可以保护文件不被其他用户编辑,但无法阻止用户删除其他用户的文件。这就是问题所在

更新 1:

问题在于 FS 权限和 nfs4_acls,因为用户将通过 sftp 处理文件。因此 sudo 和其他脚本方式都无法实现。可能的方法是使用 LD_PRELOAD 进行 sftp-server 并覆盖 unlink 系统调用或类似的东西。因此它属于 openssh 和 sftp-server。

更新2:

用户通过 openssh chroot 到相关目录,并且该目录应为 root:root 所有才能正常工作。所有文件都放在此目录中,没有任何结构(特定于应用程序)。管理员实际上并不是管理上传文件的唯一用户,而是一组管理员用户。

答案1

我倾向于使用sudo而不是使用 ACL 来解决问题。(问题中没有明确提到 NFS,因此我认为这root_squash不是问题。)

按照您的建议,从具有权限 1777(粘性加上所有读/写)的目录开始。

使用文件名创建此脚本,例如/usr/local/bin/rmd。修改 的定义,TARGET使其成为目标目录的绝对路径

#!/bin/bash
#
# Remove files from $TARGET. Some care is taken to avoid escaping from
# the path root
#
########################################################################
#
TARGET='/tmp'

ERROR=
for ITEM in "$@"
do
    LINK=$(readlink -f "$ITEM")
    if test -n "$LINK" && echo "$LINK" | grep -vq "^$TARGET/"
    then
        echo "Suspicious path: $ITEM" >&2
        ERROR=yes
    fi
done
test yes = "$ERROR" && exit 1

exec rm "$@"

将以下条目添加到sudoers文件(用于visudo编辑此文件)。将 更改admin为具有管理权限的用户,以删除目标目录中的文件。

admin ALL = NOPASSWD: /usr/local/bin/rmd

因为我们知道 是 ,rmd所以如果没有足够的权限,/usr/local/bin可以重新执行脚本,这样就避免了管理用户必须记住使用,但我现在省略了这一点。如果您希望对脚本进行此调整,请告诉我。execsudo

使用示例

$ ls -l /tmp
lrwxrwxrwx 1 roaima roaima 4 Mar 31 00:17 etc -> /etc
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 one
lrwxrwxrwx 1 roaima roaima 2 Mar 31 00:20 root -> ..
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 two

$ sudo rmd /tmp/etc/hosts /tmp/root/etc/motd /tmp/one
Suspicious path: /tmp/etc/hosts
Suspicious path: /tmp/root/etc/motd

$ ls /tmp
etc  one  root  two

$ sudo rmd /tmp/one /tmp/root
$ ls /tmp
etc  two

答案2

绑定文件系统是一个可能的解决方案。我把我的高级管理员用户命名nradmin为:

mkdir /uploads
chmod 1777 /uploads

mkdir /home/nradmin/manage-uploads
bindfs -u nradmin -p ud+rwx /uploads /home/nradmin/manage-uploads

挂载目标中的每个文件和目录均归 拥有nradmin-p ud+rwx使每个目录都具有目录所有者的“rwx”权限。由于nradmin是所有目录的所有者,并且它在其中拥有完全所有者权限,因此它可以成功删除其中的任何文件,甚至可以递归删除。


另一种方法是编写一个有限的chroot()实现/bin/rm并将其作为执行root。Achroot()可以由运行的进程转义,root但前提是您赋予此进程执行其想要执行的任何内容的自由。一个简单的 C 二进制文件首先对目录进行chdir()& ,然后仅调用或应该是安全的。但这需要大量的编码,例如递归删除目录、命令行选项(例如忽略不存在的文件)等。chroot()/uploadsunlink()rmdir()-f

答案3

一个简单的解决方案似乎是这样的。假设管理用户为admin,我们的特殊目录为/tmp/special

mkdir /tmp/special
chmod 1777 /tmp/special
chown admin:admin /tmp/special
ls -ld /tmp/special
drwxrwxrwt 2 admin admin 4096 Apr  3 21:34 /tmp/special

任何用户都可以在 中创建/编辑/删除自己的文件/tmp/special。用户admin可以删除任何文件(尽管会收到 的警告rm)。

注意:如果用户在 中创建目录/tmp/special,则管理用户无法删除它。这可能是此解决方案的一大障碍,但正如您的问题中提到的文件并不是目录我觉得这是值得奉献的。

答案4

嗯...如何通过 chrooting 来/special_folders_root/special_folder/./避免 root 拥有的 chrooted 目录出现问题?请参阅 vsftpd 的文档(例如)了解有关路径中多余点的解释。

不确定以下内容是否有用,但是:我们有带子目录的 Samba 共享。网络 MFU 将扫描的文档放在特定子目录中(MFU01 --> /share/001/、MFU15--> /share/015/ 等)。用户(来自 Windows)可以更改或删除这些子目录中的文件,但不能删除子目录。我使用 Windows 样式的 ACL 实现了这一点,但我对 NFS ACL 一无所知

注意!不是为了赏金,而是为了援助。

相关内容