禁止创建目录但允许创建文件

acv*_*cvF 5 linux permissions directory selinux samba

我有一个通过 Samba 共享的目录。我希望用户能够创建/修改/删除文件但不能创建/擦除目录。我还没有找到办法做到这一点。也许用 SELinux?但是如何?

Hau*_*ing 8

优雅的方式是使用richacls。但这还不是内核的正式部分,因此您可能难以使用。

一个简单的解决方法是使用 samba 参数directory mask并将force directory security mode新创建的目录呈现给用户无用(无法访问),以便他们学会不创建目录。

有趣(且可移植!)的方法是创建如此多(不可见)的子目录,以致达到文件系统的子目录限制。如果需要一个新的子目录,管理员只需重命名其中一个。


Sté*_*las 7

你可以做的是使用FUSE文件系统就像bindfs在组合与LD_PRELOAD劫机者是禁用mkdirrmdir系统调用。就像创建一个wrapper.c文件:

#include <errno.h>
int mkdir() { errno = EPERM; return -1; }
int rmdir() { errno = EPERM; return -1; }
Run Code Online (Sandbox Code Playgroud)

编译它:

gcc -fPIC -shared -o wrapper.so wrapper.c
Run Code Online (Sandbox Code Playgroud)

并运行:

LD_PRELOAD=$PWD/wrapper.so bindfs the-dir the-dir
Run Code Online (Sandbox Code Playgroud)

它将安装the-dir在自身上,但不能创建或删除目录。

不过,您仍然可以重命名目录。


Sté*_*las 5

在 Linux 和 ext4 文件系统上,防止创建目录(而不是其他类型的文件)的一种巧妙方法是依靠新创建的目录从其父目录继承默认ACL 条目(除了相应的非 ACL 条目)这一事实。 -默认 ACL 条目),而文件仅被分配相应的非默认 ACL 条目,并且至少在 ext4 上,每个 inode 只有有限的空间用于存储这些 ACL 条目。

\n\n

因此,如果您用默认 ACL 条目填充目录的空间,您仍然可以在其中创建文件,但不能创建目录,因为系统将无法同时创建默认 ACL 条目和非目录条目。 -默认 ACL 条目:

\n\n
$ i=50000; while setfacl -m "d:u:${i}:-" .; do i=$((i + 1)); done\nsetfacl: .: No space left on device\n
Run Code Online (Sandbox Code Playgroud)\n\n

(该循环的退出条件是 setfacl 失败时(此处在 ENOSPC 上,因为无法添加更多 ACL 条目))。

\n\n
$ getfacl . |  grep -c default:\n507\n
Run Code Online (Sandbox Code Playgroud)\n\n

添加了 507 个默认 ACL 条目(有效拒绝用户 50000 到 50506 访问其中创建的任何文件和目录)。

\n\n
$ touch file\n$ mkdir dir\nmkdir: cannot create directory \xe2\x80\x98dir\xe2\x80\x99: No space left on device\n$ ls -l\ntotal 4\n-rw-r--r--+ 1 chazelas chazelas 0 Nov 27 13:35 file\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至root无法在那里创建目录:

\n\n
$ sudo mkdir x\nmkdir: cannot create directory \xe2\x80\x98x\xe2\x80\x99: No space left on device\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这并不能阻止用户删除或重命名其中的目录(如果在添加这些默认 ACL 之前已经创建了一些目录)。

\n

  • 这是可耻的! (2认同)