2016-04-21 83 views
0

我們有幾個硬件設備需要使用原始套接字與它們進行通信。爲了做到這一點,我們運行一個UDP代理將數據發送到設備。 UDP代理需要root權限才能運行。是否有啓動需要root訪問權限的服務的「最佳方法」?

使用REDHAWK啓動此服務有哪些選擇?它不應該在啓動時啓動,並且需要在需要時作爲波形的一部分理想地啓動。

回答

0

當他開發vsftpd FTP服務器時,克里斯埃文斯對此進行了很多考慮。特別是,他的design notes值得仔細研究。

簡而言之,軟件以root權限啓動,但立即創建一個非特權子進程,用於處理與外部世界的所有交互。子進程清理傳入的請求,並將它們傳遞給父進程。父進程也不信任由子進程發送給它的所有內容,並且只在確定沒有任何不良行爲發生時才採取請求的操作。

由於外部用戶只能與子進程進行交互,因此破壞父進程的特權狀態要困難得多。

+0

我不會反對票,但這個問題沒有任何關於設計和一切辦通過紅鷹框架啓動服務。 –

+0

@SirBedevere我曾假設你打算使用某種音頻 - 二進制轉換工具將外部無線電信號轉換爲軟件指令。如果是這樣,那麼用這樣的措施來保護你的應用程序肯定是值得的。用於與您的軟件進行通信的協議在這方面與此無關。 –

0

這確實兩個部分你的問題,通用Linux一個有幾個可能的答案:

  1. 貴UDP代理真的需要root?如果您可以使用1024以上的端口,那麼您的進程不需要特權訪問。
  2. 或者,您可以通過IPC機制來做特殊的事情,如端口轉發和在特許和非特權流程之間共享責任。

我想你的問題的第二部分是你真正關心的問題,而且對谷歌來說更難,在Redhawk中看起來如何? Redhawk進程通常在用戶登陸時執行,但底層傳輸omniORB作爲Linux服務運行,並需要root訪問權限來配置/啓動/停止。我還沒有看到一個人從一個沒有特權的普通安裝中用root執行單個Redhawk進程的例子,所以我不確定這是如何工作的。我不建議將Redhawk整體安裝爲root權限,因爲這是一種公然的安全風險,完全沒有必要。在任何情況下,您整合代理服務的方式大致如下:

  1. 如果您有源代碼到您的代理服務器,您可以將其移植到Redhawk設備塊中粗略地表示您連接的外圍設備(通常是SDR)的應用程序級設備驅動程序。每個Redhawk設備都有一個tx/rx線程和幾個標準函數/ API,可以用來控制它的狀態。這將是最自然的進口方式。
  2. 如果你沒有源代碼,或者代理已經有它自己的API,你可以#包括在Redhawk設備中,只需編寫粘合代碼來轉換成Redhawk API。這與USRP_UHD設備相似,因爲它基本上使用UHD庫作爲「子」接口。如果您確實需要獲得代理的特權訪問權限,這也可能會有所幫助,因爲您可以將其保留爲特權服務,並僅與用戶登錄Redhawk設備連接。
  3. 一旦您擁有Redhawk設備,您可以將其添加到Redhawk節點,該節點可以在啓動時或通過命令通過python或bash腳本啓動。 cmd nodeBooter -d $SDRROOT/dev/nodes/DeviceManager/DeviceManager.dcd.xml或類似的東西會讓你在那裏。我知道你說應該在啓動時啓動而不是,但設備(驅動程序)的一般做法是它們始終可用於異步連接。無論如何,一旦運行了節點,您就可以通過python腳本或IDE在該節點/設備上啓動波形。針對設備啓動波形由三件事組成:滿足波形依賴性,設置(Redhawk)端口連接以及分配RF調諧器(啓動數據流)。我承認這似乎不是最直接的方式,但有系統級的原因爲什麼這樣做。
  4. 或者,根據您的最終目標,您可以在Redhawk 組件而不是設備中執行上述#2或#3。除了約定以外,沒有太多的技術差異,人們會如何使用你的硬件/系統/應用程序。作爲一個組件,你可以直接將它添加到你的波形(很像GNU無線電),因此它是一個實體。這對於人們來說通常更容易理解,並且需要的工作步驟較少,但如果您與其他人一起工作或正在構建更大的系統,則可能會出現問題。將硬件接口構建到設備中並在節點中運行它們可以與Waveforms(應用程序)解耦,因此,每次使用不同的RF前端時,都不必切換組件。

無論如何,這應該讓你思考。我建議閱讀Redhawk手冊,儘管在這一點上它相當大。搜索python示例,他們是瞭解如何操作框架的最簡單方法。要探索可用的Python函數:

$ python 
>>> from ossie.utils import redhawk 
>>> domain = redhawk.attach('REDHAWK_DEV') 
>>> dir(domain) 
相關問題