我真的需要递归 chmod 来限制对文件夹的访问吗?

cle*_*sch 52 linux permissions chmod

如果我想限制secret对共享机器上文件夹的访问,我真的需要chmod对文件夹进行递归吗?

chmod -R g=,o= secret
Run Code Online (Sandbox Code Playgroud)

还是chmod放在文件夹上就足够了?

chmod g=,o= secret
Run Code Online (Sandbox Code Playgroud)

有什么实际区别?

xen*_*oid 74

对于目录,“读取”访问允许您列出内容,“执行”访问允许您遍历目录以打开其子目录之一(文件或子目录)。所以如果你删除:

  • 只是读取权限,人们仍然可以通过猜测他们的名字来访问子目录
  • 只是执行标志,人们仍然可以列出内容的名称,即使他们无法访问它们,这仍然可以揭示
  • 目录上的读取和执行权限,它下面的任何内容都无法访问,并且您不需要进行递归更改。

当然,如果您进行递归更改,则对顶级目录的访问权限的意外非递归重置会产生较小的后果。

  • 因此,对标题问题的简短回答是“不,您不知道,只需`chmod`'ing 顶级文件夹就足够了”? (2认同)

G-M*_*ca' 46

不用说,如果您在两天前创建了一个文件(使用公开可读模式),而昨天有人阅读了该文件,或者复制了该文件,那么今天您无法将该文件设为私有。

xenoid 说(有点简单),如果你从你的目录中删除组和其他权限(今天,现在),“它下面的任何东西都变得无法访问,你不需要进行递归更改。” 我同意,如果您chmod适当地使用您的(顶级)目录, 那么将来(即从现在起),除了您自己1 之外,没有人能够进入它。但是有一些问题。

硬链接

还记得你两天前创建的文件吗?假设你的对手昨天对那个文件做了一个硬链接(而不是复制它)。如果您chmod只是您的(顶级)目录,那么该文件将继续具有您在创建它时分配的公开可读权限,因此坏人将来仍然可以读取它——(可能)即使你随后修改它。如果您执行递归chmod,这将保护文件的权限, 这将影响链接。  坏人仍然可以ls -l对它进行操作,因此他们将能够看到您何时更改它以及它有多大,但他们将无法再次阅读。

工作目录

假设在您的secret目录下,您有一个 plans目录,并且它也是公开可读的。假设五分钟前,坏人打开一个终端窗口说

cd /home/clemisch/secret/plans

现在,在您执行chmodon 之后secret,坏人的工作目录还在吗?/home/clemisch/secret/plans,他们可以继续列出该目录并访问那里的文件,可能永远。当然,一旦他们cd在别处,或者关闭那个窗口,或者注销,或者机器重新启动,他们就会失去访问权限。

如果您执行递归chmod,这将保护所有文件和所有目录的权限,导致占用者立即失去访问权限。

如果机器是一台只能通过控制台访问的个人计算机,这可能不是一个很大的风险。但是,如果坏人可能在后台留下了一个 screen或 tmux会话,那么他们可以使用这种攻击。而且,如果机器支持ssh (或其他远程访问;甚至 FTP 就足够了),则可以使用这种攻击。

人为错误

正如 xenoid 在他们的回答中指出的那样:如果您chmodsecret今天进行递归,然后在后天您不小心 chmod(仅)将顶级目录返回到 755,那么您仍然会受到今天递归的保护chmod- 所有文件和下的目录secret仍然无法读取。(当然,如果你明天创建一个文件secret,并允许它公开可读,那么当你打开secret目录的权限时它就会暴露。但无论今天是否chmod递归,这都是正确的。 )

mazunki发表评论,“我相信cp有权限。” 我不确定他们的意思,但请考虑这种情况。你想diff在两个文件之间做一个:

  • secret/plans/the/quick/brown/fox/file1
  • secret/jumps/over/the/lazy/dog/file2

但是您不确定这些文件的确切位置,您必须四处寻找它们。你可能很想这样做

cd plans
cd the/quick                            # looking for file1
cd brown/fox                            # found it!
cp file1 /tmp
cd ../../../../..
cd jumps/over
cd the                                  # looking for file2
cd lazy/dog                             # found it!
diff /tmp/file1 file2
Run Code Online (Sandbox Code Playgroud)

如果你这样做,那么/tmp/file1将有相同的保护secret/plans/the/quick/brown/fox/file1——所以这是chmod今天进行递归的另一个原因。

还有一件事

如果坏人五分钟前开了你的秘密文件之一,并保持它打开,他们将能够在未来阅读-潜在的,即使你修改它。好消息是,这是一个有点棘手的攻击——在你执行chmod. 坏消息是这种攻击很难防御——递归 chmod 无济于事。
__________
1,当然还有特权用户?/?进程

PS 你可以稍微缩短你的命令: chmod go=相当于chmod g=,o=. (当然,这不会使递归chmod更快。)

  • 硬链接部分很有趣。即使在目录权限更改后,有人是否有可能猜测 inode 编号并创建硬链接? (5认同)
  • @allo:好问题。我很确定没有程序或系统调用可以让您仅通过知道 inode 编号来创建链接。如果用户具有对磁盘的完全访问权限(即对`/dev/sda1` 的读/写访问权限,或其他任何内容),他们可能可以使用十六进制编辑器或文件系统编辑器(如 [debugfs](http ://man7.org/linux/man-pages/man8/debugfs.8.html))。但这没有实际意义;对磁盘具有完全读取权限的任何人都可以读取任何文件;这就是为什么该访问权限通常只授予 root 用户(可能还有一些其他系统服务)。 (2认同)