umask如何影响ACL?


12

有人可以向我解释umask如果激活了ACL,会如何影响新创建文件的默认掩码?是否有关于此的一些文档?

例:

$ mkdir test_dir && cd test_dir
$ setfacl -m d:someuser:rwx -m u:someuser:rwx .  # give access to some user
$ getfacl .
# file: .
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:someuser:rwx
default:group::---
default:mask::rwx
default:other::---
$ umask # show my umask
077
$ echo "main(){}" > x.c # minimal C program
$ make x # build it
cc     x.c   -o x
$ getfacl x
# file: x
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx           #effective:rw-
group::---
mask::rw-
other::---

我希望mask:rwx。实际上设置umask为例如027我得到了预期的行为。


使用077的umask,您将获得mask::rw-。但这不是您真正的问题,对吗?
slm

@slm这是我的问题的一部分。我想知道新文件的掩码如何取决于umask。我对077感到惊讶,但mask::rw-不是mask::rwx这是目录的默认掩码。
jofel 2013年

好的,我现在用示例更新我的答案,这些示例应有助于解决此问题。给我几分钟
slm

这个问题密切相关。
jofel

Answers:


10

我找到了这个示例,标题为:linux中的ACL和MASK。在本文中,以下示例得到了演示,我认为这有助于理解ACL的方式以及如何umask相互交互。

背景

在Linux系统上创建文件0666时,将应用默认权限,而在创建目录时,0777将应用默认权限。

示例1-文件

假设我们将umask设置为077并触摸一个文件。strace当执行此操作时,我们可以用来查看实际发生的情况:

$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile

在此示例中,我们可以看到系统调用open()是使用权限0666进行的,但是当umask 077内核随后应用时,将删除以下权限(---rwxrwx),rw-------也就是0600。

示例-2目录

可以将相同的概念应用于目录,除了默认权限为0777而不是默认权限为0666。

$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777)                  = 0
drwxr-xr-x 2 saml saml 4096 Jul  9 10:55 testdir

这次我们使用mkdir命令。mkdir然后,该命令称为系统调用mkdir()。在上面的示例中,我们可以看到该mkdir命令mkdir()以默认权限0777rwxrwxrwx)调用了系统调用。这次022删除了以下权限的umask (----w--w-),因此在rwxr-xr-x创建目录时,我们只剩下0755()。

示例3(应用默认ACL)

现在让我们创建一个目录,并演示将默认ACL应用于其中的文件以及其中的文件时会发生什么。

$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir

$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx          #effective:rwx
group::r-x          #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx      #effective:rwx
default:group::r-x      #effective:r-x
default:mask::rwx
default:other::r-x

现在让我们创建文件aclfile

$ strace -s 128 -fvTttto luvly touch acldir/aclfile

# view the results of this command in the log file "luvly"
$ less luvly

现在获得新创建文件的权限:

$ getfacl --all-effective acldir/aclfile 
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx          #effective:rw-
group::r-x          #effective:r--
mask::rw-
other::r--

注意面罩mask::rw-。为什么它mask::rwx不像创建目录时那样?

检查luvly日志文件以查看用于文件创建的默认权限:

$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>

这有点令人困惑。将掩码设置为rwx创建目录时,您希望创建文件时具有相同的行为,但这种方式行不通。这是因为内核open()使用默认权限调用函数0666

总结一下

  • 文件不会获得执行许可(屏蔽或有效)。不管使用哪种方法:ACL,umask或mask&ACL。
  • 目录可以获取执行权限,但这取决于设置屏蔽字段的方式。
  • 设置ACL权限下的文件的执行权限的唯一方法是使用手动设置它们chmod

参考文献


@jofel-让我知道这是否有意义。
slm

@sIm非常感谢您的详细回答。它使我更接近我的实际问题:chmod syscall中的组权限会影响文件的掩码(chmod("file",0760)-> mask:rwchmod("file",0770)-> mask:rwx)。也许我应该对此提出一个新的问题……
jofel

@jofel-是的,这听起来像是另一个问题。
slm

@sIm,它已经在这里回答
jofel

“在Linux系统上创建文件时,将应用默认权限0666 ...” -完全不对,因为这取决于创建的应用程序。
ilkkachu

2

为了安全起见,Linux操作系统不允许使用执行位自动创建文件。这是为了防止网络攻击者将程序写入此类文件并在他们访问您的服务器时执行它们。这只是安全预防措施。使用chmod实用程序创建文件后,您将永远不得不在文件上手动设置执行位

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.