我在 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。