允许非root应用程序修改/ etc

时间:2017-01-05 08:32:27

标签: c linux

我正在尝试为网络和其他一些在linux上运行的嵌入式设备的东西配备一个几乎无懈可击的配置器。应用程序在root运行时保存到/ etc / network / interfaces而没有问题,但返回"分段错误"由标准用户运行时。 strace回来了:

  

打开(" / etc / network / interfaces",O_WRONLY | O_CREAT | O_TRUNC,0666)= -1 EACCES(权限被拒绝)   --- SIGSEGV {si_signo = SIGSEGV,si_code = SEGV_MAPERR,si_addr = 0} ---

如何允许任何人启动它并写入/ etc / network / interfaces?

保存到文件的代码:

            FILE *saveFile;
            saveFile = fopen("/etc/network/interfaces","w");
            // loopback
            fprintf(saveFile, "auto lo \niface lo inet loopback\n\n");
            // eth0
            fprintf(saveFile, "auto eth0\niface eth0 inet static\n\taddress %s\n\tnetmask %s\n\tgateway %s\n",
                    address,netmask,gateway);
            fclose(saveFile);

3 个答案:

答案 0 :(得分:1)

  

如何允许任何人启动它并写入/ etc / network / interfaces?

嗯...通过给/ etc / network / interfaces上的任何人提供写权限?

答案 1 :(得分:1)

在您发表评论之后,您的要求是允许非root用户执行需要root权限的特定管理任务。传统的方法是使程序由root和setuid拥有。现在这已经过时了,因为应该针对任何潜在的安全问题彻底审查setuid程序(su或sudo):缓冲区溢出或其他允许以root身份执行任意代码 。 / p>

对于您的示例,如果它是一个简单的程序,它可能有意义,但至少应该测试每个操作(此处fopenfwrite)的返回值!

现在推荐的方法是使用sudo并在/etc/sudoers文件中设置特定条目,以允许任何用户(或特定的组和/或用户列表)执行该特定条目以root身份命令。实现几乎与setuid命令相同但提示用户输入他/她的密码以注意他/她的管理任务:

ALL local_host_name = (root) /full/path/to/command

但是sudoers语法允许更精细的授权。

(注意:你仍需要两次控制你的代码)

答案 2 :(得分:0)

你可以尝试这样的事情:

  • 安装sudo
  • 创建新用户
  • 仅为您的程序提供新用户的sudo权限。

这样,当人们尝试执行除程序之外的任何命令时,它将被拒绝。

现在,您的程序将以sudo rigth运行,因此请确保您的程序不能被其他程序(如chmod 700和chown root)修改或替换,并确保您的程序不会弄乱/ etc / network / interface < / p>