为什么 getfacl 从绝对路径名中删除前导 / ?

为什么 getfacl 从绝对路径名中删除前导 / ?

我正在学习 CentOS/Red Hat 6 的 ACL;当我getfacl使用绝对路径运行时,我得到输出:

getfacl:从绝对路径名中删除前导“/”

为什么需要这样做?在什么情况下需要使用-por--absolute-names开关?

我的 Wale Soyinka 和 Michael Jang 的书甚至没有提及这一点,我在手册页中没有看到任何线索,而且我似乎找不到任何直接解决此警告的网站。

答案1

从手册页getfacl

-p, --absolute-names
       Do not strip leading slash characters (`/'). The  default  behavior
       is to strip leading slash characters.

当您在不使用开关的情况下提供绝对路径时,会发出警告消息-p

当为命令提供绝对路径时,输出会有所不同getfacl

-p带开关:

$ getfacl /path/foo/bar
getfacl: Removing leading '/' from absolute path names
# file: path/foo/bar
[Output truncated...]

请注意,文件路径中的前导斜杠仅在-p使用开关时显示。

$ getfacl -p /path/foo/bar
# file: /path/foo/bar
[Output truncated...]

-p当您通过管道传输输出以进行进一步处理时,保留前导斜杠非常有用。

当为命令提供相对路径时,输出是相同的getfacl

$ getfacl bar
# file: bar
[Output truncated...]

没有变化:

$ getfacl -p bar
# file: bar
[Output truncated...]

答案2

我不认为“因为你没有使用'-p'标志“真正解释了目的的这个警告。

这些命令旨在实施细粒度的安全措施,显然考虑到传统 POSIX 权限允许的更强安全性。

因此,我会转而寻求安全理论:考虑每种情况下可能出现的问题,并选择“最安全”的默认值。

  1. 按预期使用相对或绝对路径:没问题。
  2. 应使用绝对路径时使用相对路径:不起作用,但不太可能导致安全漏洞。 (此外,可以简单地预先修复cd /。)
  3. 当应该使用相对路径时使用绝对路径。这就是此限制旨在强调的目的。

考虑一个项目安装脚本

setfacl -m u:1234:rw $project_dir/etc/passwd

现在想想如果有错误并且$project_dir是空的会发生什么。 (也许它应该被拼写为$projectdir,或者配置文件丢失,因此它从未被设置,或者存在其他类型的错误。)

同样的原理也适用于getfacl,因为它的用例之一是:

getfacl some/file | { make some changes } | setfacl -b -M- some/file

或同等地

getfacl some/file > aclfile
edit aclfile
setfacl -b -M aclfile some/file

也许更重要的是

getfacl some/file > aclfile
edit aclfile
setfacl --restore=aclfile

(请注意,在最后一种情况下,目标文件名是不是包含在setfacl命令行中;它是从 aclfile 中读取的。)

您可能会认为“它应该以与 、chmod、和相同的方式工作”,从某种意义上说您是对的:如果这些命令对未通知的绝对路径具有相同的限制,它们会更安全。chownchgrpinstall

但这些命令有着悠久的历史先例(主要是它们背后的 POSIX 标准),因此它们并不真正适合谈判,即使安全专家认为这是一个好主意。

这在其他地方并非没有先例。

rsync -R在接收端将路径视为相对路径,忽略前导/.

诸如cpio和 之类的归档器tar(以前用于包裹递送debrpm变得流行)可以选择修剪前导/,出于同样的原因,但具有相反的默认设置(关闭)。

相关内容