7

У меня есть 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:~$ 

Как я могу дать разрешение userC сделать это, не полагаясь на доступ sudo? В качестве последнего средства я бы предоставил пользователю rootC привилегии для этого.

У меня есть полный контроль над пользователем. Одной из возможностей является изменение идентификатора пользователя на userA, но тогда как насчет userB?

ОБНОВИТЬ:

Контекст для существующего веб-приложения.

3 ответа3

1

Если вы не предоставите пользователю userC доступ к учетным записям userA и userB, вы не сможете сделать это без использования чего-то вроде sudo, которое дает специальное разрешение. В ядре Linux нет возможности предоставлять доступ к процессам на основе групп или списков контроля доступа.

Но вы не должны бояться использовать sudo. Вы можете настроить его так, чтобы он разрешал только определенные команды и позволял запускать команды только для определенных пользователей. То есть вы можете разрешить пользователю userC уничтожать только процессы userA и userB, но не разрешать userC уничтожать другие процессы.

1

Вы можете создать второе приложение, которое может уничтожать процессы, например, process-proxy , вы можете запустить его как root только один раз (возможно, заставить его запускаться автоматически при загрузке) и оставить его для прослушивания сообщения Dbus или другого средства связи. Наконец, клиентское приложение, например send-message для отправки сообщений и может запускаться по желанию пользователем C.

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

Другими словами, создайте приложение для прокси. Вам просто нужно убедиться, что он только прослушивает сообщения от userC, а также может быть хорошей идеей, чтобы позволить ему убивать только определенные процессы для определенных пользователей.

PD Dbus, возможно, не самая лучшая идея (я не совсем знаком с ней), но есть много способов, чтобы process-proxy знал о сообщении. Например, отслеживайте файл в определенной папке (для которой только userC и root имеют доступ для безопасности), который может содержать pid процесса, который нам нужен для уничтожения.

1

Это похоже на ответ Мартина, но (возможно) немного проще.  Напишите новую версию команды kill которая выглядит примерно так:

Если (текущий UID (т. Е. UID вызывающего) != userC)
        выход (с соответствующим сообщением об ошибке)
разбирать аргументы
вызовите системную функцию kill()

Если вы не хотите переписывать команду kill , напишите свою программу в exec /bin/kill с любыми аргументами, которые ей были переданы.  Скомпилируйте, протестируйте, а затем сделайте две копии: одну с setUID для userA и одну с setUID для userB. Для дополнительной безопасности поместите их в каталог, к которому имеет доступ только пользователь C.

Если упрощение жизни для userC является первостепенной задачей, напишите внешнюю программу, которая определяет, чей процесс (ы) userC пытается «убить», и вызывает соответствующую копию первой программы.  Или он может запустить обе копии.


Это, по сути, написание собственной урезанной версии sudo , поэтому я не знаю, будет ли она приемлемой для вас.  Вы сказали, что хотите «сделать это, не полагаясь на доступ sudo», и, строго говоря, с этим ответом вы не будете полагаться ни на что - вы будете иметь полный контроль над конфигурацией решения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .