应用程序的网络功能
Posted
技术标签:
【中文标题】应用程序的网络功能【英文标题】:Network capabilities for Application 【发布时间】:2012-01-20 08:08:35 【问题描述】:我正忙着在 Linux 计算机上用 C++ 开发一个应用程序。该应用程序使用使用以太网适配器和网络的第 3 方库。该库是 GigE Vision 相机的库。在启动时,我的应用程序尝试连接到相机,然后它返回有关相机的信息,然后它开始将视频流式传输到应用程序。
一段时间后,应用程序无法连接或从摄像头获取摄像头信息,但以 root (sudo) 身份运行应用程序可以解决问题。
我已经联系了图书馆的供应商,他们表示我应该做以下事情:
感觉以 root 身份运行会损害其系统安全性的用户可能会觉得以下实现令人满意:
将可执行文件所有者设置为 root。 在可执行文件上设置“setuid”权限位 在代码中,当应用程序启动时,使用 capset() 释放除这些权限之外的所有权限:CAP_SYS_NICE、CAP_NET_ADMIN、CAP_NET_BROADCAST、CAP_NET_RAW 应用程序将以所有 root 权限启动,但在启动后会立即删除它们。
这确实有效,但在不更改可执行文件的情况下,我是否有另一种方法可以做到这一点?我正在考虑将我的用户添加到允许我访问这些权限的某个组中,我们将不胜感激。
上述解决方案并不是最优的,因为每次编译后我都需要更改所有者并设置权限。该应用程序用于录制视频和捕获图像。对于上述解决方案,这些记录和捕获也归根用户所有,并且在分发文件时需要将用户改回。
操作系统:Ubuntu Linux 11.10 环境:C++ 和 Qt
【问题讨论】:
【参考方案1】:听起来图书馆正在做一些实际上需要root权限的事情。
也许最简单的解决方案是在您的构建过程中添加权限(例如您的Makefile
)。
部分解决此问题的一种方法是将您的程序拆分为两个程序,一个使用库与相机通信,另一个用于用户界面,通过套接字或管道与接口程序通信。这样,您只需在更改界面程序时更改权限。对于setuid
程序,这通常也是一个好主意——您有一个具有提升权限的小型包装程序,而较大的 GUI 程序在没有扩展权限的情况下运行。审计setuid
程序会更容易,特别是如果它可以变得非常简单的话。
【讨论】:
【参考方案2】:您确实可以手动设置所需的功能,使用 setcap()
作为 root。
因此,使用该命令设置相应的能力,它会以普通用户身份运行,甚至不需要root。
【讨论】:
以上是关于应用程序的网络功能的主要内容,如果未能解决你的问题,请参考以下文章
我是不是需要为 macOS 应用内购买 (IAP) 启用沙盒网络功能?