Quando usar o pkexec vs. gksu / gksudo?

77

Existem duas maneiras gerais de executar aplicativos graficamente como raiz (ou, mais geralmente, como outro usuário). Programas como gksu, gksudo, e kdesudosão interfaces gráficas para sudo. Por outro lado, pkexecé uma interface gráfica para o PolicyKit .

Ao executar manualmente programas como root (ou como outro usuário não root), quais são as vantagens / desvantagens (se houver) do uso pkexec, em comparação com o método mais tradicional de usar um sudofront - end?

Eliah Kagan
fonte
Veja também: askubuntu.com/questions/252962/…
Caracol mecânico
Relacionado (mas não duplicado): O sudo -i é menos seguro que o pkexec?
Eliah Kagan

Respostas:

25

O PolicyKit é mais configurável, embora pkexecnão faça uso dessa configurabilidade. Além disso, pkexecmostre ao usuário o caminho completo do programa que será iniciado, para que o usuário tenha um pouco mais de certeza do que acontecerá. As chamadas 'políticas' do PolicyKit podem ser usadas para definir mais configurações avançadas. Por exemplo, se a senha deve ser lembrada.

Algo que recebi do pkexecmanual:

O ambiente em que o PROGRAM o executará será definido como um ambiente conhecido e seguro mínimo para evitar a injeção de código por meio de LD_LIBRARY_PATH ou de mecanismos semelhantes. Além disso, a variável de ambiente PKEXEC_UID é configurada para o ID do usuário do processo que chama o pkexec. Como resultado, o pkexec não permitirá que você execute, por exemplo, aplicativos X11 como outro usuário, pois a variável de ambiente $ DISPLAY não está definida.

Mais informações sobre políticas ou definições de ação do pkexecmanual:

   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
fonte
1
Eu acho que deveria ter dito que existem dois para executar aplicativos como root com autenticação gráfica . Eu tinha assumido que havia uma maneira de usar pkexecpara executar aplicativos gráficos (eu nunca tinha feito isso ...). Sua resposta explica por que não existe (ou pelo menos por que um ambiente personalizado precisa ser especificado para fazê-lo).
Eliah Kagan
1
Porém, tenho uma pergunta sobre sua resposta - quando um programa é executado como root pkexec, em que sentido os recursos ("permissões") podem ser restringidos? Eu concedo a um programa a capacidade de fazer qualquer coisa quando o executo sudoou com um sudofront - end ... em que sentido executar um programa como root pkexectambém não faz isso?
Eliah Kagan
3
Entendo que o PolicyKit é usado para permitir que os programas executem apenas tipos específicos de ações. Mas isso pkexecfacilita, ou pkexecsimplesmente executa as coisas como raiz com habilidades irrestritas? O pkexectrecho manual incluído em sua resposta documenta como escrever regras para determinar quem pode executar um programa como root (ou como outro usuário não root), e não o que o programa pode fazer.
Eliah Kagan 12/11/11
4
Quero aceitar sua resposta, pois fornece muitas informações boas. Mas acho que é muito enganador, porque diz que pkexecé mais configurável do que sudo, e dada a discussão que tivemos aqui nos comentários, isso não parece ser o caso. Você consideraria editar sua resposta para explicar sudoa configurabilidade e compará-la / contrastar com pkexeca ou editar sua resposta para dizer que a diferença é algo diferente de configurabilidade?
Eliah Kagan
2
"simplesmente escreva" e depois um pedaço de XML. Eu precisava daquela risada.
Jürgen A. Erhard
14

Com o sudo, você pode definir políticas por usuário e por programa sobre o tempo para reter ou redefinir o ambiente de chamadas no contexto do sudo. A política env_reset é definida por padrão.

Você não pode executar aplicativos gráficos via pkexec sem configurá-lo explicitamente para isso. Como isso é apenas um resultado da redefinição do ambiente, isso também é obviamente verdadeiro para o sudo. Observe, no entanto, que nem o pkexec nem o sudo podem impedir que um aplicativo malévolo seja executado como root para recuperar todas as informações necessárias dos gerenciadores de exibição ou do arquivo de cookie X11 dos usuários. O último, ambos ou similar, pode até ser feito por aplicativos não raiz, dependendo das circunstâncias.

Sudo não requer listagens explícitas de usuários. É possível listar qualquer grupo de usuários ou mesmo definir uma permissão para todos os usuários em geral. A diretiva target_pw permite que esses usuários se autentiquem com as credenciais do usuário em cujo contexto desejam executar um aplicativo, ou seja, raiz. Além disso, o igualmente tradicional programa su (su / gtksu / kdesu) pode ser usado para fazer o mesmo sem configuração especial.

O sudo também permite que o usuário permaneça autenticado por um tempo especificado. A opção é denominada timeout, configurável globalmente, por usuário ou por aplicativo. A autenticação pode ser mantida por tty ou globalmente por usuário.

Enquanto o pkexec pode não validar os ARGUMENTOS transmitidos ao PROGRAMA, o sudo realmente possui esse recurso. Admitido, porém, você pode facilmente mexer com isso, e isso normalmente não é feito.

Você pode ajustar um pouco a forma como deseja que os programas sejam executados via pkexec: icon, texto a ser exibido, você pode até ter informações sobre localização e tudo mais. Dependendo das circunstâncias, isso pode ser realmente bacana. Triste, porém, que alguém sentisse a necessidade de reinventar a roda para esse recurso. Provavelmente isso seria algo para colocar nos wrappers gráficos do gtksudo / kdesu.

O Policykit é apenas uma estrutura de configuração centralizada. Infelizmente não é bonito. Os arquivos XML de PKs são muito mais complicados do que qualquer coisa que um aplicativo possa fornecer nativamente sem arquivos binários. E ninguém seria tão maluco em usar binário ... oh gconf ... deixa pra lá.

Paul Hänsch
fonte
8
Fiz uma votação negativa porque este post não é realmente uma resposta, é uma crítica a outra resposta. Se você acha que geralmente é uma opção melhor usar sudo em vez de pkexec, diga-o, explicando seu ponto de vista com essas refutações.
Flimm
4
Obrigado Paul, por muitas análises úteis aqui! Mas eu também concordo com Flimm. Você pode começar com uma resposta simples para a pergunta, conforme solicitado?
Nellmcb
1
Não, pkexec pode executar a GUI sem configurar: askubuntu.com/a/332847/89385
akostadinov
8

Algumas coisas em que pkexecé diferente sudoe suas interfaces:

  1. Você não pode executar aplicativos gráficos pkexecsem configurá-lo explicitamente para isso.
  2. Você pode ajustar um pouco a forma como deseja que os programas sejam executados via pkexec: ícone, texto a ser exibido, lembrando-se da senha ou não, permitindo que seja executada graficamente e um pouco mais.
  3. Qualquer um pode executar um superusuário "Executar como" (desde que possa se autenticar como tal), sendo necessário que sudovocê seja listado no sudoersarquivo como administrador .
  4. gksudobloqueia o teclado, o mouse e o foco ao solicitar uma senha, pkexecnão. Em ambos os casos, as teclas são detectáveis .
  5. Com pkexecvocê trabalha em um ambiente um pouco mais higienizado.

Tente por exemplo:

cd /etc/init.d
sudo cat README
# and now the same with pkexec
pkexec cat README
# nice, huh?
organizar
fonte
Bom ponto (# 3) sobre como você pode se autenticar como outros usuários para executar programas como rootcom pkexec. É configurável, quais usuários podem usar pkexec(mesmo se souberem a senha de outro usuário que tenha permissão para fazê-lo)? sué configurável dessa maneira. Quando tento suoutro rootusuário não como guestem um sistema Onírico, ele diz que não tenho permissão para fazê-lo. (Em contraste, quando eu tento usar pkexeccomo guestem Oneiric ou preciso, fico com o que parece ser um erro de declaração, que logo eu possa relatar como um erro, como eu não deveria ter que mesmo que não é permitido.)
Eliah Kagan
2
Mas sudoe suas interfaces também podem ser aprimoradas conforme descrito no ponto 2. Você pode executar um programa com gksuou gksudo exibir texto personalizado , parar de precisar das senhas de alguns usuários editando /etc/sudoers(com visudo) e alterar por quanto tempo elas são lembradas no sentido de alterar como quanto tempo leva para o sudo atingir o tempo limite (embora eu não tenha certeza de como fazer isso no Ubuntu, que está configurado para que as perguntas sobre a necessidade ou não de sudouma senha e quanto tempo até que ela precise ser novamente) sejam específicas do terminal )
Eliah Kagan
# 4 não é verdade se você estiver usando o GNOME Shell.
muru
Não, pkexec pode executar a GUI sem configurar: askubuntu.com/a/332847/89385
akostadinov