【问题标题】:Network capabilities for Application应用程序的网络功能
【发布时间】:2012-01-20 08:08:35
【问题描述】:

我正忙着在 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

【问题讨论】:

    标签: c++ linux privileges linux-capabilities


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      因此,使用该命令设置相应的能力,它会以普通用户身份运行,甚至不需要root。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 2010-11-18
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多