Як вбити процес, розпочатий з іншого користувача, не використовуючи root або sudoer?


20

У середовищі Linux мені потрібно вбити процес, який розпочав користувач2, якщо я є користувачем1, не будучи судерами або використовуючи root. Чи знаєте ви, чи є спосіб встановити це при запуску процесу? Наприклад, список користувачів, яким дозволено вбивати процес?

Справа в тому, що одночасні екземпляри одного і того ж процесу можуть бути запущені від різних користувачів, тому мені не зручно встановлювати ідентифікатор групи в процес. Інші користувачі, які не входять до групи, не зможуть розпочати другий паралельний процес.

У мене є список користувачів, яким дозволено запустити процес, визначений у базі даних, перед запуском процесу я перевіряю, чи є поточний користувач у списку, і, якщо так, я запускаю процес із поточним користувачем. Якщо другий користувач дозволив це зробити, він хоче вбити процес, я б хотів, щоб це було дозволено, але я не хочу, щоб це були судори.

Тому я думав створити процес, що працює як root, який отримує запит на знищення процесів від користувача, перевіряє, чи дозволено користувачеві запускати / зупиняти процес і вбиває процес.

Як ви вважаєте, це може бути найкращим рішенням?


Ласкаво просимо до SO. Я не думаю, що це можливо ... Як би там не було, це більше підходить для сестринського сайту SO, serverfault.com. Він може незабаром мігрувати туди, не потрібно нічого робити.
Pekka підтримує GoFundMonica

Про яку програму ми говоримо? У загальному випадку це буде важко, але в деяких випадках (наприклад, апаш або додаток, який ви можете змінити самостійно) було б простіше.
Кім

Відповіді:


14

Вибачте, але це просто неможливо (це за задумом). Однак, якщо члени загальної групи, user1 може записати у файл, який перевіряє user2-процес, вказуючи на процес, що його слід припинити.

Або user2 може запустити щось у фоновому режимі, що перевіряє файл, після чого надсилає відповідні сигнали. User1 тоді просто повинен записати в цей файл. Це може бути простішим, оскільки це не потребує будь-яких модифікацій програм user2.

Зазвичай ні, користувач1 не може надсилати POSIX-сигнали до процесу user2.


Дякую за вашу відповідь. У моєму випадку, дійсно, я не використовую файл, але ми використовуємо систему ( dim.web.cern.ch/dim ), яка може надсилати відповідний сигнал, тоді може бути викликаний процес, який перевіряє, чи користувач може дозволити зупиняє процес і вбиває процес.

@ATelesca - я використовую щось дуже схоже, щоб дозволити малозабезпеченим користувачам контролювати / запускати / зупиняти віртуальні машини Xen у досить великій фермі. В основному те саме.
Tim Post

9

Якщо ACLs або 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.
Javid Jamae

1
Я просто додам, чому б не дати дозволу системи контролювати сценарій kill? Створення групи з userA, userB та userC, а потім придушення скрипту kills до цієї групи та зміна її до g + x здається мені більш акуратним.
Леонід Шевцов

1
setUid біт не дозволений у скриптах оболонки, вам потрібно створити просту обгортку, складену програму, щоб запустити її
El '

2

Не умовно - можливе, що будь-який користувач приходить і вбиває чужі процеси - це остаточна вразливість відмови у наданні послуг.

Це можна зробити, якщо цільовий процес співпрацює. Одним із способів було б відслідковувати зовнішні події (наприклад, файл, що створюється в / var / tmp, або повідомлення в сокеті), доручаючи йому вбити себе. Якщо ви не можете написати це для цього, ви можете написати обгортку для цього, який він запускає, а потім здійснює моніторинг, вбиваючи дочірній процес, якщо подія трапиться.


1

Ні, ти не можеш.

Якщо ви хочете поділитися процесами з іншими користувачами, вам слід запустити процес під загальним ідентифікатором користувача.


1

Звичайно, ви можете написати програму таким чином, що вона витончено припиняється, коли вона отримує певний сигнал (термін, який використовується вільно для позначення "заздалегідь визначеної події", а не сигнал POSIX) від певного (списку) користувачів.


У сигналах немає поля "користувач". Вони просто сигнали.
LtWorf

Ось чому я сказав "заздалегідь визначена подія, а не сигнал POSIX".
drxzcl

1

Ви можете написати суїд-програму, яку можуть виконувати лише користувачі певної групи, яка передає відповідний сигнал процесу. Не впевнений, що ти мав на увазі виключити самогубство.


0

suid біт не працює з bash-скриптами. Імхо, найкращий спосіб - написати якийсь сценарій обгортки "killservice". Припустимо, що ваша служба працює як користувач службикористувача

#!/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, щоб дозволити їм запускати / usr / bin / killserviceworker як користувачеві serviceuser, не запитуючи пароль:

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

Сервіс-службовець може виглядати так:

#!/bin/bash
kill ${cat /run/service.pid}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.