fedora 21 允许用户覆盖他无权访问的文件

fedora 21 允许用户覆盖他无权访问的文件

我在两台 Fedora 21 机器上重现了这个问题。

我希望它sqlite3不写入~/.sqlite_history文件。我找不到选项,但说,没关系,我会让它不能写入。

然而它仍然可以写入而我却不明白。

~$  which sqlite3
/usr/bin/sqlite3
~$  ls -l /usr/bin/sqlite3
-rwxr-xr-x. 1 root root 69456 Nov 25 12:00 /usr/bin/sqlite3
~$  ls -l .sqlite_history
ls: cannot access .sqlite_history: No such file or directory
~$  touch .sqlite_history
~$  sudo chown root .sqlite_history
[sudo] password for emmanuel:
~$  sudo chmod 600 .sqlite_history
~$  sudo chgrp root .sqlite_history
~$  ls -l .sqlite_history
-rw------- 1 root root 0 Jan  7 08:45 .sqlite_history
~$  whoami
emmanuel
~$  groups
emmanuel wheel
~$ echo test > .sqlite_history 
bash: .sqlite_history: Permission denied
~$  sqlite3 test.db
SQLite version 3.8.7.2 2014-11-18 20:57:56
Enter ".help" for usage hints.
sqlite> select * from server;
Error: no such table: server
sqlite>
~$  cat .sqlite_history
select * from server;
~$  ls -l .sqlite_history
-rw------- 1 emmanuel emmanuel 22 Jan  7 08:45 .sqlite_history
$ mount | grep home
/dev/sda7 on /home type ext4 (rw,relatime,data=ordered)

我也尝试了符号链接/dev/null,但在这种情况下,sqlite3 只是覆盖了文件?发生了什么?sqlite 怎么会覆盖该文件?

我检查了ls二进制文件sqlite3,发现它确实不是 suid root,但事实并非如此。我不明白。

答案1

它无法写入该文件,但假设它可以写入该目录,它就可以删除该文件并创建一个新文件。

在 Linux 权限模型下,您无需能够写入文件即可将其删除,因为删除文件不会以任何方式更改它 - 它会更改包含该文件的目录。因此,您需要能够写入目录才能删除文件。

答案2

尝试使用“sudo chattr +i /.sqlite_history”,这将阻止任何人(甚至是 root)修改目标文件。i 代表“不可变”,通常用于防止 DHCP 覆盖 /etc/resolv.conf

这应该能帮你解决问题。更多信息:“man chattr”。这是一个可以让你设置各种奇妙的文件属性的工具!

祝你好运

相关内容