2011-12-14 127 views
0

我忙於在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 環境:C++使用Qt

回答

0

事實上,你可以設置用手所需的能力,使用setcap()爲根。

因此,使用此命令來設置適當的功能,它將以普通用戶身份運行,甚至不需要成爲root用戶。

0

聽起來像圖書館正在做的事情實際上需要root權限。

也許最簡單的解決方案是在構建過程中添加權限(例如您的Makefile)。

一個辦法解決這部分得到的是你的程序分成兩個方案,一個是使用該庫的攝像機通信,另一個用於與通過套接字或管道的接口程序進行通信的用戶界面。這樣,您只需在更改界面程序時更改權限。這也將是setuid方案總體好主意---你有提升的權限小包裝程序,較大的GUI程序沒有擴展權限運行。它會更容易審計setuid程序,尤其是如果它可以做得非常簡單。

相關問題