ubuntu: permite que um usuário execute um script com permissões de root

9

Eu tenho o ubuntu 8.04 e quero escrever um script bash que é executado como roottodo usuário pode executar.

Eu mesmo posso fazer sudo.

Como faço isso?

ESCLARECIMENTO : Não quero fazer isso com o sudo, porque os usuários terão que digitar sua senha. Eu só quero que eles executem o script como root, talvez algo definido, não sei.

flybywire
fonte

Respostas:

23

Se este fosse um binário normal, você poderia configurar executando

# chmod u+s /path/to/binary

Infelizmente, os scripts não podem ser configurados. (Bem, você pode, mas é ignorado). A razão para isso é que a primeira linha do script informa ao SO em que intérprete executar o script. Por exemplo, se você tivesse um script com:

#!/bin/bash

Você acabaria correndo

/bin/bash /path/to/script

Obviamente, você precisaria que o intérprete fosse setuid, o que significaria que todos os scripts seriam setuid. Isso seria ruim.

Você pode fazer isso com o sudo colocando o seguinte no arquivo / etc / sudoers executando o visudo.

ALL ALL=NOPASSWD: /path/to/script

E agora qualquer usuário pode executar

$ sudo /path/to/script

Isso permite que eles executem o script sem digitar sua senha.

Existe uma alternativa que não requer sudo no comando, que exige a criação de um pequeno binário configurado que executa seu script, mas cada binário adicional adicionado adiciona outro possível problema de segurança.

David Pashley
fonte
Eu acho que essa é a resposta que eu estava procurando. Não posso definir um script bash, apenas um binário? (Claro, eu iria tomar medidas para torná-lo editável)
fly-by-wire
Não, você não pode criar um script setuid.
Wfaulk 18/10/09
wfaulk: Você costumava conseguir, mas as distribuições Linux mais recentes não permitem mais isso. Você pode usar uma ferramenta como shc para 'compilar' o script e torná-lo setuid.
Kyle Brandt
wfaulk: Claro, que seria sair de seu caminho para fazer algo que é intencionalmente desativado, por isso é provavelmente uma má idéia :-)
Kyle Brandt
Substitua o termo ALLpor um nome de usuário para permitir que apenas um sudoer possa ser executado sem inserir uma senha.
Hdave
3

Eu precisava inserir essa linha NO FINAL do / etc / sudoers: ALL ALL = NOPASSWD: <filename> Aparentemente, uma %admin ALL=(ALL) ALLsubstituição posterior exigia uma senha para usuários administrativos.

Não há nenhum problema de segurança que permita que um script seja executado como root, desde que ele execute uma ação permitida, bem determinada, inofensiva e, se os valores de qualquer parâmetro não puderem causar o mau comportamento do script.

Mas há uma pegadinha ...

Sempre use caminhos completos nos nomes de comando e arquivo. Se você escrever algo como echo Hello world!em myrootscript, alguém pode escrever um ~/bin/echo scripte myrootscriptseria executado como root o que está nele.

/bin/echo "Hoping this will keep you safe" :-)

André
fonte
se for possível para um usuário não raiz na máquina editar esse script, é possível que esse usuário assuma o controle da máquina. Se o mesmo usuário tiver uma senha fraca, nada impedirá que sua máquina seja totalmente comprometida.
Hdave
2

Por padrão, os membros do wheelgrupo têm permissão para sudoqualquer comando como root. Provavelmente é assim que você está usando sudoaté o momento.

Para permitir outro usuário, você precisará criar uma sudoersregra. Por exemplo:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Permitirá que o usuário mickey.mousepara executar o comando /usr/local/bin/test.shcomo rootsem exigir um prompt de senha adicional.

Você deve ler este documento para obter mais informações.

Dan Carley
fonte
O Debian / Ubuntu usa o grupo admin em vez do wheel. É possivelmente um nome um pouco mais preciso.
David Pashley
Chame-me antiquado, mas ..;)
Dan Carley
1
antiquado: P
David Pashley
0

Use chmod +s <filename>para ver o bit suid. Isso significa que, quando o arquivo é executado, ele é executado com as permissões do proprietário do arquivo (então faça o root para fazer root para fazê-lo funcionar dessa maneira).

No entanto, isso pode ser MUITO perigoso com algo como scripts bash, porque um usuário encontra uma maneira de alterá-lo, podendo facilmente obter um shell raiz. Certifique-se de que não possa ser gravado por ninguém, exceto root.

O Linux não permite que você defina scripts, para fazer isso, você precisará compilá-lo como um programa. Em vez disso, você pode usar o arquivo sudoers (/ etc / sudoers) e adicionar uma linha como esta.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
fonte
0

Outra alternativa: você pode criar um pequeno wrapper C setuid em torno desse script que

  • verifica todas as limitações que você pode aplicar (lista de usuários, hora, carregamento do sistema, ...)
  • execução de logs / auditorias, se desejado
  • execs o script

Como o seu próprio subconjunto das múltiplas capacidades de sudo.

mpez0
fonte