我正在开发一个项目,其中可执行文件使用Linux POSIX capabilities而不是setuid root。到目前为止,我必须保持一个根shell打开,这样每次重新编译时我都可以重做setcap
命令,为可执行文件提供所需的功能,以便我可以测试结果。这变得乏味,再加上如果我希望其他人想要为项目的开发做出贡献,我将不得不想出更好的方法。
到目前为止,我已经提出了两种解决方法:
1)让一个make目标以root身份运行,以创建一个特殊的setuid程序,makefile将使用该程序为可执行文件提供功能。该程序将通过sed
修改的模板进行编译,以便只有在开发人员正在使用的非root用户使用时才会运行,并且只会修改开发人员拥有的文件(以及哪些文件位于开发人员拥有的目录,这些目录不是世界可写的。
这个问题是我使用GNU autotools来生成我的make文件,而我无法弄清楚如何让makefile在链接后的可执行文件上运行程序&之后#39;已被链接。我可以创建一个setcap-all
目标,其中包含所有可执行文件作为其依赖项,其中包含一个运行setuid程序的规则,但是如果这样,那么您就不能make executable-1
执行src
目标。你只想建立。
2)让一个make目标以root身份运行以创建一个setuid守护程序,该守护程序将使用inotify来监视{{1}}目录,并将该功能授予任何新的可执行文件(并且具有安全性考虑类似于#1)中的setuid程序。
我的问题在于,我无法弄清楚如何让构建系统自动透明地启动守护进程,再加上我的直觉,即在正确的构建系统中,这不是事情。
有没有更好的方法呢?
答案 0 :(得分:2)
也许我对这个问题感到有些困惑,但似乎你正在尝试使用构建系统来解决安装问题。
无论您是使用dpkg
,rpm
还是其他任何内容打包项目,都应该有一条规则来强制使用setcap
,这将设置已安装二进制文件的功能使用文件系统扩展属性(xattrs)。
# Post-install rule example
setcap cap_net_raw=+pe /usr/bin/installed-binary
但是,在安装系统守护程序时,您可能依赖init-script已具备所有功能,因此需要让您的进程放弃不需要的功能。