2011-12-14 5 views
0

LinuxコンピュータでC++でアプリケーションを開発中です。アプリケーションは、イーサネットアダプタとネットワークを使用するサードパーティのライブラリを使用します。ライブラリはGigE Visionカメラのライブラリです。起動時に、アプリケーションはカメラに接続しようとした後、カメラに関する情報を返します。その後、アプリケーションにビデオをストリーミングします。アプリケーションのネットワーク機能

しばらくすると、アプリケーションがカメラの情報をカメラに接続または取得できず、アプリケーションをroot(sudo)として実行すると問題が解決されます。

私は、ライブラリの供給元に連絡してきたし、彼らは私が次の操作を行う必要があることを示している:ルートが妥協としてのシステムのセキュリティは、次の実装は満足することが実行されていると感じ

ユーザー:

  1. 実行可能な所有者をrootとして設定します。
  2. アプリケーションの起動時には、すべてを解放するが、これらの権限能力セット()を使用する場合、コードで実行可能
  3. の「setuidさ」許可ビットを設定します。CAP_SYS_NICE、CAP_NET_ADMIN、CAP_NET_BROADCAST、CAP_NET_RAWアプリケーションはすべてroot権限で起動しますが、起動後すぐに削除されます。

これは動作しますが、実行可能ファイルを変更せずにこれを行う方法はありますか?私はそれらの特権にアクセスすることができるいくつかのグループに自分のユーザーを追加することを考えています。

上記の解決方法は、各コンパイル後に所有者を変更してアクセス許可を設定する必要があるという意味で最適ではありません。アプリケーションは、ビデオを記録し、画像をキャプチャするために使用されます。上記のソリューションでは、これらの記録とキャプチャはrootユーザーが所有し、ファイルを配布するときにユーザーを元に戻す必要があります。

OS:Ubuntu Linuxの11.10 環境:Qtの

答えて

0

とC++あなたは確かにrootとしてsetcap()を使用して、手動で必要な機能を設定することができます。

したがって、このコマンドを使用して適切な機能を設定すると、rootでなくても通常のユーザーとして実行されます。

0

実際にはルート権限が必要なことは、ライブラリが行っているようです。

おそらく最も簡単な解決策は、ビルドプロセスにアクセス許可を追加することです(Makefileなど)。

これを部分的に回避する方法の1つは、プログラムをライブラリを使用してカメラと通信するプログラムと、ソケットまたはパイプを通じてインターフェイスプログラムと通信するユーザーインターフェイスのプログラムに分けることです。このようにして、インターフェイスプログラムを変更するときにのみアクセス許可を変更する必要があります。これはまた、一般的にはsetuidプログラムのために良いアイデアになるでしょう。アクセス権の高い小さなラッパープログラムがあり、大きなGUIプログラムは拡張アクセス許可なしで実行されています。 setuidプログラムを監査する方が簡単です(特に非常に簡単にできる場合)。

関連する問題