setfacl:如何授予用户对目录现有和未来文件的权限?

setfacl:如何授予用户对目录现有和未来文件的权限?

操作系统:debian:bullseye(docker 镜像)。

我正在尝试做的事情:

我有一个 websockets 服务器,它创建一个 unix 套接字并对其进行侦听。我正尝试在此之前设置 nginx。我正尝试nginx为 nginx 设置一个用户,并授予它对我的项目根目录 ( app) 的权限,这样nginx用户就可以访问此目录中已经存在的任何内容(html 文件)以及将要创建的任何内容(套接字)。

未按预期运行的情况:

我正在我的项目根目录上运行它(app):
useradd nginx && setfacl -Rm d:u:nginx:rw,d:g::rw,d:m::rw .

因此,正如预期的那样,默认值设置正确:

root@fa9b4cc3f531:/app# getfacl .
# file: .
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:nginx:rw-
default:group::rw-
default:mask::rw-
default:other::r-x

并且touch文件也会产生预期的权限:

root@fa9b4cc3f531:/app# touch foo
root@fa9b4cc3f531:/app# getfacl foo 
# file: foo
# owner: root
# group: root
user::rw-
user:nginx:rw-
group::rw-
mask::rw-
other::r--

当我以编程方式创建 unix 套接字时:

# app/main.py

import websockets
# ...
async with websockets.unix_serve(room.handle_connection, "my-sock.sock"):
    await asyncio.Future()

创建的 sock 文件含有意外的掩码:

root@fa9b4cc3f531:/app# getfacl my-sock.sock 
# file: my-sock.sock
# owner: root
# group: root
user::rwx
user:nginx:rw-                  #effective:r--
group::rw-                      #effective:r--
mask::r--
other::r-x

它是如何/为何计算的mask::r--

答案1

IIUC,umask 控制新文件的权限,但不应对 ACL 计算的掩码产生影响

一般来说是的,但也有一些复杂情况。

默认 ACL 确实会覆盖进程级 umask,但是不要覆盖创建文件时指定的“最大模式”。例如,open("/app/foo", O_CREAT, 0640)通常会创建一个具有0640 & ~umask作为结果模式的文件。当涉及 ACL 时,结果模式似乎会变成(在此示例中)0640 & acl_mode——尽管我尚未检查代码中的逻辑。

因此,如果一个程序明确要求创建一个最大模式为 0600 的文件,则 umask也不默认ACL将添加新的权限。

套接字增加了另一个复杂性。与 open() 不同,用于监听地址的 bind() 调用(这会导致创建 Unix 套接字“文件”)没有办法让程序指定所需的最大模式。因此,0666 & ~umask始终将用作所需模式(如 unix(7) 手册页中所述)——这就是与上述默认 ACL 模式相结合的结果,即套接字始终变为(0666 & ~umask) & acl_mode

注意:我还没有查看内核源代码来验证这个逻辑。

相关内容