应用程序的网络功能

问题描述 投票:0回答:2

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

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

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

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

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

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

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

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

c++ linux privileges linux-capabilities
2个回答
0
投票

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.