web-dev-qa-db-ja.com

rootまたはsudoにならずに別のユーザーで開始されたプロセスを強制終了する方法は?

linux環境で、私がsudoersでなく、rootを使用せずにuser1である場合、user2によって開始されたプロセスを強制終了する必要があります。プロセスを起動するときにそれを設定する方法があるかどうか知っていますか?プロセスの終了を許可されたユーザーのリストなど?

実際には、同じプロセスの同時インスタンスを異なるユーザーから開始できるため、グループIDをプロセスに設定するのは不便です。グループに含まれていない他のユーザーは、2番目の並列プロセスを開始できません。

私が持っているのは、プロセスを開始する前に、プロセスを開始することを許可されたユーザーのリストであり、プロセスを開始する前に、リスト内の現在のユーザーを確認し、そうであれば、現在のユーザーでプロセスを開始します。それを許可された2番目のユーザーがプロセスを強制終了したい場合は、それを許可されたいのですが、sudoersになりたくありません。

したがって、ユーザーからプロセスを強制終了する要求を受け取り、ユーザーがプロセスの開始/停止を許可されているかどうかをチェックしてプロセスを強制終了するルートとして実行されるプロセスを作成することを考えていました。

それが最善の解決策になると思いますか?

20
ATelesca

申し訳ありませんが、これは単に不可能です(これは仕様によるものです)。ただし、共通グループのメンバーの場合、user1は、user2のプロセスがチェックするファイルに書き込み、プロセスに終了する必要があることを示します。

または、user2がファイルをチェックするバックグラウンドで何かを実行し、適切なシグナルを送信することもできます。次に、User1は単にそのファイルに書き込む必要があります。これは、user2のプログラムを変更する必要がないため、より簡単です。

通常、いいえ、user1はPOSIXシグナルをuser2のプロセスに送信できません。

14
Tim Post

ACLやSELinuxや他の方法でそれを行うためのより良い方法がない限り、私がこれを確認した方法は SetUID スクリプトを使用することです。ご想像のとおり、これらはセキュリティリスクとして悪名高いです。

あなたのケースについて、procOwnerがプロセス所有者のユーザー名であり、userA(uid 1000)、userB(uid 1201)、およびuserC(uid 1450)がプロセスを強制終了することを許可されている人だとします。

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

次に、所有者と権限を次のように設定します。

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

また、userA、userB、およびuserCをグループprocGroupに追加します。

9
Mike D.

従来とは異なり、他の誰かのプロセスをユーザーが殺害することは、究極のサービス拒否の脆弱性です。

対象プロセスが連携すれば可能です。 1つの方法は、外部イベント(/ var/tmpに作成されているファイルやソケットのメッセージなど)を監視し、自分自身を強制終了するように指示することです。それを行うためにそれを書くことができない場合は、それを開始して監視を行うラッパーのラッパーを作成し、イベントが発生した場合に子プロセスを強制終了することができます。

2
Edmund

いいえ、できません。

他のユーザーとプロセスを共有する場合は、共通のユーザーIDでプロセスを開始する必要があります。

1
Konerak

もちろん、特定の(リストの)ユーザーから特定のシグナル(「POSIXシグナルではなく、事前に決定されたイベント」を意味するために大まかに使用される用語)を受け取ったときに正常に終了するようにプログラムを作成できます。

1
drxzcl

特定のグループのユーザーだけが実行できる、適切なシグナルをプロセスに送信するsuidプログラムを作成できます。ただし、suidも除外するつもりだったかどうかはわかりません。

1
Kim

suidビットはbashスクリプトでは機能しません。 imho、最善の方法は、ラッパースクリプト「killservice」を記述することです。サービスがユーザーserviceuserとして実行されているとします。

#!/bin/bash
Sudo -u serviceuser /usr/bin/killserviceworker

その後

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

次に、/ etc/sudoersにルールを追加して、パスワードを要求せずにユーザーserviceuserとして/ usr/bin/killserviceworkerを実行できるようにする必要があります。

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killserviceworkerは次のようになります。

#!/bin/bash
kill ${cat /run/service.pid}
0
The_Ice