操作系统: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
。
注意:我还没有查看内核源代码来验证这个逻辑。