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

12

Eu posso configurar o sudo (por meio do arquivo sudoers) para permitir que um usuário execute os comandos chown e chmod em qualquer arquivo ou diretório no sistema. No entanto, só desejo conceder ao usuário permissão para executar esses comandos em arquivos que residam abaixo do diretório /var/www/html .

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

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

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

Agora quero realizar duas ações

  1. Restringir sudo de modo que o usuário só possa executar chmod e chown dentro de /var/www/html

  2. Proibir que o usuário execute esses comandos em outro lugar do sistema (por exemplo, os comandos não podem ser executados em /var/www ou /var/ftp )

por PrashantB 02.08.2012 / 13:12

3 respostas

12

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

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

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

O que você provavelmente deve fazer é configurar listas de controle de acesso para arquivos em /var/www . Primeiro, certifique-se de que as ACLs estejam ativadas: o sistema de arquivos em que /var/www está ativado deve ser montado com a opção acl . Veja Faça todos os novos arquivos em um diretório acessível a um grupo para obter ajuda sobre isso. Instale também os utilitários do ACL ( getfacl e setfacl ). Em seguida, conceda permissões extras à árvore em /var/www/html para 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-writers tiverem acesso de leitura / 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
    
por 03.08.2012 / 03:07
2

Você pode restringir o comando a ser usado por "myuser" com todos os argumentos no arquivo /etc/sudoers com o comando visudo add:

## 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 

ativar o registro para cada operação adicionando:

Defaults logfile=/var/log/sudo.log

exemplo de saída:

[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 sudo, a premissa é que "myuser" é uma pessoa confiável. Tenha cuidado com as permissões de arquivo, não há uma maneira simples de impedir que um usuário malicioso do sudo vincule um arquivo de um recurso externo e altere-o.

    
por 02.08.2012 / 14:01
1

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

No seu exemplo, ficaria assim:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Em seguida, você alteraria o arquivo sudoers para permitir que www-data execute / usr / local / bin / mychmod.

Tenha em mente que permitir a entrada do usuário (por exemplo, permitir que um usuário altere qual arquivo ou diretório é chmodded) nesse espaço é extremamente perigoso, e você precisa saber como filtrar os ataques de injeção se quiser faça algo assim. Um invasor pode facilmente executar qualquer comando como root dessa forma, comprometendo efetivamente a segurança de seu sistema.

    
por 30.06.2015 / 21:56

Tags