2017-10-17 3 views
1

Linux上でCを使用してアプリケーションを作成しています。私のアプリケーションでは、通常のユーザー(非rootユーザー)で最初にいくつかのタスクを実行する必要がありますが、実行の途中でrootユーザーといくつかのタスクを実行する必要があります。LinuxでCを使用して実行中にユーザーを切り替える方法

ところで、私は普通のユーザーの設定を変更することはできません。だから私はsudoersに通常のユーザーを追加することはできません。 OSの設定も変更できません。

私のアプリケーションが実際に行うことは、アプリケーションを実行し、分析のために出力を得ることです。

一部のアプリケーションはrootで実行する必要があります。私はマルチスレッドを使って、これらのアプリケーションの出力を並列に実行して分析し、各アプリケーションのレポートをReportと呼ばれる単一のものに保存します。サブプロセスでexecvpを使用してこれらのアプリケーションを呼び出します。

私のアプリケーションの主な目的は、ソフトウェアテストを自動化することです。そして、ほとんどのタスクは、rootでないソフトウェア所有者で実行する必要があります。

だから、問題は、私は、実行時にユーザを切り替えることができますどのように

  • のですか?
  • 私はこれを1つの実行可能ファイルに実装できますか?
  • これをPOSIX APIで行う方が良いでしょう。
  • 通常のユーザーでアプリケーションを実行し、アプリケーションにrootパスワードを与え、rootパスワードを使用してrootに切り替えます。
+1

http://man7.org/linux/manage/man2/setuid.2.html – oakad

+0

@oakadありがとうございます。通常のユーザーで自分のアプリケーションを起動し、ルートパスワードを使用してrootに切り替えることは可能ですか? –

+2

いいえ、rootとして実行される別のヘルパープロセスを起動して、IPC経由で通信することもできます。これを行う1つの方法は、ヘルパーにsetuidビットを設定することです。ヘルパーを可能な限り最小限に抑え、実際にルートアクセスが必要な非常に基本的な機能だけを提供し、メインアプリに残りをさせます。 –

答えて

4

読むよりおよそsetuid実行ファイルsetreuid(2)execve(2)システムコール。所有者(chown(1))とのコードを慎重にに変更した後に(chmod(1)を参照)の実行可能ファイルにsetuidフラグを設定する必要があります。security holesを避けるように注意してください。

(私はあなたのコードはsetuidメカニズムを知っている誰かによって検討し、セキュリティ上の問題を認識して持つことをお勧めします)

のsetuidはsusudosuperloginなどで使用される基本的なメカニズム(あります... )プログラムを使用して権限を取得(または取り消し)します。 credentials(7) & capabilities(7)を参照してください。

(rootとして、または/usr/libexec/ ...で、おそらくいくつかのsetuid実行可能ファイルを起動する)いくつかのヘルパープロセスを開始し、いくつかのinter-process communication施設を使用してそれと通信する方が安全かもしれない(のようなpipe(7) ...)。たとえば、ルートプロセスでGTKやQtなどのGUIツールキットを使用することは推奨されません。あなたのアプリが何らかのGUIを持っているなら、非root(普通のユーザ)プロセスでGUIを実行し、特別な特権を必要とする実際の仕事をやっている(うまくいけば小さな)ヘルパープロセスのrootとして実行するのが妥当です。

コーディングする前に、私はAdvanced Linux Programmingsyscalls(2)のような良い本と、あなたが使うsystem callのドキュメントを読むことをお勧めします。 Securityの側面が特に重要です。

Setuid実行可能ファイルは、必ずしもパスワードを要求または使用するとは限りません。パスワードの必要なプログラム(特にloginsusudoなど)はsetuidです(Linuxではfree softwareですので、studyのソースコードを参照してください)。それを確認するにはls -l /bin/su /usr/bin/sudo /bin/loginを試してください。

さまざまなユーザー環境をエミュレートするため、environ(7)に注意してください。

関連する問題