应用程序的网络功能

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) 启用沙盒网络功能?

TCP/IP有哪几层,各层的功能是啥?

在网络应用程序中,即使我不在网页上,是不是有任何方法可以在特定时间运行功能?

Linux运维之NFS网络文件系统功能介绍及应用场景

Python 的网络传输文件功能的设计与实现

谷歌文档 + 网络应用