Permitir que os usuários executem apenas binários específicos com permissões / privilégios de root

7

Gostaria de permitir que um usuário específico consiga sudo /sbin/iptables apenas.

Eu tenho um script bash que configura o iptables. O problema é que configurar /sbin/iptables como sudoable não é suficiente - O script em si também tem que ser sudoable.

O problema é que esse arquivo pode ser editado pelo usuário (ele pode alterar configurações lá), dando a ele a capacidade de executar qualquer comando como root.

Qual é a abordagem adequada para esse problema?

    
por iTayb 13.08.2011 / 03:12

4 respostas

6

Eu posso ver dois métodos:

  1. Permita que o usuário use /sbin/iptables a sudo sem restrição (que é algo perigoso, isso significa que você confia no usuário de alguma forma) e execute o script com as permissões do usuário. O script invocará sudo cada vez que /sbin/iptables for necessário. Isto está assumindo que a execução do script será rápida, uma vez que alguma entrada de senha será necessária em intervalos regulares¹.

    • Vantagem: você não precisa ter nenhuma confiança no script.
    • Desvantagem: como já mencionado, permitir que o usuário use /sbin/iptables sem restrição é algo perigoso.
  2. Permite que o usuário chame apenas o script através de sudo .

    • Vantagem: o uso de /sbin/iptables é restrito pelo script.
    • Desvantagem: o script deve ser perfeito.

Sobre o problema que você mencionou: se o script pertence a root e tem permissões usuais: rwxr-xr-x , outros usuários não podem modificá-lo, só podem executá-lo (eventualmente através de sudo para obter mais privilégios ).

Com a solução 2 e, no caso de scripts de shell (em comparação com binários / programas mais robustos), tenha cuidado com as variáveis de ambiente e os vários fatores externos que podem modificar a execução do seu script. Verifique se a configuração do sudo redefine corretamente a definição de todas as variáveis potencialmente prejudiciais.

-
1. De fato, sudo pode ser configurado com NOPASSWD , se necessário.

    
por 13.08.2011 / 04:51
3

Da wikipedia:

setuid and setgid (short for "set user ID upon execution" and "set group ID upon execution", respectively)[1] are Unix access rights flags that allow users to run an executable with the permissions of the executable's owner or group. They are often used to allow users on a computer system to run programs with temporarily elevated privileges in order to perform a specific task. While the assumed user id or group id privileges provided are not always elevated, at a minimum they are specific.

Tente algo assim

stefan@linux-ulsk:/usr/bin> zypper up
Root privileges are required for updating packages.
linux-ulsk:~ # whereis zypper
zypper: /usr/bin/zypper /usr/bin/X11/zypper /usr/include/zypper /usr/share/zypper /usr/share/man/man8/zypper.8.gz
linux-ulsk:~ # chmod u+s /usr/bin/zypper
linux-ulsk:~ # exit
stefan@linux-ulsk:/usr/bin> zypper up
Retrieving repository ...

Eu poderia começar o zypper sem ser uma raiz, o que eu não pude antes.

Tenha cuidado com setuid e setgid! Algumas citações do livro:

Never give shell scripts setuid permission. Several techniques for subverting them are well known.

    
por 13.08.2011 / 09:08
0

Você pode tentar alterar o proprietário do grupo do arquivo e adicionar seu usuário a esse grupo. Então você poderia chmod o arquivo para atribuir permissões de grupo, o que permitiria fazer o que você precisa.

É uma solução instável, mas funcionaria.

    
por 13.08.2011 / 04:13
0

Certifique-se de que você (ou uma conta apropriada) seja o proprietário do arquivo e torne o arquivo apenas gravável por você, não pelo grupo. Assim, suas permissões seriam algo como 750, supondo que seu usuário esteja no grupo correto.

Se eles podem executar, mas não escrever o arquivo, então você pode adicionar esse comando à sua lista sudo.

    
por 13.08.2011 / 04:50