LINUX.ORG.RU

Privilege separation в питоне

 


1

3

Приветствую.

Допустим, мне нужно из непривилегированного кода на Python уметь получать SMART-данные с установленных в системе дисков. Непосредственно обёртка над smartctl у меня уже есть. Осталось решить вопрос о разделении привилегий, т. е. сделать так, чтобы не давать основному процессу права на доступ к дискам.

Как такие вещи принято делать? Демон, UNIX-сокеты и сериализация в условный JSON? Может быть, есть какие-нибудь библиотеки для подобных задач, чтобы не велосипедить всё с нуля, включая обработку ошибок и прочих таймаутов?

(Можно, конечно, sudo smartctl и соответствующее правило в sudoers, но это уж очень топорно.)

★★★★★

Последнее исправление: intelfx (всего исправлений: 1)

Запускаешь скрипт от рута, создаешь multiprocessing.Process(target=привилегированный_код), в основном процессе вызываешь os.setuid(). Общение через multiprocessing.Pipe или Queue

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

Увы, я не могу изначально запускаться от рута, т. к. это python-плагин к изначально непривилегированному софту.

intelfx ★★★★★
() автор топика

Можно дёрнуть udisks2 за dbus api (там есть smart в /drives/). Я похожим образом себе пилил бэкап шифрованной флешки с браузером из непривилигированного процесса (https://github.com/Jajauma/www-data/blob/2903b636d9053b4bd98e5f08429ab6753049...), метод возвращает открытый fd который можно передать дальше например в dd, и аутентифицирует используя текущие полиси polkit.

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ну тогда скостылить так или иначе. Если преднастроенный sudo скучно, можно повеселиться и сделать сокет-активируемую службу которая будет дёргать smartctl с ключами (сокет очевидно должен быть world-writable).

d_a ★★★★★
()

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

Siado ★★★★★
()

Осталось решить вопрос о разделении привилегий, т. е. сделать так, чтобы не давать основному процессу права на доступ к дискам.

Тут можно selinux поковырять

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

Дело хозяйское конечно, но мне кажется используя технические преимущества современного инита припилить отдельный ленивый лунхер для smartctl и там же не отходя от кассы получить IPC over unix socket как-то полегче. (Рассуждаю с дивана, если что.)

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

Да, а кусок кода надо пускать от рута.

Может групповыми политиками разрулить?

Siado ★★★★★
()

либо sudo, либо cap на бинарник. Питоновый код можно изменить, поэтому никак.

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

Да толку-то. Я изначально думал избежать накладных расходов на spawn нового питоньего процесса каждый раз (хотя это не имеет смысла, учитывая саму задачу и период опроса). А если на это забивать, то действительно проще всего написать сокет-активируемый юнит с StandardInput=socket и StandardOutput=socket.

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

Там ещё проблема с парсингом Total_LBAs_(Read|Written) на моём SSD, little vs. big-endian перепутаны. И вот хз, это особенность моего SSD или бага либатасмарта.

Возможно, действительно проще не вы5.1ываться и сделать так, как ты советуешь. Просто udisks привлекает тем, что кэширует результаты и ещё ряд рядом лежащих значений в удобном виде экспортирует.

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