Повышение привилегий в Linux программно - PullRequest
1 голос
/ 18 декабря 2009

Я создаю графический установщик, который должен работать в Linux. Установка должна состоять из копирования файлов в некоторые места в /usr. В настоящее время программа установки написана на Python.

Как я могу повысить привилегии моего установщика, когда мне нужно скопировать файлы? Я посмотрел на PolicyKit , но

  • a) похоже, что не существует общего идентификатора действия "install files" для PolicyKit
  • b) идентификаторов действий, которые я могу использовать, я не думаю, что они являются стандартными в дистрибутивах

Я также посмотрел на PAM, и у меня есть код, который использует libpam, но я не могу ничего с этим поделать. После аутентификации моего пользователя (путем предоставления имени пользователя и пароля) у меня нет доступа на запись к /usr. Я попытался сменить пользователя на os.setuid(0) после аутентификации, но я получил ошибку от ОС.

Также, как ни странно, неважно, какую услугу я предоставляю pam_start. Пока имя пользователя и пароль верны, я могу передать все, что захочу. Я вижу, у меня есть /etc/pam.d/sudo. Приведенный ниже код упрощен, пароль правильно хранится в объекте pam_conversation, и я передаю объект дескриптора.

pam_start("my_user", "my_pass", "sudo_garbage_12345");

работает так же хорошо, как и

pam_start("my_user", "my_pass", "sudo");

То есть они оба преуспевают.

В крайнем случае я могу выполнить gksudo или kdesudo, но я не хочу привязываться к этим программам. Требование к пользователям вызывать мой установщик с помощью sudo является (очень) последним средством.

Ответы [ 3 ]

9 голосов
/ 18 декабря 2009

Возможно, вам лучше обернуть RPM внешним интерфейсом, который принимает пользовательские параметры и вызывает RPM для выполнения тяжелой работы. Это также дает вам инфраструктуру для управления зависимостями и хорошо сочетается с существующей системой управления пакетами. Если вам нужно запустить систему на основе .deb (Debian или Ubuntu), вам также может понадобиться создать .deb и добавить какой-то механизм во внешний интерфейс, который определяет, какая система управления пакетами активна.

Предоставление случайным пользователям доступа к корневым привилегиям обычно рассматривается как плохое состояние в системах Linux или Unix (или любой многопользовательской системе в этом отношении), поскольку представляет собой значительную угрозу безопасности. Однако у вас есть возможность разрешить пользователю устанавливать его в своем домашнем каталоге (~/bin), если у него нет прав доступа root или sudo, которые позволяют ему выполнять запись в системные области. В этом случае вы можете попросить их установить его как root, если они хотят установить его в / usr / bin, но разрешить им устанавливать его в своем домашнем каталоге для собственного использования, если у них нет привилегий root.

2 голосов
/ 18 декабря 2009

Для графического установщика придерживайтесь графической среды. Используйте gksudo или kdesudo, если они доступны, в противном случае выведите сообщение об ошибке, в котором говорится, что им нужен root. Люди (в частности, новички) загрузят ваш установщик и дважды щелкните его, чтобы запустить его со своего рабочего стола, и вам понадобится графический способ запросить у них пароль. Вы не хотите открывать терминал на них.

Учитывая это, не делайте sudo для них, даже если они запускаются из терминала. Просто выведите ошибку, в которой говорится, что вам нужен root, и выйдите. Если пользователь уже находится в командной строке (как я, скорее всего, хотел бы), я уже знаю, как выполнить sudo или su в root, если я хочу это сделать. Я обещаю вам, что вы, скорее всего, будете раздражать некоторые перья, если попытаетесь сделать опытного пользователя root, когда они смогут сделать это сами.

Если вы НАСТАИВАЕТЕ делать sudo самостоятельно из вашего установщика, ради бога, пожалуйста, перед тем, как удалить предыдущую временную метку, пожалуйста, введите 'sudo -K' Если вы этого не сделаете, и я недавно запустил sudo'd, вы запустите ваш установщик со мной как root без моего ведома (так как я не ожидаю, что это произойдет). 'Sudo -K' выдает приглашение, чтобы я мог затем решить, хочу ли я продолжать как root или нет.

0 голосов
/ 18 декабря 2009

Лучший способ в этом случае - использовать su в вашей программе. Перенаправьте входы / выходы, и все готово!

...