Possível verificar a capacidade de sudo antes de sudo'ing?

11

Estou escrevendo um pequeno programa utilitário. Eu gostaria que tentasse sudoexecutar algo, se necessário.

Ou seja: se as permissões do arquivo não permitirem que o usuário atual opere em um arquivo específico (e as sudoregras permitiriam), eu gostaria que meu utilitário sudoexecutasse algo como o proprietário do arquivo.

Espero verificar essa capacidade antecipadamente, porque eu preferiria que os logs do sistema não fossem preenchidos com ruído devido a sudotentativas falhas . Como sudoele próprio relata a falha: "Este incidente será relatado".

Então, espero verificar programaticamente: pode user <x>executar command <y>via sudo?

Aqui está o problema: enquanto /etc/sudoerscontém esse mapeamento, ele é de propriedade da raiz e não pode ser lido por usuários comuns.

Eu estava pensando em gerar um subprocesso para executar sudo -l(que gera comandos que o usuário atual pode executar com sudo). Eu então analisaria a saída disso. No entanto, isso parece um pouco frágil. O resultado contém as informações que eu quero, mas parece que ele foi projetado para humanos lerem (não para consumo programático). Não sei se existe alguma garantia de que a saída seguirá o mesmo formato no futuro ou em plataformas diferentes.

A análise programática da sudo -lprodução é considerada segura? Caso contrário, existem opções melhores para determinar antecipadamente se um comando sudo seria bem-sucedido?


(informações gerais sobre X / Y: este utilitário é para ser usado por uma conta de função de acesso limitado. Espero que outros usuários efetivamente optem por permitir que a conta de acesso limitado opere em seus arquivos por meio de regras sudo. No entanto, ganhei saber antecipadamente qual desses outros usuários possui a regra relevante do sudo)

Peter Martin
fonte
3
Eu recomendo que você adote uma abordagem um pouco diferente. Em vez de ter regras por usuário, por que não ter um grupo que tenha permissão para fazer o que você quiser. Dessa forma, você pode simplesmente verificar se o usuário está no grupo. Seria uma alternativa decente?
terdon

Respostas:

13

De acordo com a página de manual do sudo:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

então isso vai se resumir a

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Como apontado por Muru, use um -U $USERou -U $USERTOTESTou nada, dependendo da sua necessidade.

Archemar
fonte
Se você quis $USERdizer o usuário atual, você pode simplesmente fazê-lo sudo -l <command>, sem -U $USER.
Muni
Obrigado - isso é útil. Uma coisa que notei ao testar essa abordagem é que ela não parece cuidar dos casos em que a regra sudo foi configurada para permitir que TODOS os comandos com exceções específicas, como (targetUser) ALL, !/usr/bin/foo .. nesse caso, sudo -l -u targetUser /usr/bin/fooainda pareçam /usr/bin/foosair e sair com status 0. Ainda assim, é basicamente o suficiente para minha verificação simples e é melhor do que analisar a sudo -lsaída mais detalhada .
27678 Peter