LINUX.ORG.RU

Права на передачу сигналов


0

1

Ай-яй-яй...
Захват и уничтожение мира снова под угрозой.
Демон, просчитывающий план по захвату вселенной, работает из-под рута, а будущий император вселенной, как и любой нормальный линуксоид, сидит под своими правами.
Так вот, как бы заставить рутовый демон принимать сигналы, посылаемые непривилегированным пользователем?

★★☆

думаю план такой:

если доступа к исходному коду root-демона нет — то создать нового root-helper-думона, который слушает сигналы по шине dBus, в том числе от НЕпревелигерованного пользователя и передаёт их нашему root-демону.

держать постоянно-включенным root-helper-думона не обязательно. можно настроить его запуск по требованию (средствами самого dBus).

через dBus шину можно поглядеть идентификатор пользователя который отсылает сигналы. и таким образом принимить сигналы НЕ от всех непревилегированных пользователей а только от определённых пользователей (у которых определённая группа).

вобщем такие дела.

план Б: использовать unix-domain-sockets , находящиеся в определённой директории.

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

если доступа к исходному коду root-демона нет

Есть! Есть и код и полное понимание его функциональности.
Нет вот только опыта работы с сигналами.

Stahl ★★☆
() автор топика
Ответ на: комментарий от user_id_68054
void output_flag_handler(int i)
{
    if (i != SWITCH_SIGNAL) return;

    /// bla-bla-bla
}

void set_signal_handler()
{
    struct sigaction sa;
    sa.sa_handler = output_flag_handler;
    sigaction(SWITCH_SIGNAL, &sa, 0);
}
Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

план Ц: не использовать сигналы.

(сразу использовать dBus или unix-domain-sockets)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

ну тогда всё просто.

Подскажи плиз.
Кусок кода, отвечающий за обработку сигналов прилагаю к делу:)

Stahl ★★☆
() автор топика
Ответ на: комментарий от user_id_68054

то создать нового root-helper-думона, который слушает сигналы по шине dBus

а нафига тут dbus? открыл fifo, и слушай себе, сколько влезет

ananas ★★★★★
()
Ответ на: комментарий от ananas

а нафига тут dbus? открыл fifo, и слушай себе, сколько влезет

тоже вариант.. да... :)

и кстате sudoers тоже хорошо придумал.

(сам-то я не очень люблю пути повышающие привелегии.. но sudoers меньшее из зол, наверно)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

пути повышающие привелегии

Да вот в этом-то и дело.
Демон-то хоть и вынужден работать из-под рута, но управляться должен кем попало.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Демон-то хоть и вынужден работать из-под рута, но управляться должен кем попало.

дать беспарольный sudo на одну команду, и загнать в /etc/profile.d какой-нибудь сниппет с alias cmd='sudo cmd' - не проблема

ananas ★★★★★
()
Ответ на: комментарий от ananas

Гм. Предполагается что демон будет работать на разных машинах и для разных людей.
Никто в трезвом уме и светлой памяти не будет проводить подобные шаманства.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

а при чем тут шаманства? нужный конфиг для sudo кладется отдельным файлом в /etc/sudoers.d, алиас - в /etc/profile.d. все оформляется пакетом и ставится куда угодно без лишних телодвижений.

ananas ★★★★★
()
Ответ на: комментарий от ananas

В принципе да, все эти шаманские па я могу взять на себя, но меня не оставляет смутное сомнение в правильности этого пути.

Stahl ★★☆
() автор топика

Демон, просчитывающий план по захвату вселенной, работает из-под рута

Вдоль, срочно! Демонам надо делать отдельного пользователя с правом на запись нужного файла и доступам к нужным устройствам.

Zorn
()
Ответ на: комментарий от Stahl

А что тут такого? Пишешь скрипт/программу отправляющую команду в сокет демона, команда отправляется по результатам параметров программы/скрипта. Пример mysql (консольный клиент для MySQL).

anonymous
()
Ответ на: комментарий от anonymous

Т.е. ты предлагаешь написать программу для управления программой?
При этом масштабы управления ограничиваются одним событием — сигнал переключает режим работы демона.
Не-не-не. Я так не играю:)

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

программу для управления программой

Настолько конечно я баша не знаю, чтоб сходу пример навелосипедить, но думаю на нем это займет 3 строчки.

anonymous
()
Ответ на: комментарий от Stahl

Ну какбэ непойми какому демону нельзя давать права рута. Если бы ты пользовался нормальным дистром, ты бы увидел, что у каждого демона свой пользователь. И да, плюсую сокеты.

Zorn
()
Ответ на: комментарий от Stahl

По мне так использование сигналов для этих целей гораздо больший геморрой, чем написание небольшого скрипта, который бы слал нужную команду в сокет. Причём, если это просто переключение режима работы - то это будет ничуть не сложнее отсылки сигнала демону. Прислушайся уже.

roy ★★★★★
()
Ответ на: комментарий от Stahl

А как юзер из консоли будет УДОБНО управлять демоном?

Так уж сложилось, что unix signals не обладают никакими DAC/MAC, помимо проверки id. Сигналы сами по себе вещь в себе, и у них куча других тонкостей (если не сказать проблем). Поэтому, как тут предлагалось, лучшее решение это unix socket/fifo, таким образом вы получаете имя (или целый файл), после чего можете применять к этому имени любые политики, хоть selinux.

fifo используют init (/dev/initctl), mpd, и куча демонов.

А CAP_KILL это не решение, так как всё равно кто-то (root) этот cap_kill должен установить, и этот CAP_KILL будет распространяться на всю систему (то есть процесс будет способен убить init, например).

hexdump01010101
()
Ответ на: комментарий от hexdump01010101

А CAP_KILL это не решение

Это скорее заглушка, если нет желания/возможности разбираться с кодом демона. Процесс, естественно, отдельный. Чтобы никого случайно не прибил. У меня стоит такая штука

#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    pid_t pid;
    FILE *f = fopen("/var/run/daemon.pid","r");
    if(!f) exit(-2);
    if(fscanf(f, "%d", &pid)!=1) exit(-2);
    return kill(pid,1);
}
Хотя в этом случае можно использовать suid.

at ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.