Executando script de usuário com permissões de root

3

Eu tenho um script que eu fiz que precisa ter permissões de root para ativar e desativar os recursos do bluetooth. Eu estou ligando isso a um botão, então não é possível fazer login como root para executar o script. Como faço para definir corretamente as permissões de arquivo para o script? Eu sei que é uma boa prática fazer com que apenas o root possa editar e ler o arquivo, mas como posso dar a ele permissões completas de execução?

BT_RFKILL=$(rfkill list | grep tpacpi_bluetooth_sw | sed 's/\([0-9]\+\):.*//')
BT_STATE=$(rfkill list $BT_RFKILL | grep "Soft blocked: yes")

if [ "x" == "x$BT_STATE" ]; then
    sixad --stop
    sleep 2s
    rfkill block $BT_RFKILL
else
    rfkill unblock $BT_RFKILL
    sleep 2s
    sixad --start
fi
exit 0

O script é executado perfeitamente se eu o sudo, mas isso não é o ideal, já que eu adoraria executá-lo através de uma simples associação de chaves.

    
por MiguelHawk 27.03.2013 / 17:33

2 respostas

2

A maneira segura é provavelmente usar sudo nas linhas do script que chamam sixad e rfkill (suponho que ambos precisem de privilégios de root). Em seguida, configure os sudoers para permitir que esses comandos sejam executados sem uma senha pelo usuário ou grupo que deve executar o script.

    
por 27.03.2013 / 19:44
0

Você pode definir o setuid sinalizador para o script e definir o proprietário para a raiz (ou melhor, alguém que tenha permissões necessárias ). O sinalizador setuid significa que quando o script é executado por qualquer pessoa que possa executá-lo, o UID do processo é definido como seu proprietário.

Por exemplo, você pode ter um script de propriedade de joe , com sinalizador setuid ativado, então quando alice o executa, o próprio script tem privilégios de joe (como se Joe o executasse, mesmo que ele não esteja logado agora).

IIUC você quer rodar isto sob um servidor HTTP. Não tenho certeza se isso se aplica a todos os servidores, mas pelo menos o Apache no Debian se recusará a executar o script setuid'd. Permitirá apenas o executável binário. Eu resolvi isso criando um wrapper simples em C, que seria exec() do script usando caminho codificado.

No entanto, eu definitivamente tentaria evitar executar qualquer coisa como root remotamente: uma maneira muito mais segura é criar um usuário especial apenas para a tarefa específica, não tendo nenhum mais privilégios do que o necessário, e use a técnica acima. (Não tenho certeza, mas isso pode significar que a parte sobre o Apache não será aplicada - pode se aplicar apenas aos scripts do root).

Basicamente, como você atribui privilégios é tornando membro do usuário de determinado grupo. Muitas distribuições criam grupos específicos de dispositivos (como "cdrom", "fax" ...) para você. Veja se existe um grupo "bluetooth" no seu sistema; se houver, crie um novo usuário e torne-o membro desse grupo.

    
por 27.03.2013 / 17:51