超级用户可以写入只读文件吗?

超级用户可以写入只读文件吗?

我在 FreeBSD 上偶然发现了令人惊讶的(对我而言)许可行为。假设我正在操作非根用户。我创建一个文件,将其权限设置为只读,然后尝试写入:

$ touch f
$ chmod 400 f
$ ls -l f
-r--------  1 user  wheel  f
$ echo a >> t
t: Permission denied.

到目前为止,一切都很好。现在我执行与 root 相同的操作,并将其写入文件中:

# ls -l f2
-r--------  1 root  wheel  f2
# echo a >> f2
# echo $?
0

这是一个错误还是预期的行为?我可以放心地假设这在任何 Unix 和 Linux 上都可以工作吗?

答案1

root能够以这种方式覆盖权限是正常的。

另一个例子是root能够读取没有读访问权限的文件:

$ echo hello > tst
$ chmod 0 tst
$ ls -l tst
---------- 1 sweh sweh 6 Aug 16 15:46 tst
$ cat tst
cat: tst: Permission denied
$ sudo cat tst
hello

有些系统有这样的概念不可变的文件。例如在 FreeBSD 上:

# ls -l tst
-rw-r--r--  1 sweh  sweh  6 Aug 16 15:50 tst
# chflags simmutable tst
# echo there >> tst
tst: Operation not permitted.

现在甚至root无法写入文件。但是,当然root可以消除旗帜:

# chflags nosimmutable tst
# echo there >> tst
# cat tst
hello
there

使用 FreeBSD,您可以更进一步设置内核标志以防止root删除该标志:

# chflags simmutable tst
# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1
# chflags nosimmutable tst
chflags: tst: Operation not permitted

现在没有人,甚至root不能更改这个文件。

(系统需要重新启动以降低安全级别)。

答案2

是的,这很正常。 root 对读/写没有限制(除了极少数例外),因为他是 root。

相关内容