组目录挑战

给你一个具有挑战性的问题。 有一个Linux的盒子。 需要创build用户可以创build文件的目录,但是只删除/修改由他们创build的文件。 足够简单,有粘稠的设置,这就是它。 但是,我们希望特定的pipe理员用户能够从这个目录中删除文件,而不是root用户。 怎么做? NFS4_ACL可能在那里。 但我相信他们不会帮助的。 想法? 用户:user1:上传者user2:上传者admin1:admins <—应该能够pipe理组目录中的文件

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

更新1:

问题在于FS权限和nfs4_acls,因为用户将通过sftp来处理文件。 所以sudo和其他脚本的方式是不可能的。 可能的是为sftp-server使用LD_PRELOAD,并重写unlink syscall或类似的东西。 所以它落入了openssh和sftp-server。

更新2:

用户通过openssh连接到相关的目录,并且该目录应该是root:root所拥有的。 所有的文件都放在这个目录中没有任何结构(特定于应用程序)。 pipe理员其实不是pipe理上传文件的唯一用户,而是一组pipe理员用户。

我倾向于用sudo而不是用ACL来解决。 (在这个问题中没有明确提及NFS,所以我将假设root_squash不是问题。)

开始您的目录有权限1777(粘滞加上所有读/写)如您所build议的。

使用/usr/local/bin/rmd等文件名创build此脚本。 修改TARGET的定义,使其成为目标目录的绝对path

 #!/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更改为具有pipe理权限的用户,以删除目标目录中的文件。

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

因为我们知道rmd/usr/local/bin所以如果脚本没有足够的权限,就可以重新exec这个脚本,所以要避免pipe理用户必须记住使用sudo ,但是我忽略了那现在。 让我知道如果你想这个脚本的调整。

用法示例

 $ 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 

绑定是一个可能的解决scheme。 我命名我的电源pipe理员用户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是所有目录的所有者,并且拥有完整的所有者权限,因此它可以成功删除其中的任何文件,即使是recursion的。


另一种方法是编写一个有限的/bin/rm chroot()实现,并以root身份执行它。 一个chroot()可以被一个由root运行的进程转义,但只有当你给这个进程自由执行任何它想要的。 首先将chdir()chroot()放到/uploads目录,然后只调用unlink()rmdir()的简单C二进制文件应该是安全的。 但是这需要很多编码,比如recursion删除目录,像-f这样的命令行选项来忽略不存在的文件等。

一个简单的解决scheme似乎是这样的。 考虑pipe理用户是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创build/编辑/删除自己的文件。 用户admin可以删除任何文件(尽pipe来自rm警告)。

注意如果用户在/tmp/special创build目录,pipe理用户将无法删除它。 这可能是这个解决scheme的不二select,但是因为你的问题只提到了文件,而不是我觉得值得提供的目录

这个问题的全部范围还不清楚,因为我们不知道用例是什么。 然而,使用SELinux标签可以达到你所要求的。 SELinux为您提供了关于谁在做什么和在哪里的细粒度控制。 如果用户数量是“有限的”和“已知的” – 具有与每个用户相关的特定上下文/标签并不是一个大问题,那么写一点政策来编写你的需求就成了问题。

嗯…如何chroot到/special_folders_root/special_folder/./以避免与root拥有的/special_folders_root/special_folder/./目录的问题? 请参阅vsftpd的文档(例如)以获取有关path中无关点的解释。

不确定,如果下面将是有用的,但:我们有桑巴分享与subdirs。 networkingMFU将扫描的文档放在特定的子目录(MFU01 – > / share / 001 /,MFU15 – > / share / 015 / etc)中。 用户(从Windows)可能会更改或删除这些子目录中的文件,但无法删除子目录。 我使用Windows风格的ACL,但是我对NFS ACL一无所知

NB! 不是为了赏金,而是为了帮助。

这种方法如何:

保持原始上传的文件在一个单独的目录,每个用户。 这包括治理和删除权限。

$share ,所有内容都是指向原始文件的链接,并且拥有者/pipe理员ACL已到位。

最后, $share中的每个项目都是一个链接。 任何不是链接的东西都会被移动到(上传者)所有者的文件夹中。