Como posso permitir que um usuário edite um arquivo de sistema específico normalmente restrito à raiz?

8

Estou tentando escrever para /etc/network/interfacesum usuário que não tem privilégios de root.

O motivo para querer escrever sobre isso seria permitir ao usuário definir um IP estático, pois estou executando um servidor somente de linha de comando. Em que permissão eu preciso fornecer o usuário etc/sudoers?

Não quero que o usuário tenha permissões de root completas. Apenas capacidade de editar este arquivo.

Keith
fonte

Respostas:

25

Em vez de usar sudo, basta definir uma ACL no arquivo:

$ ls -l /var/tmp/foo
-rw-rw---- 1 root root 4 Jul 31 15:26 /var/tmp/foo
$ sudo setfacl -m u:white:rw /var/tmp/foo
$ whoami
white
$ cat /var/tmp/foo
bar

Agora, o arquivo pertence a 'root', mas o usuário 'white' pode ler e gravar nele. O usuário 'white' agora pode usar seu editor favorito para editar o arquivo.

Jeff White
fonte
Um pouco confuso. Is /var/tmp/foo= /etc/network/interfaces? Nunca realmente vi o que você está tentando dizer lá, sou muito novo no Linux.
Keith
É apenas um arquivo. Você pode usar o arquivo que desejar.
Jeff White
1
Agradável. Eu pensei que as ACLs só poderiam ser usadas para restringir permissões e não concedê-las - é bom saber que não é verdade!
Rmano 31/07
Não parece ser suportado pela WSL:setfacl: /etc/logrotate.conf: Operation not supported
mpen 16/01
8

Prepare um script que faça a edição desejada, por exemplo, um script que grave o arquivo correto com o IP estático (o que colocar neste script está fora do escopo desta seção de perguntas e respostas). Vamos chamar esse script /root/set_static_ip. (1)

Edit /etc/sudoers(2) (com visudoé melhor, ele verifica a sanidade, é muito difícil recuperar um sistema com um arquivo sudoers inválido, mesmo impossível a partir do controle remoto (3)) e adicione

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Agora esse usuário pode usar sudo /root/set_static_ip sem nenhuma senha solicitada e o script será executado com todos os privilégios; nenhum outro comando será permitido.

Se você quiser que o usuário substitua apenas um arquivo pelo que ele quiser, o script pode ser simplesmente (chame-o /root/unsafe-overwrite-interface)

#! /bin/bash -e
#
cp /tmp/temp-iface.txt /etc/network/interfaces 
exit 0

... e você diz ao usuário para editar /tmp/temp-iface.txte depois executar sudo /root/unsafe-overwrite-interface--- habilitando-o em sudoers, conforme especificado acima. Ou você pode adicionar o usuário a uma lista da ACL e conceder permissão de gravação no arquivo específico .

Mas observe que, se você não verificar o conteúdo do arquivo quanto à segurança, ocorrerá um caos , intencional ou não intencional.


Notas de rodapé :

(1) esse script deve ser o mais seguro possível. Verifique as entradas e assim por diante. Será executado com permissões completas.

(2) na instalação moderna do sudo, você pode adicionar um arquivo ao /etc/sudoers.d/diretório que é melhor - sobreviverá às atualizações.

(3) Normalmente, mantenho um terminal com uma sessão raiz aberta ( sudo -i) quando modifico o mecanismo sudoers e um backup à mão.

Rmano
fonte
O único problema com isso é que as configurações de IP estático precisam ser alteradas sob demanda. Meu entendimento do script que você recomenda basicamente reescreveria o /etc/network/interfacesarquivo para o que quer que /root/set_static_ipseja. A menos que você possa criar um script que solicite ao usuário que insira endereço IP, gateway, etc ... Isso eu não sou bom o suficiente para fazer.
Keith
Você pode escrever um script que aceite parâmetros ... mas sim, esta é a maneira mais segura. Se você permitir que o usuário edite o arquivo às cegas, o que acontecerá se eles cometerem um erro? Você pode ter seu servidor fora de alcance ... para que o script não apenas peça de alguma forma os parâmetros, mas verifique se eles são seguros.
Rmano 31/07
3
Quanto a /etc/sudoersisso visudo, não é sudoedit.
saiarcot895
Se alguém está fazendo esse tipo de pergunta, provavelmente está além de suas habilidades escrever um script bash seguro. Há um motivo para você não poder configurar o script bash como root.
rox0r