Como restringir a execução de comandos em um diretório específico através de SUDOERS?

13

Eu posso configurar o sudo (através do arquivo sudoers) para permitir que um usuário execute os comandos chowne chmodem qualquer arquivo ou diretório do sistema. No entanto, quero apenas conceder permissão ao usuário para executar esses comandos em arquivos que residem abaixo do /var/www/htmldiretório.

Como posso restringir comandos privilegiados para que o usuário possa executá-los apenas em um diretório pré-especificado?

Por exemplo: O comando a seguir concede 777 permissões ao index.htmlarquivo.

sudo chmod 777 /var/www/html/index.html

Agora eu quero realizar duas ações

  1. Restrinja de sudoforma que o usuário possa executar apenas chmode chownde dentro/var/www/html

  2. Impedir que o usuário execute esses comandos em outras partes do sistema (por exemplo, os comandos não podem ser executados /var/wwwou /var/ftp)

PrashantB
fonte
1
Por favor, não faça cruzamento - superuser.com/questions/456662/…
Ulrich Dangel
7
Este é realmente o caminho certo? Que tal um www-datagrupo eliminando a necessidade de chmod/ chownqualquer coisa?
sr_
Legal. Dessa forma, você obtém raiz muito fácil. É uma péssima idéia dar de presente chown. Além disso, não vejo razão chmodpara ser executado como root.
Nils

Respostas:

13

O que você está pedindo é difícil, se não impossível. Mesmo se você restringisse a aplicação de chowne chmodpara arquivos em um diretório específico, alguém ainda poderia transmitir um link simbólico e afetar os arquivos em qualquer lugar que quisesse.

Felizmente, é altamente provável que o que você está tentando fazer não seja a solução certa para o seu problema real e que exista outro método que funcione.

Geralmente, os usuários que precisam de permissões adicionais para criar e modificar arquivos /var/wwwsão adicionados a um grupo (geralmente www-data, ou você pode ter grupos diferentes para diferentes partes do site). Você pode usar a propriedade do grupo e os diretórios setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlpermite que todos no www-datagrupo gravem no /var/www/htmldiretório, e os arquivos criados nesse diretório pertencerão ao www-datagrupo, em vez do grupo principal do usuário que criou o arquivo. No entanto, isso não é muito flexível.

O que você provavelmente deve fazer é configurar as listas de controle de acesso para arquivos em /var/www. Primeiro, verifique se as ACLs estão ativadas: o sistema de arquivos ativado /var/wwwdeve ser montado com a aclopção Consulte Tornar todos os novos arquivos em um diretório acessível a um grupo para obter ajuda sobre isso. Instale também os utilitários da ACL ( getfacle setfacl). Em seguida, dê permissões extras à árvore /var/www/htmlpara os usuários que devem tê-las. Você pode definir ACLs por usuário, mas geralmente é mais fácil colocar usuários que devem ter os mesmos direitos em uma parte do sistema de arquivos em um grupo e definir ACLs para esse grupo. Por exemplo, se os usuários do grupo html-writerstiverem acesso de leitura e gravação à árvore em /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles 'SO- parar de ser mau'
fonte
Com relação a "isso não é muito flexível" (no final do parágrafo 3) - por que não é? É porque as pessoas precisam estar em um determinado grupo? (Eu sei mal nada sobre permissões e ACL e coisas afins.)
KajMagnus
3
@KajMagnus É inflexível porque o root precisa gerenciar grupos, e os arquivos podem pertencer apenas a um único grupo. A ACL permite que qualquer usuário selecione quem pode acessar os arquivos que possui, e vários usuários e grupos podem ser mencionados em uma ACL.
Gilles 'SO- stop be evil'
2

Você pode restringir o comando a ser usado por "myuser" com todos os argumentos no /etc/sudoersarquivo com o comando visudoadd:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

habilite o log para cada operação adicionando:

Defaults logfile=/var/log/sudo.log

saída de amostra:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Quando você usa o sudo, a premissa deve ser que "meu usuário" seja uma pessoa confiável. Cuidado com as permissões de arquivo, não existe uma maneira simples de impedir que um usuário sudo malicioso vincule um arquivo de um recurso externo e altere-o.

tombolinux
fonte
Eu tentei isso antes, mas deu o erro como: Desculpe, o usuário prashant não tem permissão para executar '/ bin / chmod 777 / var / www / html / a' como root no prashant.xyz.com.
PrashantB
você trocou de usuário com su - prashantou su prashant?
tombolinux
Sim, estou executando o comando pelo usuário prashant. Eu leio fóruns, eles dizem que os comandos são executados em todo o sistema. Ninguém escreveu sobre esse assunto.
PrashantB
Eu corro whooo :). Mas este será um comando estático. Podemos torná-lo geral para que eu possa aplicar qualquer permissão em qualquer arquivo em / var / www / html?
PrashantB
3
Isso é completamente inseguro: sudo /bin/chmod 666 /var/www/html/../../../etc/passwde se você consertar isso de alguma forma,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'pare de ser mau'
1

Na verdade, existe uma maneira bastante simples de fazer isso, criando um script Bash (ou shell de sua escolha) para restringir as modificações feitas em um arquivo ou diretório específico.

No seu exemplo, seria assim:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Então você alteraria o arquivo sudoers para permitir que www-data execute / usr / local / bin / mychmod.

No entanto, lembre-se de que permitir a entrada do usuário (por exemplo, permitir que um usuário altere qual arquivo ou diretório está modificado para chmod) nesse espaço é extremamente perigoso e você precisa saber como filtrar os ataques de injeção se quiser fazer algo como naquela. Um invasor pode facilmente executar qualquer comando como root dessa maneira, comprometendo efetivamente a segurança do seu sistema.

Ernie
fonte
isso é excepcionalmente perigoso e realmente não resolve a solução ...
SomeGuy