Когда использовать pkexec против gksu / gksudo?

77

Существует два основных способа графического запуска приложений от имени пользователя root (или, в более общем случае, от имени другого пользователя). Такие программы, как gksu, gksudoи kdesudoявляются графическим интерфейсом для sudo. Напротив, pkexecэто графический интерфейс для PolicyKit .

При ручном запуске программ от имени пользователя root (или другого пользователя, не являющегося пользователем root), каковы преимущества / недостатки (если они есть) использования pkexecпо сравнению с более традиционным способом использования sudoвнешнего интерфейса?

Элия ​​Каган
источник
Связанный: askubuntu.com/questions/252962/…
Механическая улитка
Связанный (но не дубликат): Является ли sudo -i менее безопасным, чем pkexec?
Элия ​​Каган,

Ответы:

25

PolicyKit более настраиваемый, но pkexecне использует эту настраиваемость. Кроме того, pkexecпокажите пользователю полный путь к программе, которая будет запущена, чтобы пользователь был немного уверен в том, что произойдет. Так называемые «политики» PolicyKit могут быть использованы для установки дополнительных параметров. Например, должен ли пароль быть запомненным.

Что-то, что я получил из pkexecруководства:

Среда, в которой PROGRAM будет его запускать, будет установлена ​​на минимально известную и безопасную среду, чтобы избежать внедрения кода через LD_LIBRARY_PATH или аналогичные механизмы. Кроме того, для переменной среды PKEXEC_UID задан идентификатор пользователя процесса, вызывающего pkexec. В результате pkexec не позволит вам запускать, например, приложения X11 от имени другого пользователя, поскольку переменная окружения $ DISPLAY не установлена.

Больше информации о политиках или определениях действий из pkexecруководства:

   To specify what kind of authorization is needed to execute the program
   /usr/bin/pk-example-frobnicate as another user, simply write an action
   definition file like this

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE policyconfig PUBLIC
        "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
        "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
       <policyconfig>

         <vendor>Examples for the PolicyKit Project</vendor>
         <vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>

         <action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">
           <description>Run the PolicyKit example program Frobnicate</description>
           <description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>
           <message>Authentication is required to run the PolicyKit example program Frobnicate</message>
           <message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate</message>
           <icon_name>audio-x-generic</icon_name>
           <defaults>
             <allow_any>no</allow_any>
             <allow_inactive>no</allow_inactive>
             <allow_active>auth_self_keep</allow_active>
           </defaults>
           <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>
         </action>

       </policyconfig>

   and drop it in the /usr/share/polkit-1/actions directory under a
   suitable name (e.g. matching the namespace of the action). Note that in
   addition to specifying the program, the authentication message,
   description, icon and defaults can be specified. For example, for the
   action defined above, the following authentication dialog will be
   shown:

       [IMAGE][2]

           +----------------------------------------------------------+
           |                     Authenticate                     [X] |
           +----------------------------------------------------------+
           |                                                          |
           |  [Icon]  Authentication is required to run the PolicyKit |
           |          example program Frobnicate                      |
           |                                                          |
           |          An application is attempting to perform an      |
           |          action that requires privileges. Authentication |
           |          is required to perform this action.             |
           |                                                          |
           |          Password: [__________________________________]  |
           |                                                          |
           | [V] Details:                                             |
           |  Command: /usr/bin/pk-example-frobnicate                 |
           |  Run As:  Super User (root)                              |
           |  Action:  org.fd.pk.example.pkexec.run-frobnicate        |
           |  Vendor:  Examples for the PolicyKit Project             |
           |                                                          |
           |                                  [Cancel] [Authenticate] |
           +----------------------------------------------------------+

   If the user is using the da_DK locale, the dialog looks like this:

       [IMAGE][3]

           +----------------------------------------------------------+
           |                     Autorisering                     [X] |
           +----------------------------------------------------------+
           |                                                          |
           |  [Icon]  Autorisering er påkrævet for at afvikle         |
           |          PolicyKit eksemplet Frobnicate                  |
           |                                                          |
           |          Et program forsøger at udføre en handling der   |
           |          kræver privilegier. Autorisering er påkrævet.   |
           |                                                          |
           |          Kodeord: [___________________________________]  |
           |                                                          |
           | [V] Detaljer:                                            |
           |  Bruger:   Super User (root)                             |
           |  Program:  /usr/bin/pk-example-frobnicate                |
           |  Handling: org.fd.pk.example.pkexec.run-frobnicate       |
           |  Vendor:   Examples for the PolicyKit Project            |
           |                                                          |
           |                                [Annullér] [Autorisering] |
           +----------------------------------------------------------+

   Note that pkexec does no validation of the ARGUMENTS passed to PROGRAM.
   In the normal case (where administrator authentication is required
   every time pkexec is used), this is not a problem since if the user is
   an administrator he might as well just run pkexec bash to get root.

   However, if an action is used for which the user can retain
   authorization (or if the user is implicitly authorized), such as with
   pk-example-frobnicate above, this could be a security hole. Therefore,
   as a rule of thumb, programs for which the default required
   authorization is changed, should never implicitly trust user input
   (e.g. like any other well-written suid program).
RobinJ
источник
1
Наверное, мне следовало сказать, что есть два приложения для запуска с правами root с графической аутентификацией . Я предположил , что существует способ использовать pkexecдля запуска графических приложений (я только не делал так ...). Ваш ответ объясняет, почему это не так (или, по крайней мере, почему для этого нужно указать пользовательскую среду).
Элия ​​Каган
1
У меня есть один вопрос по поводу вашего ответа - когда программа запускается с правами root pkexec, в каком смысле ее возможности («разрешения») могут быть ограничены? Я даю программе возможность делать что-либо, когда я запускаю ее с sudoпомощью sudoвнешнего интерфейса ... В каком смысле запуск программы от имени пользователя root pkexecтакже не делает этого?
Элия ​​Каган
3
Я понимаю, что PolicyKit позволяет программам выполнять только определенные типы действий. Но pkexecоблегчает ли это, или pkexecпросто работает как root с неограниченными способностями? pkexecРуководство Отрывок вы включили в свой ответ документы , как писать правила для определения , которые могут запускать программу с правами администратора (или как другой, не суперпользователя), а не то , что программа может сделать.
Элия ​​Каган
4
Я хочу принять ваш ответ, так как он предоставляет много полезной информации. Но я чувствую, что это очень вводит в заблуждение, потому что он говорит, что pkexecэто более настраиваемо, чем sudo, и, учитывая обсуждение, которое мы провели здесь в комментариях, это, похоже, не так. Не могли бы вы отредактировать свой ответ либо для объяснения sudoнастраиваемости и сравнить / сопоставить его pkexecс, либо отредактировать свой ответ, чтобы сказать, что разница отличается от настраиваемости?
Элия ​​Каган
2
«просто написать», а затем кусок XML. Мне нужен был этот смех.
Юрген А. Эрхард
14

С помощью sudo вы можете установить политики для каждого пользователя и программы для сохранения или сброса среды вызывающих в контексте sudo. Политика env_reset установлена ​​по умолчанию.

Вы не можете запускать графические приложения через pkexec без явной настройки для этого. Поскольку это всего лишь результат перезагрузки среды, это, очевидно, верно и для sudo. Однако обратите внимание, что ни pkexec, ни sudo не могут помешать злонамеренному приложению, работающему от имени пользователя root, получить всю необходимую информацию из диспетчера отображения или из файла X11-cookie пользователя. Последнее, оба или похожее, может даже быть сделано некорневыми приложениями в зависимости от обстоятельств.

Sudo не требует явных списков пользователей. Перечисление любой группы пользователей или даже установка разрешения для всех пользователей в целом может быть сделано. Директива target_pw позволяет этим пользователям проходить аутентификацию с учетными данными пользователя в том контексте, в котором они хотят запустить приложение, то есть root. Кроме того, одинаково традиционная программа su (su / gtksu / kdesu) может использоваться для того же самого без специальной настройки.

sudo также позволяет пользователю оставаться аутентифицированным в течение указанного времени. Опция называется тайм-аут, настраивается глобально, для пользователя или для приложения. Аутентификация может быть сохранена для tty или глобально для пользователя.

Хотя pkexec может не проверять аргументы, переданные в PROGRAM, sudo действительно имеет эту функцию. Признаюсь, однако, вы можете легко запутаться с этим, и это обычно не делается.

Вы можете немного настроить то, как вы хотите, чтобы программы запускались через pkexec: значок, текст для отображения, вы даже можете иметь материал для локализации и все такое. В зависимости от обстоятельств это может быть действительно изящно. Грустно, однако, что кто-то почувствовал необходимость изобретать велосипед для этой функции. Вероятно, это было бы чем-то, что можно поместить в графические оболочки gtksudo / kdesu.

Policykit - это только централизованная структура конфигурации. К сожалению, не очень. XML-файлы PK намного сложнее, чем то, что приложение может предоставить изначально без двоичных файлов. И никто не будет настолько безумным, чтобы использовать двоичные файлы ... о, gconf ... не бери в голову.

Пол Хенш
источник
8
Я понизил голосование, потому что этот пост на самом деле не является ответом, это критика другого ответа. Если вы чувствуете, что обычно лучше использовать sudo вместо pkexec, объясните свою точку зрения с помощью этих опровержений.
Flimm
4
Спасибо Пол, за много полезного анализа здесь! Но я также согласен с Flimm. Можете ли вы начать с простого ответа на заданный вопрос?
nealmcb
1
Нет, pkexec можно запустить графический интерфейс без настройки: askubuntu.com/a/332847/89385
akostadinov
8

Несколько вещей, как pkexecотличается sudoи его интерфейсы:

  1. Вы не можете запускать графические приложения pkexecбез явной настройки для этого.
  2. Вы можете немного изменить настройки запуска программ pkexec: значок, текст для отображения, запоминать пароль или нет, разрешать ли ему графический запуск и многое другое.
  3. Любой может запустить суперпользователя «Запуск от имени» (при условии, что он может аутентифицироваться как таковой), и sudoвы должны быть указаны в sudoersфайле как администратор .
  4. gksudoблокирует клавиатуру, мышь и фокус при запросе пароля, pkexecнет. В обоих случаях нажатия клавиш можно прослушивать, хотя .
  5. С pkexecвами работа в чуть более санированной среде.

Попробуйте например:

cd /etc/init.d
sudo cat README
# and now the same with pkexec
pkexec cat README
# nice, huh?
организовать
источник
Хороший вопрос (# 3) о том, как вы можете аутентифицироваться как другие пользователи для запуска программ, как rootс pkexec. Настраивается ли конфигурация, которую пользователи могут использовать pkexecвообще (даже если они знают пароль другого пользователя, которому разрешено это делать)? suнастраивается таким образом. Когда я пытаюсь обратиться suк другому не rootпользователю, как guestв системе Oneiric, он говорит мне, что мне не разрешено это делать. (Напротив, когда я пытаюсь использовать pkexecкак guestна Oneiric или Precise, я получаю то, что похоже на ошибку утверждения, о которой я могу вскоре сообщить как об ошибке, поскольку я не должен этого получать, даже если это не разрешено.)
Элия ​​Каган
2
Но sudoи его внешние интерфейсы также можно настроить, как описано в пункте 2. Вы можете запустить программу с отображенным текстомgksu или gksudo отобразить его , прекратить вводить пароли некоторых пользователей, отредактировав /etc/sudoers(с помощью visudo), и изменить продолжительность их запоминания в смысле изменения способа Время ожидания sudo истекает (хотя я не уверен, как это сделать в Ubuntu, который настроен таким образом, чтобы вопросы о том, sudoнужен ли пароль, и сколько времени, пока он не понадобится снова, зависят от терминала. ).
Элия ​​Каган
№ 4 не соответствует действительности, если вы используете GNOME Shell.
Муру
Нет, pkexec можно запустить графический интерфейс без настройки: askubuntu.com/a/332847/89385
akostadinov