0

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

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

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

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

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

这确实有效,但是在不更改可执行文件的情况下,我是否有另一种方法可以做到这一点?我正在考虑将我的用户添加到允许我访问这些权限的某个组中,我们将不胜感激。

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

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

4

2 回答 2

0

听起来图书馆正在做实际上需要root权限的事情。

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

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

于 2011-12-14T14:58:54.623 回答
0

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

因此,使用此命令设置适当的功能,它甚至无需root用户即可以普通用户身份运行。

于 2011-12-14T14:53:43.240 回答