web-dev-qa-db-ja.com

別のユーザープロセスを管理する権限を付与する

プロセスを開始するuserAとuserBがいます。

userA@server:~$ ./some_command.sh &
[1] 30889

次に、userCがこれらのプロセス(一時停止、再開、終了、および強制終了)を管理できるようにします。

userC@server:~$ kill 30889
bash: kill: (30889) - Operation not permitted
userC@server:~$ Sudo kill 30889
userC@server:~$ 

Sudoアクセスに依存せずにuserCにこれを行う許可を与えるにはどうすればよいですか?最後の手段として、これを行うためにuserCroot権限を付与します。

UserCを完全に制御できます。 1つの可能性は、ユーザーIDをuserAと同じに変更することですが、userBはどうでしょうか。

更新:

コンテキストは既存のWebアプリ用です。

7
hoju

UserCにuserAとuserBのアカウントへのアクセスを許可しない限り、特別な権限を付与するSudoのようなものを使用せずにそれを行う方法はありません。 Linuxカーネルには、グループまたはアクセス制御リストに基づいてプロセスへのアクセスを許可する機能はありません。

ただし、Sudoの使用を恐れる必要はありません。特定のコマンドのみを許可し、コマンドを特定のユーザーとしてのみ実行できるように構成できます。つまりuserAとuserBのプロセスだけをuserCが強制終了できるようにすることはできますが、userCが他のプロセスを強制終了することはできません。

1
Kyle Jones

process-proxyなどのプロセスを強制終了できる2番目のアプリケーションを作成できます。これをrootとして1回だけ実行し(おそらく起動時に自動的に起動するようにします)、Dbusメッセージまたはその他の手段をリッスンしたままにします。コミュニケーション。最後に、クライアントアプリケーション、たとえばsend-messageはメッセージを送信し、userCが自由に実行できます。

userC@server $ ./send-message -kill -pid 30889
userC@server $ ./send-message -Nice 2 -pid 30889

言い換えれば、プロキシアプリケーションを作成します。 userCからのメッセージのみをリッスンするようにする必要があります。また、特定のユーザーの特定のプロセスのみを強制終了するようにすることもお勧めします。

P.D. Dbusは最良のアイデアではないかもしれませんが(私はそれに完全には精通していません)、process-proxyにメッセージを認識させる方法はたくさんあります。たとえば、強制終了する必要のあるプロセスのpidを含む可能性のある特定のフォルダー(userCとrootのみがセキュリティのためにアクセスできる)上のファイルを監視します。

1
Martín Canaval

これはマーティンの答えに似ていますが、(おそらく)少し簡単です。次のような新しいバージョンのkillコマンドを記述します。

If(現在のUID (つまり、呼び出し元のUID)!= userC)
終了(適切なエラーメッセージ付き)
解析引数
call kill()システム関数

killコマンドを書き直したくない場合は、渡された引数を使用してexec /bin/killにプログラムを記述します。コンパイルしてテストし、2つのコピーを作成します。1つはuserAへのsetUIDで、もう1つはuserBへのsetUIDです。安全性を高めるために、userCのみがアクセスできるディレクトリにそれらを配置してください。

UserCの作業を楽にすることが最も重要な懸念事項である場合は、userCが「強制終了」しようとしているプロセスを判別し、最初のプログラムの適切なコピーを呼び出すフロントエンドプログラムを作成します。または、両方のコピーを実行することもできます。


これは基本的に、Sudoの独自の簡略版を作成しているため、それが受け入れられるかどうかはわかりません。 「Sudoアクセスに依存せずにこれを実行したい」とおっしゃいましたが、厳密に言えば、この回答では何にも依存しません。ソリューションの構成を完全に制御できます。

1
Scott