强制所有者创建文件和文件夹


21

我有一个目录,其中包含许多用户之间共享的数据。对目录及其下任何内容的访问将由目录的组控制,该组将添加到有问题的用户中。这样,我创建了文件夹“粘性组” chmod g+s集。该目录将包含带有目录和文件的树形结构,文件总数可能为几百万。文件将很小,我预计不会超过50MB。

我的问题是文件或目录的所有者仍然是创建它的用户。这样,即使我应该从访问组中删除该用户,也不会完全删除其访问权限。

所以:

为了确保所有文件和子目录具有相同的所有者,我是否错过了其他选择?

我希望我可以使用cron-job来定期浏览整个目录,但是这对于一次执行一次PR文件命令效率低下。

我找到了一个使用INotify 的示例,但由于需要编写脚本,因此使我感到非常维护。

我还无法弄清楚ACL是否可以帮助我进行强制所有权。

有更聪明的方法吗?

我想要的是拥有一个可以通过向用户添加组来共享的目录。在此目录中创建的任何内容都将从其父级继承权限方案。如果有比我尝试的方法更好的方法,那么我无所不能。


我不认为我了解您要告诉我的内容。你能详细说明吗?
Martin Nielsen 2014年

要设置所有具有相同组和所有权的文件和子目录,为什么不使用chown -hR owner:group
潘迪2014年

有可能,但是由于总是在创建新文件,而我们正在讨论的文件数以百万计,因此需要执行cron作业,该作业需要定期浏览整个目录。除非我错过了一点?
马丁·尼尔森


实际上,在创建此问题之前,我先略过了这个问题。似乎没有解决如何将所有者强制给特定用户的问题。
马丁·尼尔森

Answers:


12

“自动”设置默认所有者将需要一个setuid类似的目录setgid。但是,尽管可以在FreeBSD上配置它,但是其他UNIX&Linux系统只需忽略即可u+s。但是,根据您的情况,可能还有其他解决方案。

我想要的是拥有一个可以通过向用户添加组来共享的目录。在此目录中创建的任何内容都将从其父级继承权限方案。如果有比我尝试的方法更好的方法,那么我无所不能。

因此,基本上,从我的角度来看,您想使用组机制来控制对目录的访问。但是,这不需要您限制整个目录结构中的权限。实际上,目录--x执行位可能正是您所需要的。让我给你举个例子。假如说...

  • 控制访问group_dir目录的组是ourgroup
  • 只有ourgroup群组中的人可以访问group_dir
  • user1user2属于ourgroup
  • 默认的umask是0022。

...考虑以下设置:

drwxrws---    root:ourgroup   |- group_dir/
drwxr-sr-x    user1:ourgroup  |---- group_dir/user1_submission/
drwxr-sr-x    user2:ourgroup  |---- group_dir/user2_submission/
-rw-r--r--    user2:ourgroup  |-------- group_dir/user2_submission/README

在这里,我们假设每个项目都是由其所有者创建的。

现在,在此设置中:

  • 的所有人都可以自由浏览所有目录ourgroup。小组中的任何人都可以在内部任何地方group_dir(但不能更深入)创建,移动,删除文件。
  • 不在的任何人都ourgroup将在处被阻止group_dir,因此将无法操纵其中的任何内容。例如,user3(不是的成员ourgroup)无法读取group_dir/user2_submission/README(即使他具有r--文件本身的权限)。

但是,这种情况下存在一个小问题:由于典型的umask,用户创建的项目无法被组中的其他成员操纵。这是ACL的来源。通过设置默认权限,即使umask值不变,您也可以确保一切正常:

$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/

该调用设置:

  • rw(x)所有者的默认权限。
  • rw(x)组的默认权限。
  • 默认情况下,其他用户没有权限。请注意,由于其他用户group_dir无论如何都无法访问,因此其下面的权限并不重要。

现在,如果我将项目创建为user2

$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw----    user2:ourgroup    group_dir/user2_submission/AUTHORS

有了此ACL,我们可以尝试重建以前的结构:

drwxrws---+    root:ourgroup   |- group_dir/
drwxrws---+    user1:ourgroup  |---- group_dir/user1_submission/
drwxrws---+    user2:ourgroup  |---- group_dir/user2_submission/
-rw-rw----+    user2:ourgroup  |-------- group_dir/user2_submission/README

同样,每个项目都是由其所有者创建的。

另外,如果您想为使用该目录的用户提供更多的功能/安全性,则可能需要考虑一些便利性。例如,这将防止user1删除user2_submission(因为他具有的-w-许可group_dir):

$ chmod +t group_dir/

现在,如果user1尝试删除user2的目录,他将得到一个可爱的Operation not permitted。但是请注意,尽管这样做可以防止修改中的目录结构group_dir,但仍可以访问其下面的文件和目录:

user1@host $ rm -r user2_submission
Operation not permitted

user1@host $ cat /dev/null > user2_submission/README

user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)

要考虑的另一件事是,我们使用的ACL设置了默认权限。因此,项目所有者可以更改与之关联的权限。例如,user2可以完美运行...

$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R

...因此,他的完整提交目录对小组中的任何人都不可用。

但是,由于您最初愿意将全部rws访问权限授予该组中的任何人,所以我假设您信任这些用户,并且不会期望他们进行过多的恶意操作。


ACL会否决默认权限?例如,如果我将$ setfacl -dRm u :: r,g :: rwX,o :: 0 group_dir /设置为仅允许组成员创建文件,则所有者可以编辑文件而不能在组中?至关重要的是,用户只能编辑文件(如果他们是该组的成员),而不管所有者是谁。
马丁·尼尔森

您无需为此删除所有者的所有权限。如果该组对文件具有写权限,则该组成员能够编辑该文件。所有者将“获得更多特权”。ACL并不总是覆盖默认权限(请参阅有关ACL有效权限)。
约翰·史密斯

关键是用户应该没有权限,只有组才应该。所有者应出于所有意图和目的完全不受特权的约束,除非他/她属于该组。
马丁·尼尔森

基本上,不在此组中的任何人都将获得特权,因为group_dir无论他是否拥有该文件,他都无法首先进入。所有者拥有的唯一真正的“特权”是,他可以更改其创作的权限(我在回答中对此进行了详细介绍)。
约翰·史密斯

1
绝对不。该group_dir目录由root:ourgroupwith拥有-rwxr-x---,这意味着只有root和root成员ourgroup可以访问它,即对目录下的文件执行任何操作。如果您没有--x目录权限,则即使拥有文件本身的权限,也无法访问其中的文件。
约翰·史密斯

6

有一种更聪明的方法可以做到这一点。它结合使用set-gid和默认 acls。显然,您将需要一个启用了ACL的文件系统。假设您要共享的目录位于/var/grpdir并且该组的成员sharing应该可以访问它。

chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir

默认ACL由具有默认ACL的目录中创建的子目录继承。因此,这意味着,在其中创建的任何文件/var/grpdir都会sharing通过目录的setgid位将其组设置为。另外,它将继承默认的ACL,它将覆盖默认的Linux样式要求,因为我们没有为特定的用户或组指定ACL。这意味着将创建具有所有权<user>:sharing和权限的所有文件rw-rw----。目录将是相同的,除了它们还将自己的默认ACL设置为其父目录(/var/grpdir)相同之外,当然还将用户和组的可执行位设置了。如果您将用户从sharing组中删除,则他们将无法访问目录(目录中也没有任何文件,即使它们是所有者)。

与使用cronjob定期纠正权限不同,权限始终保持同步,因为它们会使用新创建的文件和目录自动更新。该解决方案是轻量级的。不需要守护程序,并且一举纠正权限就不会出现IO高峰的情况。


因此,我是否正确理解这一点:如果您未指定用户或组,ACL将覆盖普通的文件系统权限?
马丁·尼尔森

1
不,他们不会修改文件上已设置的任何权限。当目录设置了默认权限acls,并且在该目录中创建了文件或目录时,将为NEW file / dir提供指定的默认权限。复制/移动到目录中的文件会保留其权限,设置ACL之前目录中存在的文件也会保留其权限。此外,在文件创建后,仍然可以照常使用chmod和chown修改所有权和权限
sirlark 2014年

2

我不知道这样做的任何好方法。技术上最干净的方法是执行此操作的FUSE文件系统。当然,如果没有人做的话,还有很多工作要做。

备择方案:

  1. 使用桑巴舞。samba具有force user参数。您可以在本地导出目录并在本地安装它。不会使访问速度更快,但是可以接受,因为只涉及环回网络。

  2. 使用非Linux文件系统,例如FAT32。必须为特定用户进行配置。访问权限必须由父目录处理。


0

我还没有听说过任何自动更改文件所有权的方法,这样在将文件移到某个目录时会更改文件所有者。最接近的是粘性,但似乎您已经表明组所有权还不够,实际的用户所有权必须更改。

在那种情况下,我认为最好的选择是带有chown -R标志的cron工作,就像Pandya提到的那样。将其放在cron上,每分钟或每五分钟运行一次。

如果您可以解释用户如何使用此功能,则可能会有更好的解决方案。

ACL可以帮助您更好地控制允许哪些人执行操作,它不会自动为您更改实际的文件所有权。我认为您需要更全面的了解并在此基础上评估/重新设计解决方案。


0

您可以使用inotify-tools并编写一个简单的bash脚本,如下所示。每当在目录中发生目录创建之类的事件时,Inotify都会关注目录Web并执行某些操作 。存在许多事件。您可以在Google上搜索它,或者可以在此网站上查看

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.