应用程序的网络功能

时间:2011-12-14 14:45:46

标签: c++ linux privileges linux-capabilities

我正忙着在Linux计算机上用C ++开发应用程序。该应用程序使用第三方库,该库使用以太网适配器和网络。该库是GigE Vision相机的库。启动时,我的应用程序尝试连接到摄像头,然后返回有关摄像头的信息,然后开始将视频流传输到应用程序。

一段时间后,应用程序无法连接或从摄像头获取摄像头信息,但以root用户身份运行应用程序(sudo)可以解决问题。

我已经联系了图书馆的供应商,他们已经表示我应该做以下事情:

  

感觉以root身份运行的用户会损害其系统安全性,可能会发现以下实施方案令人满意:

     
      
  1. 将可执行文件所有者设置为root。
  2.   
  3. 在可执行文件
  4. 上设置“setuid”权限位   
  5. 在代码中,当应用程序启动时使用capset()释放除了这些权限之外的所有权限:CAP_SYS_NICE,CAP_NET_ADMIN,CAP_NET_BROADCAST,CAP_NET_RAW应用程序将以所有root权限启动,但它会在启动后立即删除它们。
  6.   

这确实有效,但在没有更改可执行文件的情况下,我没有其他方法可以做到这一点吗?我正在考虑将我的用户添加到允许我访问这些权限的某个组中,任何帮助都将受到赞赏。

上述解决方案并非最佳,因为每次编译后我都需要更改所有者并设置权限。该应用程序用于记录视频和捕获图像。对于上述解决方案,这些记录和捕获随后也由root用户拥有,并且在分发文件时需要更改用户。

操作系统:Ubuntu Linux 11.10 环境:使用Qt的C ++

2 个答案:

答案 0 :(得分:0)

您确实可以手动设置所需的功能,使用setcap()作为root。

因此,使用此命令设置适当的功能,它将作为普通用户运行,甚至不需要是root用户。

答案 1 :(得分:0)

听起来这个库实际上需要root权限。

对此最简单的解决方案是在构建过程中添加权限(例如您的Makefile)。

部分解决这个问题的一种方法是将程序拆分为两个程序,一个程序使用库与摄像机通信,另一个程序用于通过套接字或管道与接口程序通信的用户界面。这样,您只需在更改界面程序时更改权限。这对于setuid程序来说通常也是一个好主意---你有一个带有提升权限的小包装器程序,并且没有扩展权限的情况下运行的是更大的GUI程序。审核setuid程序会更容易,特别是如果它可以变得非常简单。

相关问题