我编写了一个 C 程序,它创建一个文件“abcd.txt”并向其中写入一些数据。我通过使用用户名“bobby”登录来执行我的代码,因此创建了文件 abcd.txt,所有者为 bobby。
但我的任务是,即使我使用某个用户名“bobby”执行我的代码,文件也应该始终以所有者为根创建。有人可以帮我说这怎么可能吗?
最佳答案
作为一般原则,在写入文件或对文件执行 chown(2) 时,您需要有效的 uid(euid 为 root)。
如果您在 Linux 下执行此操作,则可以使用 linux 特定方法。
通用解决方案
没有 sudo 的可用性
这是旧的 UNIX DAC 方法,充满了危险。它假定您没有安装或无法安装 sudo
之类的东西。
您的可执行文件应该由 root 拥有并且设置了可执行文件的 setuid 位。
过程
对于大部分操作,包括写入,您应该使用 seteuid () 将您的权限从 root 降低到 bobby。完成后,使用 seteuid(0) 将您的权限级别恢复为 root,并对文件执行 chown()(或 fd 上的 fchown)以将其所有权更改为 root。
一些基本的安全
为了安全起见,将其设置为您的可执行文件由 root:safegrp 所有,其中“safegrp”是允许执行此文件的用户所独有的组名称(将 bobby 添加到 safegrp);并确保 setuid 可执行文件的模式为 4510 ;
随着 sudo 的可用性
如果 sudo 在您的系统上可用,则按照与上述相同的过程处理可执行文件中的权限,但不要将文件模式设置为 setuid,将 safegrp
添加到此可执行文件的 sudoers 中,并且现在 bobby 可以用 sudo/your/bin/prog 运行它
Linux 特定解决方案
POSIX.1e
可以使用 POSIX.1e 功能支持对文件进行更严格的控制。在您的情况下,您希望将 SYS_CHOWN 授予您的程序;
出于安全原因,我可能会将其设置为完全独立的二进制文件或子进程,并且仍然使用 sudo 并执行适当的特权删除。
linuxacl [ACL Using Access Control Lists on Linux] 有关于这个主题的优秀教程
SE-Linux
您可以使用强制访问控制来限制对这种危险二进制文件的访问,但是 SE linux 很难配置 :^) 尽管可能是一个好方法
关于我们可以将权限从用户更改为 root 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16654654/