扩展 ACL 并不总是被继承

Sco*_*ack 6 linux access-control-list

我有一个应用程序生成报告文件/opt/reports,文件在 0600 拥有 root:root 。为了允许外部系统自动处理这些报告,我创建了一个新的服务帐户用户,组为“报告”,将组更改为/opt/reports报告并设置 SUIG 位,然后在/opt/reports目录上设置默认 ACL以包含 400 的报告组和 400 的掩码。

我注意到,当我手动创建文件时,权限都按预期设置,但是当应用程序创建文件时,不会继承默认值。

[root@reports1 ~]# getfacl /opt/reports
getfacl: Removing leading '/' from absolute path names
# file: opt/reports
# owner: root
# group: report
user::rwx
group::r-x
other::r-x

[root@reports1 ~]# setfacl -R -d -n -m g:report:r,m::r /opt/reports/
[root@reports1 ~]# getfacl /opt/reports
getfacl: Removing leading '/' from absolute path names
# file: opt/reports
# owner: root
# group: report
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x              #effective:r--
default:group:report:r--
default:mask::r--
default:other::r-x
Run Code Online (Sandbox Code Playgroud)

手动创建文件似乎工作正常

[root@reports1 ~]# echo "This is a test file" > /opt/reports/testfile.txt
[root@reports1 ~]# ls -l /opt/nessus_reports/testfile.txt
-rw-r--r--+ 1 root report 20 Apr 24 11:16 /opt/reports/testfile.txt
[root@reports1 ~]# getfacl /opt/reports/testfile.txt
getfacl: Removing leading '/' from absolute path names
# file: opt/reports/testfile.txt
# owner: root
# group: report
user::rw-
group::r-x                      #effective:r--
group:report:r--
mask::r--
other::r--
Run Code Online (Sandbox Code Playgroud)

但是,当使用应用程序生成报告时,掩码确实会传播到新文件中

[root@reports1 ~]# ls -l /opt/reports/018b274b-7c21-859d-6295-1af24b14da8451d8fe886e9c192d
-rw-------+ 1 root report 125952 Apr 24 11:18 /opt/reports/018b274b-7c21-859d-6295-1af24b14da8451d8fe886e9c192d
[root@reports1 ~]# getfacl /opt/reports/018b274b-7c21-859d-6295-1af24b14da8451d8fe886e9c192d
getfacl: Removing leading '/' from absolute path names
# file: opt/reports/018b274b-7c21-859d-6295-1af24b14da8451d8fe886e9c192d
# owner: root
# group: report
user::rw-
group::r-x                      #effective:---
group:report:r--                #effective:---
mask::---
other::---
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗,我只是误解了所涉及的术语?我是否错过了某个标志或选项,我是否完全从错误的方向接近它?

dar*_*agn 0

这是默认行为,因为文件在创建时具有创建它们的用户的用户:组关联。不过,仍然有希望。您只需确保应用程序运行时,它是由将报表组作为主要组的用户运行的。有很多关于如何做到这一点的例子。如果您查看 /etc/init.d 中的一些脚本,几乎所有脚本都会在启动服务时执行此操作。祝你好运!(顺便说一句,这表明您是 Windows 管理员,因为子对象的整个继承权限是 Windows 样式权限的默认设置,因此在文件上切换到 unix 样式 acl 可能会有点棘手。)