0

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

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

私は図書館の供給者に連絡しました、そして彼らは私が以下をするべきであると示しました:

rootとして実行するとシステムのセキュリティが損なわれると感じるユーザーは、次の実装で十分だと感じるかもしれません。

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

これは機能しますが、実行可能ファイルを変更せずにこれを行う別の方法はありませんか?これらの特権にアクセスできるグループにユーザーを追加することを考えています。助けていただければ幸いです。

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

OS:Ubuntu Linux 11.10環境:Qtを使用したC ++

4

2 に答える 2

0

setcap()ルートとして使用して、実際に必要な機能を手動で設定できます。

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

于 2011-12-14T14:53:43.240 に答える
0

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

おそらく、これに対する最も簡単な解決策は、ビルド プロセス (例: ) にパーミッションを追加することMakefileです。

これを部分的に回避する 1 つの方法は、プログラムを 2 つのプログラムに分割することです。1 つはライブラリを使用してカメラと通信し、もう 1 つはソケットまたはパイプを介してインターフェース プログラムと通信するユーザー インターフェース用です。このようにすれば、インターフェイス プログラムを変更するときにのみ権限を変更する必要があります。これは、プログラムにとっても一般的に良い考えですsetuid。つまり、昇格されたパーミッションを持つ小さなラッパー プログラムがあり、より大きな GUI プログラムは拡張されたパーミッションなしで実行されます。setuid特にプログラムを非常に単純にすることができれば、プログラムの監査はより簡単になります。

于 2011-12-14T14:58:54.623 に答える