想象一个场景,其中您有一个父目录和一个子目录。在父目录中,您指定了组 rwx。在该目录下有一个目录,其中组权限为 --- (因此没有权限。)这安全吗?为什么或者为什么不?
这种设置立刻让我觉得不安全;我最初的想法是,由于组拥有父目录中的所有权限,因此他们可以更改子目录的权限。但当我们测试这个理论时,它不起作用。我创建了一个目录 Test 并使用chmod 777 Test
;更改了权限然后,在该目录中,我创建了一个目录 ChildTest 并设置权限chmod 700 ChildTest
,从而设置问题中的参数。然后我的朋友 cd 进入我的 Test 目录并尝试了几种不同的方法来尝试访问 ChildTest:(我们的 HP/UX 环境使用 ksh)
cp -R ChildTest ~
chmod 777 ChildTest
mkdir New
mv ChildTest New # (also tried this with cp)
这一切的失败都是因为他不拥有ChildTest
。所以我们想也许它比我们想象的更安全。我们询问了教授,他再次提到了它根本不安全的事实,但除了“你需要两个人一起做,因为它太容易改变你自己的权限”之外,没有给我们任何信息。 “(这真的让我们很困惑,因为……我们是?)
所以无论如何,我确信这种设置实际上并不安全,但我只是不知道如何证明它。我不希望得到答案,但也许只是朝着正确的方向推动或确认我走在正确的轨道上就很好了。
答案1
事实上:您无法更改子目录的权限,因为权限存储在每个文件/目录中,即所谓的“inode”中。在这方面它是安全的。
但是姓名子目录的名称存储在父目录中,因为目录是一个特殊文件,其中包含它所包含的文件(以及子目录)的名称。在父目录中,每个用户/组都具有写入权限。
因此,不拥有子目录的用户可以改名它,或者消除子目录(如果为空)。在某些系统上甚至可能是搬家了到他/她具有写入权限的另一个目录(如果位于同一文件系统中)。
答案2
通过 POSIX,更改子目录权限应该不起作用:
只有有效用户 ID 与文件的用户 ID 匹配的进程或具有适当权限的进程才被允许更改文件的文件模式位。
但重命名应该可以工作,它只需要对包含目录的写访问权限:
(root) /tmp# mkdir -p one/two; chmod 0777 one; chmod 0700 one/two
(user) /tmp/one$ mv two three && echo ok
ok
不过至少在 Linux 上,设置粘性位可以防止这种情况发生,因为它将防止删除不属于您的文件和目录:
(root) /tmp# chmod +t one
(user) /tmp/one$ mv three four
mv: cannot move 'three' to 'four': Operation not permitted
我坦率地承认,我不知道任何会影响此问题的 HP-UX 特定功能。
有人可以重命名子目录的问题有多大取决于您对这些目录所做的事情。仅有权访问顶级目录的用户无法读取子目录中的任何文件,因此从这个意义上说您是安全的。但由于他们可以重命名并重新创建具有相同名称的目录,因此他们可以模仿应该存在的任何内容。
如果某些外部服务读取子目录中的文件,那就很重要了。想像crontab
保存文件的目录;您不希望任何人能够crontab
以其他人的名义创建 。