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