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

13

Eu quero dar acesso não sudo a um usuário não root na 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 precisa executar um comando, ele digita,

sudo rndc reload

Existe uma maneira de me livrar desse sudo, mas apenas em um conjunto específico de comandos (e apenas no dns-manager)?

Anss
fonte
5
O controle de acesso discricionário como esse é praticamente o que sudoserve. Quais são as suas objeções comerciais ao uso dele sudopara isso?
21915 MadHatter
1
@ Peterh Repito minha pergunta: controle de acesso discricionário (ou seja, delegação parcial do sysadm) é o papel de sudo. Quais são as objeções?
MadHatter
3
Que tal sem senha sudo, então? Ou sudo com senha para executar a ferramenta de gerenciamento de DNS , que pode operar com namedprivilégios de grupo ou usuário ou privilégios de root, conforme necessário.
MadHatter
4
@ Peterh "uma boa razão para fazê-lo desta maneira" seria o bit que faltava. Normalmente, perguntas como essa acabam sendo problemas XY disfarçados, e acho que entender o problema subjacente é essencial para respondê-las de maneira completa e profissional.
MadHatter
2
@ Peterh Acho que estamos concordando um com o outro. Eu também quero ver o OP melhorar sua pergunta; detalhar isso funciona bem para mim como uma maneira de ajudar o autor a pensar fora da caixa que ele construiu em torno de si. Ele pode muito bem ter um bom motivo para querer evitar sudo. Ao tentar expressar isso para nós, ele pode esclarecer nossa confusão ou a dele - ou as duas!
MadHatter

Respostas:

31

Se entendi corretamente os seus comentários, 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 solicitação. Além disso, em muitas distribuições de SO, o sudo assumirá o padrão de exigir um TTY - que este programa pode não ter.

No entanto, o sudo pode ter uma estrutura de permissões muito refinada, possibilitando 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 que você escolher, o usuário poderá emitir o comando sudo rndc reloadsem precisar digitar uma senha.

(Além disso, este pode ser desnecessário, mas ... por favor, lembre-se de fazer uma cópia de backup de seu arquivo sudoers antes de editá-lo, para manter uma concha onde você está aberto raiz no caso de você precisar reverter para o backup, e para editar -lo usando visudoem vez de sudo vi /etc/sudoers. Esperemos que estas precauções será desnecessária, mas ... melhor tê-los e não precisa deles do que o inverso!)

1. Se você não deseja solicitar um TTY para qualquer solicitação

A maneira mais fácil de se livrar dos requisitos TTY (se houver) é garantir que a linha que começa com Defaultsin /etc/sudoersnão contenha a palavra requiretty- em vez disso, deve conter !requiretty. No entanto, se você fizer isso, significa que nenhum comando 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ê deseja solicitar 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ê deseja solicitar 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, assim:

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
Jenny D
fonte
Obviamente, isso pode ser combinado com um script de invólucro que chama o comando usando sudo, se por algum motivo você não puder usar o sudo diretamente, mesmo sem senha.
Jenny D
4

Sim. O sudo pode ser configurado de maneira 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 em que outros controles estão em vigor (portanto, você pode conceder esses privilégios aprimorados ao seu subordinado fiel, mas não deve fazer isso para um cliente que você conhece apenas da rede).

A configuração do sudo está presente /etc/sudoersna maioria dos sistemas. Você pode descobrir sua sintaxe pesquisando no Google ou por um man sudocomando.

Você não deve editar este arquivo diretamente; isso pode levar a condições de corrida de segurança. Em vez disso, use o visudocomando (que é um invólucro em torno de sua $EDITORvariável de ambiente).


Depois de configurar o sudo, você pode facilmente envolvê-lo nos comandos visíveis. É muito simples:

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

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

  3. Coloque esse diretório em sua PATHvariável de ambiente (por exemplo, por um sistema ou local .profile).

peterh - Restabelecer Monica
fonte
Por curiosidade - por que você usaria execno script shell em vez de simplesmente chamar o comando diretamente? (Eu não estou dizendo que é errado, eu só gostaria de saber por que você faria isso para que eu possa talvez aprender algo)
Jenny D
2
Eu terminei com o bit sudo sem senha, a ideia dos scripts do wrapper é ótima.
Anss
2
@ JennyD :-) Por causa da estabilidade e desempenho. No caso de exec, o comando chamado será substituído no lugar do shell. A concha vai embora. Sem um executivo, o shell iniciará esse comando, aguardará sua finalização e sairá. Este segundo, sem exec, significa vários processos de cooperação, desnecessários. Mas não há grande diferença, sem o executivo isso funcionaria tão bem quanto com isso.
peterh - Restabelece Monica
@JennyD My plea :-)
peterh - Reinstala Monica
@ Snowbody Muito obrigado pelas palestras! É uma grande honra.
peterh - Restabelece Monica
2

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

rndcpode se comunicar com qualquer namedprocesso por meio de um soquete local ou de uma porta remota, usando uma chave secreta para se autenticar. Por padrão (ou pelo menos para o debian, que é a distribuição que eu uso), esse arquivo pode ser encontrado /etc/bind/rndc.keye normalmente é legível apenas para usuários binde grupos bind.

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

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

Shadur
fonte
-1

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

bbaassssiiee
fonte