我有一个目录,其中包含多个用户之间共享的数据。对该目录及其下任何内容的访问将由该目录的组控制,该组将添加到相关用户。因此,我创建了文件夹“粘性组”chmod g+s
集。该目录将包含一个包含目录和文件的树形结构,文件总数可能有几百万个。这些文件相当小,我预计不会超过 50MB。
我的问题是文件或目录的所有者仍然是创建它的用户。因此,即使我应该从访问组中删除该用户,我也不会完全删除他的访问权限。
所以:
我是否还错过了其他选项来确保所有文件和子目录具有相同的所有者?
我希望我可以使用 cron-job 定期浏览整个目录,但这对于本质上是一次 pr-file 命令来说效率很低。
我找到了一个例子使用 INotify 但这让我觉得维护成本很高,因为它需要编写脚本。
我一直无法弄清楚 ACL 是否可以帮助我强制拥有所有权。
有没有更聪明的方法来做到这一点?
我想要的是有一个可以通过向用户添加组来共享的目录。在此目录中创建的任何内容都会继承其父目录的权限方案。如果有比我正在尝试的更好的方法,我会洗耳恭听。
答案1
“自动”设置默认所有者将需要一个行为setuid
类似于setgid
.然而,虽然这可以在 FreeBSD 上配置,但其他 UNIX 和 Linux 系统只是忽略u+s
.但是,就您的情况而言,可能还有另一种解决方案。
我想要的是有一个可以通过向用户添加组来共享的目录。在此目录中创建的任何内容都会继承其父目录的权限方案。如果有比我正在尝试的更好的方法,我会洗耳恭听。
因此,基本上,据我所知,您希望使用组机制来控制对目录的访问。但是,这并不要求您限制整个目录结构的权限。实际上,目录--x
执行位可能正是您所需要的。让我举一个例子。假如说...
- 控制目录访问的组
group_dir
是ourgroup
。 - 只有群组内的人
ourgroup
才能访问group_dir
。 user1
并user2
属于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 $ > 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
向组中的任何人授予完全访问权限,因此我假设您信任这些用户,并且您不会期望他们进行太多恶意操作。
答案2
有一种更聪明的方法可以做到这一点。它使用 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 的目录中创建的子目录继承。因此,这意味着,创建的任何文件都将通过目录的 setgid 位/var/grpdir
将其组设置为。sharing
此外,它将继承默认的 acl,这将覆盖默认的 linux 样式权限,因为我们没有为特定用户或组指定 ACL。这意味着所有文件都将以所有权<user>:sharing
和权限创建rw-rw----
。目录将是相同的,只是它们也将自己的默认 ACL 设置为与其父级 ( ) 相同/var/grpdir
,当然还为用户和组设置了可执行位。如果您从组中删除用户sharing
,他们将无法访问该目录(也无法访问其中的任何文件,即使他们拥有这些文件)。
与使用 cronjob 定期更正权限不同,权限始终保持同步,因为它们会与新创建的文件和目录一起自动更新。该解决方案是轻量级的;不需要守护进程,并且一举纠正权限时不会出现 IO 峰值。
答案3
我不知道有什么好的方法可以做到这一点。技术上最简洁的方法是使用 FUSE 文件系统来实现这一点。当然,如果还没有人这样做的话,还有很多工作要做。
备择方案:
使用桑巴舞。 samba有
force user
参数。您可以在本地导出目录并在本地挂载。不会使访问速度更快,但可能是可以接受的,因为仅涉及环回网络。使用非 Linux 文件系统,例如 FAT32。必须为某个用户进行配置才能安装它。访问权限必须由父目录处理。
答案4
您可以使用inotify 工具并编写一个简单的 bash 脚本,如下所示。 Inotify 将密切关注该目录网络每当发生类似事件时就做一些事情 目录创建将发生在 web 目录中。有许多事件存在。你可以用谷歌搜索或者看看这个地点
while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done