Posso fazer um script sempre ser executado como root?

27

Como fazer um script ser executado como root, independentemente de quem o executa?

Eu li sobre o setuid, mas não sei como fazer isso.

Estou usando o Linux, Ubuntu 12.04 LTS.

HappyDeveloper
fonte
Em qual distribuição do Linux você está? Ou Unix, mesmo?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidnão funcionará em scripts - está desativado por razões de segurança na maioria das distribuições * nix atualmente. Você pode configurá-lo, mas será ignorado. Talvez você possa explicar mais sobre o seu problema real para que possamos ajudá-lo a resolver isso. Que script é esse? Por que você precisa que ele seja executado como root? Está usando sudouma alternativa?
slhck
Você já tentou sudo -s?
Nam Phung

Respostas:

29

Tenha muito cuidado: scripts combinados com setuid são perigosos!

Primeiro, dê uma olhada nesta pergunta / respostas , especialmente nesta resposta e aviso de segurança .

Se você ainda deseja executar seu script com setuidset, pode escrever um programa C curto como wrapper e definir o setuidbit no binário compilado.

Exemplo de wrapper:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Outra solução usando sudo(mencionada aqui ):

  1. Como root, impeça o acesso de gravação (e talvez outro) ao seu script:

    raiz do chown /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Verifique se ninguém, exceto o root, pode substituir o script , por exemplo, modificando os direitos de acesso da pasta pai:

    raiz do chown / absoluta / caminho / para / seu /
    chmod 755 / absoluto / caminho / para / seu /
    
  3. Modifique os direitos de acesso do sudo /etc/sudoerscom visudo:

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Mais detalhes sobre as configurações (por exemplo, restringindo o acesso a usuários ou grupos específicos) podem ser encontrados na página de manual do sudoers.

Depois, todos os usuários podem executar o script como root sem senha:

sudo /absolute/path/to/your/script.sh

Isso é semelhante ao uso da solução wrapper / setuid acima.

speakr
fonte
3
Os perigos específicos não são muito óbvios, mas giram fortemente em torno do ambiente. Diferentemente da maioria dos programas, o comportamento de um script de shell pode ser alterado significativamente por dezenas de variáveis ​​de ambiente, o suficiente para que, sem extensas salvaguardas, esse script possa ser facilmente levado a executar código arbitrário.
22712 Stephanie
1
Você deve adicionar uma chamada a clearenv () antes da chamada do sistema nesse wrapper, expulsando completamente o ambiente, para que não haja configurações incorretas para manipular o script. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@ Stephanie Devo estar fazendo algo errado, porque tudo isso parece muito louco para uma tarefa comum. Isto é o que estou tentando fazer: serverfault.com/questions/401405/…
HappyDeveloper
@HappyDeveloper Não é muito louco por um script setuid, já que um mal protegido é um caminho de raiz para qualquer um que consiga executá-lo.
22712 Stephanie
4
sudopode ser usado para dar a todos os usuários acesso a um programa (ou script) específico. Nesse sentido, ele atua como um invólucro setuid chique. Parece que normalmente seria uma escolha melhor do que escrever seu próprio invólucro setuid.
Jjlin 22/06
4

A maneira mais fácil e segura é usar os bits SETUID nas permissões de arquivo. dessa forma, as permissões de comando serão elevadas para permissões de proprietário de arquivo.

para impedir que o script da edição não defina a gravação para todos os bits.

Tadas
fonte
0

Não sei se isso pode ser útil, mas, para tornar o script executado apenas como root, você pode usar este shebang na primeira linha do script:

#!/bin/su root
alexandre1985
fonte