- ベストアンサー
Linuxシェルスクリプトで一時的にルート権限を実行する方法は?
- Linuxのシェルスクリプトで一時的にルート権限として実行したい場合、いくつかの方法があります。例えば、sudoコマンドを使用する方法や、setuidビットを設定する方法などがあります。
- sudoコマンドを使用する場合、sudoersファイルに実行したいスクリプトを記述し、ユーザーにsudo権限を与える必要があります。また、setuidビットを設定する方法では、スクリプトファイルにsetuidビットを設定することで、実行ユーザーではなく所有者の権限でスクリプトが実行されます。
- ただし、セキュリティ上の理由から、ルート権限を持つスクリプトを実行する場合は注意が必要です。慎重に設定を行い、必要最小限の権限で実行するようにしましょう。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ラッパープログラムを作成して、そのプログラムにsetuid(所有者をrootにして chmod 4755)を設定するのがよいでしょう。 以下はラッパープログラムの一例です。execvの引数(/bin/bashの部分)とargvを 書き換えることで任意のプログラムを起動できるでしょう。 -- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <grp.h> #include <sys/wait.h> int main () { struct passwd *pw; pw = getpwuid (geteuid ()); if (!(pw && pw->pw_name && pw->pw_name[0])) { perror ("getpwuid"); exit (EXIT_FAILURE); } if (initgroups (pw->pw_name, pw->pw_gid) == -1) { perror ("initgropuos"); exit (EXIT_FAILURE); } if (setgid (pw->pw_gid) == -1) { perror ("setgid"); exit (EXIT_FAILURE); } if (setuid (pw->pw_uid) == -1) { perror ("setuid"); exit (EXIT_FAILURE); } char *argv[4]; argv[0] = "-bash"; argv[1] = "-c"; argv[2] = "screen.sh"; argv[3] = NULL; if (execv ("/bin/bash", argv) == -1) { perror ("execv"); exit (EXIT_FAILURE); } exit (EXIT_SUCCESS); } -- 特定のユーザのみ起動できるようにしたい場合はグループ(ここではwrapperとする)を 作成してchgrp wrapper、chmod 4750すればよいでしょう。
その他の回答 (1)
下記のURLに書かれているような方法はいかがでしょう。
お礼
回答有り難うございます。 こういった方法も在るのですね。 セキュリティ面が気になるところですが、勉強として参考にさせて頂きます。
お礼
回答有り難うございます。 ソースコードも実装にそって書いていただきわかりやすく感謝致します。 回答に関して2点ほど疑問点がありましたので補足法で加筆させて頂きます。
補足
1.最後の chmod 4750とはどういった設定なのでしょうか? 2.このプログラムを実行、実装するにあたって脆弱性はどのようになりますか?