有没有办法只允许单个主进程删除原始文件?
其他进程可以读取和修改它,但不能删除。我知道一个进程可以清空其内容,但这没有问题,因为这样的进程将通过人类交互访问它。
关键是,主进程一定不能失去对 inode 的访问。 Ext4就是这样吧?它不是关于绝对路径而是关于索引节点,对吧?
有些进程,为了提供安全写入,写入一个新文件,删除或重命名原始文件,然后将新文件重命名为原始文件并删除原始文件,但这会导致原始 inode 丢失,并且主进程不会尝试重新创建附加到文件时。 (该过程可以进行备份、比较并在同一个索引节点中写入新内容,但事实并非如此)。
主进程最终显然没有写入任何地方?
答案1
有没有办法只允许单个主进程删除原始文件?
不会。文件访问是通过用户 ID 和组 ID 进行的,而不是通过每个进程进行的。
当然,您可以为您的进程提供一个单独的组 ID 或作为其自己的用户运行它,这会将其与任何其他进程一样放在一个单独的“类别”中,并且允许您为其定义单独的权限。
没有问题,因为这样的过程将通过人类交互来访问它。
呃,这不太符合逻辑 - 交互式过程可能与非交互式过程完全相同,并且通常至少有同样多的错误;)
某些过程,为了提供安全写入,写入新文件,删除或重命名原始文件,然后将新文件重命名为原始文件并删除原始文件,
不!相反的情况发生:他们写入一个新文件,并将新文件重命名为旧文件的名称 - 这是原子的,这就是他们这样做的原因。旧文件永远不会被删除!在此过程中的每一刻,都会有一个名称正确的文件,不少于不少。
请注意,对于任何文件访问,您所做的任何事物但追加对于单个write
数据来说,这种原子替换是唯一安全的方法! (除非你想用锁定结构做一些非常时髦的事情;大多数文件格式甚至不允许这样的事情!)
所以,无论你认为你正在解决什么问题,它可能是好的,你需要找到一种不同的方法来实现你想要的。
将新内容写入同一个 inode 中
有时我希望“inode”这个词消失!它实际上只是文件系统磁盘格式的实现细节,用户应该使用它绝不 必须应对。这确实是事实:除非您正在开发文件系统,否则当您开始关心 inode 时,您可能做错了什么。
答案2
一个“显而易见”的答案是“通过默默无闻实现安全”(STO)——防止其他进程知道 姓名文件的。
这个问题缺乏软件架构的任何背景或全局。您对“主进程”一词的使用表明您有一个 家长打开文件并将文件描述符传递给的进程 孩子 进程。如果“其他进程”独立打开该文件,那么它们需要知道文件的名称,并且不能使用这种方法。同样,如果文件名是硬编码的并且“众所周知”,那么这种方法就没用了。
如果您有一个带有可变文件名的父/子体系结构,请对子进程保密该名称。
有可能 搜索对于一个文件,如果你知道它的索引节点号。您可以通过将文件放入不可公开读取的目录中来阻止该攻击媒介。
答案3
你可以这样做:
首先,您禁止所有其他进程(主进程除外)以任何类型写入您的文件,例如:
mv my_precious_file my_precious_file.original
其次,创建该文件的硬链接:
sudo ln my_precious_file.original my_precious_file.copy
第三,您允许不可信的子进程访问硬链接文件。
# DUMMY example, this is not code you shall execute,
# it's purpose is to show that a process might delete the original file,
# but now it can only delete the hard linked "copy" and not the "original"
# "Haha I'm a not trustworthly process." (Some people don't understand.)
cp my_precious_file.copy /dev/null && rm my_precious_file.copy
您的子进程仍然可以删除硬链接的“副本”,但“原始”仍将保持“不变”。
如果硬链接的“副本”已被“删除”,您只需“重新创建”它。