我编写了一个 C 程序,它创建一个文件“abcd.txt”并将一些数据写入其中。我通过使用用户名“bobby”登录来执行我的代码,因此创建了文件 abcd.txt,所有者为 bobby。
但是我的任务是,即使我使用一些用户名“bobby”执行我的代码,文件也应该始终以所有者身份创建。有人可以帮我说这怎么可能吗?
作为一般原则,当您正在编写文件或对文件执行 chown(2) 时,您需要有效的 uid(euid 是 root)。
如果您在 Linux 下执行此操作,则可以使用特定于 linux的方法。
这是旧的 UNIX DAC 方法,它充满了危险。它假定您没有sudo
安装或无法安装它。
您的可执行文件应归 root 所有,并设置了可执行文件 setuid 位。
您应该使用 seteuid() 将您的权限从 root 删除到 bobby 进行大部分操作,包括写入。完成后,使用 seteuid(0) 将您的权限级别恢复为 root 并对文件执行 chown()(或 fd 上的 fchown)以将其所有权更改为 root。
为安全起见,请将其设置为您的可执行文件归 root:safegrp 所有,其中“safegrp”是允许执行此文件的用户唯一的组名(将 bobby 添加到 safegrp);并确保 setuid 可执行文件的模式为 4510 ;
如果 sudo 在您的系统上可用,则按照与上述相同的过程处理可执行文件中的权限,但不要将文件模式设置为 setuid,已safegrp
为此可执行文件添加到 sudoers,现在 bobby 可以使用 sudo /your/bin 运行它/前卫
可以对文件使用 POSIX.1e 功能支持进行更严格的控制。在您的情况下,您希望将 SYS_CHOWN 授予您的程序;
出于安全原因,我可能会将其设置为完全独立的二进制文件或子进程,并且仍然使用 sudo 并执行适当的权限删除。
linuxacl [在 Linux 上使用访问控制列表的 ACL] 有关于这个主题的优秀教程
您可以使用强制访问控制来限制对这种危险二进制文件的访问,但 SE linux 配置起来很痛苦:^) 虽然可能是一个好方法
您可能不想以 root 身份运行您的程序,除非您真的必须这样做。也许在运行程序后从 shell 脚本运行“chown”?或者,您可以使用chown(2)
以 root 身份运行的程序(或在 linux 上具有同等功能)。
使用 chown() 方法。可能有更权威的链接,但这个很好,因为它包括对 getpwnam() 的调用。我过去已经完成了所有这些,但不幸的是我仍然没有代码(它归 IBM 所有)。