我正在做一个练习任务,我需要在Linux(Ubuntu)中设置适当的文件(和目录)权限,但我遇到了一些我不理解的奇怪行为。
我已经以 root 用户身份完成了这些操作:
对于/shared我已将目录权限设置为1755,
ls -l
显示drwxr-sr-t。该目录位于 root:root 下。
添加了一个文件:/shared/rnd/rnd-test
对于/shared/rnd及其内容,我已将目录权限设置为3770(使用
chmod -r
),并且ls -l
显示了drwxrws--T。该目录以及 rnd-test 都位于 root:rnd。
trent 是 rnd 组的用户(通过
id trent
确认)。id walter
确认)。
作为 trent,创建了一个名为 trent-test 的文件。
作为 walter,创建了一个名为 walter-test 的文件。
现在
ls -l /shared/rnd
看起来像这样:与trent一样,
cat rnd-test
没有错误。cat rnd-test
没有错误。
与trent一样,
echo 'trent' >> rnd-test
没有错误。 echo 'trent' >> walter-test
的许可被拒绝。
与walter一样,
echo 'walter' >> rnd-test
没有错误。 echo 'walter' >> trent-test
的许可被拒绝。
作为root,
echo 'root' >> rnd-test
没有错误。 echo 'root' >> trent-test
的权限被拒绝。 echo 'root' >> walter-test
的权限被拒绝。
根据这些要求,我为
/shared设置
0755
,为 /shared/* 设置
3770
。
事实上,要求并没有指定组成员是否应该能够修改组文件,但我不清楚为什么trent可以修改rnd-test(由root:rnd拥有)但不能修改walter-测试(由 walter:rnd 所有)。
如果我将 /shared/rnd 权限设置为 1770 或 3770(带有粘性位),他们将无法修改(追加)。
如果我将 /shared/rnd 权限设置为 0770 或 2770(没有粘性位),trent 和 walter 能够分别修改(追加)walter-test 和 trent-test .
我知道某些工具(例如
vim
)在尝试“修改”时会首先删除文件,但是 echo >>
也这样做吗?
@grifferz提到Linux最近的变化进一步阻止了用户写入其他用户的文件,即使他们位于同一组中。
此保护类似于 protected_fifos,但它 避免写入攻击者控制的常规文件,其中程序 预计会创建一个。
根据
fs.protected_regular
文档,当 protected_regular
设置为 2
(我的系统有)时,它也适用于组可写粘性目录。
我将其更改为
0
,粘性位的行为就像它“应该”那样。
至于“可写”/shared/rnd/rnd-test(由root拥有),那是因为/shared目录设置了
1755
权限。我不知道为什么,但它神奇地让我能够编写rnd-test。当我将其权限更改为 protected_regular
时,它就变得不可写(在
0755
更改之前)。