Як вбити процес, розпочатий з іншого користувача, не використовуючи 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.