Dando acesso a um conjunto de comandos para um usuário não-root sem sudo

13

Eu quero dar acesso não-sudo a um usuário não-root em minha máquina, existe um usuário dns-manager, sua única função é executar todos os comandos BIND (rndc, dnssec-keygen) etc.

Agora toda vez que ele tem que executar um comando, ele digita,

sudo rndc reload

Existe uma maneira de me livrar desse sudo, mas apenas em um determinado conjunto de comandos (e somente para o dns-manager)?

    
por Anss 18.03.2015 / 08:46

4 respostas

31

Se eu entendi seus comentários corretamente, o problema aqui é que o comando será emitido por meio de uma conexão que não tem a capacidade de inserir a senha que o sudo usa como padrão para solicitar. Além disso, em muitas distribuições do sistema operacional, o sudo usará como padrão o TTY - que este programa pode não ter.

No entanto, o sudo é capaz de ter uma estrutura de permissões muito refinada, permitindo que um ou mais usuários emitam um comando específico sem senha e TTY. Abaixo, mostrarei três maneiras de configurar isso para suas necessidades. Qualquer um que você escolher, o usuário agora poderá emitir o comando sudo rndc reload sem precisar digitar uma senha.

(Além disso, isso pode ser desnecessário, mas ... por favor lembre-se de fazer uma cópia de backup do seu arquivo sudoers antes de editá-lo, para manter um shell onde você está root aberto no caso de você precisa reverter para o backup e editá-lo usando visudo em vez de sudo vi /etc/sudoers . Espero que essas precauções sejam desnecessárias, mas ... melhor tê-las e não precisar delas do que o inverso!)

1. Se você não quer exigir um TTY para quaisquer solicitações

A maneira mais fácil de se livrar dos requisitos de TTY (se houver) é garantir que a linha que começa com Defaults em /etc/sudoers não contenha a palavra requiretty - em vez disso, ela deve conter !requiretty . No entanto, se você fizer isso, significa que o comando no sudo exigirá um tty!

Você também precisará adicionar a linha

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Se você quiser exigir um TTY para todos os usuários, exceto este

Isso pode ser feito definindo um padrão para esse usuário, assim:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Se você quiser requre um TTY para todos os comandos exceto este comando por este usuário

Isso é um pouco mais complexo, devido à sintaxe do arquivo sudoers. Você precisaria criar um alias de comando para o comando e, em seguida, definir um padrão para esse alias de comando, da seguinte forma:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD
    
por 18.03.2015 / 09:34
4

Sim. O sudo pode ser configurado de forma muito flexível. Mesmo assim, devo mencionar: esses tipos de soluções não devem ser considerados muito seguros, e devem ser usados apenas em um ambiente cooperativo onde outros controles estão no lugar (assim, você pode dar esses privilégios aprimorados ao seu subordinado leal, mas não deve fazer isso para um cliente que você conhece apenas da rede).

A configuração do sudo está em /etc/sudoers na maioria dos sistemas. Você pode descobrir sua sintaxe por Googling ou por um comando man sudo .

Você não deve editar este arquivo diretamente; isso pode levar a condições de corrida de segurança. Em vez disso, use o comando visudo (que é um wrapper em torno da variável de ambiente $EDITOR ).

Depois de configurar o sudo, você pode agrupar facilmente os comandos visíveis. É muito simples:

  1. Crie um diretório para uma lista de seus scripts de wrapper sudo (por exemplo, /usr/local/dnsadmin/bin )
  2. Crie um script de wrapper para os comandos que você deseja que sejam utilizáveis sem o sudo. Será um comando muito simples, por exemplo, /usr/local/dnsadmin/bin/rndc será:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Obtenha este diretório em sua variável de ambiente PATH (por exemplo, em todo o sistema ou em seu local .profile ).

por 18.03.2015 / 09:06
1

Embora esta não seja uma solução geral no caso específico de rndc , você não precisa de sudo .

rndc pode se comunicar com qualquer processo named por meio de um soquete local ou de uma porta remota, usando uma chave secreta para autenticar-se. Por padrão (ou pelo menos, para debian, que é a distro que eu uso) esse arquivo pode ser encontrado em /etc/bind/rndc.key e normalmente é legível apenas para o usuário bind e group bind .

Qualquer pessoa que tenha acesso de leitura a esse arquivo de chave (ou uma cópia idêntica dele) pode usar rndc para controlar o servidor BIND, portanto, a solução mais fácil nesse caso específico seria adicionar o usuário à bind grupo.

Um número surpreendente de daemons comuns tem algo parecido (eu pessoalmente ainda estou descobrindo as possibilidades dos powerdns a esse respeito, mas parece promissor até agora). Se você não quiser fazer sudo , precisará verificar se o que deseja realizar é possível caso a caso.

    
por 19.03.2015 / 06:48
-1

Você não quer usar o sudo para conceder root para alguns comandos. Em vez disso, você poderia chmod 4750 um programa específico [que pode envolver o comando], para elevar os direitos de um usuário normal para executá-lo como root.

    
por 19.03.2015 / 15:29

Tags