rootまたはsudoerにならずに別のユーザーで開始されたプロセスを強制終了するにはどうすればよいですか?


20

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

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

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

そのため、ユーザーからプロセスを強制終了する要求を受信し、ユーザーがプロセスを開始/停止できるかどうかを確認し、プロセスを強制終了するルートとして実行するプロセスを作成することを考えていました。

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


SOへようこそ。私はこれが可能だとは思わない...とにかく、これはSOの姉妹サイトであるserverfault.comにより適しています。すぐに移行される可能性があり、何もする必要はありません。
PekkaはGoFundMonicaを

どのようなプログラムについて話しているのですか?一般的な場合は難しいでしょうが、場合によっては(Apacheや自分で変更できるアプリなど)簡単な場合もあります。
キム

回答:


14

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

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

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


ご回答有難うございます。私の場合、実際、ファイルは使用しませんが、適切な信号を送信できるシステム(dim.web.cern.ch/dim)を使用し、ユーザーが許可されていることを確認するプロセスを呼び出すことができますプロセスを停止し、プロセスを強制終了します。

@ATelesca-非常に似たものを使用して、特権のないユーザーがかなり大きなファーム全体でXen仮想マシンを制御/起動/停止できるようにします。基本的に、同じこと。
ティムポスト

9

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ます。


私はこれを試しましたが、うまくいきませんでした。非所有者ユーザーは、killコマンドで拒否された許可を取得しました。
ジャビッドジャマエ

1
システムにkillスクリプトへのアクセス許可を制御させないのはなぜですか。userA、userB、userCからグループを作成し、そのグループにkillscriptをchownし、それをg + xにchmoddingすることは、私にとってはずっと賢い方法です。
レオニードシェブツォフ

1
setuidビットシェルスクリプト内で許可されていない、uがそれを実行するためのプログラムの開発をコンパイルしたクレートの簡単なラッパーに必要
エル」

2

従来の方法ではありません-ユーザーが来て他の誰かのプロセスを殺すことは、究極のサービス拒否の脆弱性です。

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


1

いいえ、できません。

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


1

もちろん、特定のユーザー(特定のユーザーのリスト)から特定のシグナル(POSIXシグナルではなく「大まかに使用する用語」を意味する)を受信すると、プログラムが正常に終了するようにプログラムを作成できます。


シグナルには「ユーザー」フィールドはありません。それらは単なるシグナルです。
LtWorf 14

私が「POSIXシグナルではなく、事前に決定されたイベント」と言った理由。
drxzcl 14

1

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


0

suidビットはbashスクリプトでは機能しません。私見、最良の方法は、ラッパースクリプト「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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.