Restringir usuários padrão a executar um comando com um argumento específico

2

Eu sei como restringir usuários padrão para executar um comando, removendo permissões de execução para esse comando. Mas é possível restringir os usuários padrão para executar um comando com uma opção / argumento específico?

Por exemplo, um usuário padrão deve ser capaz de executar o seguinte comando:

ls

mas não:

ls -l

Acho que isso pode ser possível, pois há alguns comandos como chsh ou passwd que um usuário padrão pode executá-los, mas ele obtém permissão negada quando executa chsh root ou passwd -a -S .

    
por Radu Rădeanu 23.09.2013 / 19:23

3 respostas

3

Acho que a única maneira seria escrever seu próprio wrapper no comando / utilitário em questão e decidir se o que é permitido ou não é permitido com base no (E) UID do usuário que o iniciou. As ferramentas mencionadas que fazem isso, como chsh ou passwd , têm essa funcionalidade incorporada em sua implementação.

Como escrever um wrapper para ls

#!/usr/bin/perl

use strict;
use warnings;

my $problematic_uid = 1000; # For example
my $is_problematic = $< == $problematic_uid;
unless(/ -l / ~~ @ARGV or $is_problematic){
    exec qq{/new/path/to/ls }.join '',@ARGV
}else{
    die "Sorry, you are not allowed to use the -l option to ls\n"
}

Você precisa garantir que o caminho para o ls original não esteja no PATH de seu usuário. É por isso que escrevi /new/path/to/ls . O problema é que este wrapper requer que o usuário possa executar o ls original para que o usuário ainda possa contorná-lo chamando o original ls diretamente.

    
por 23.09.2013 / 22:22
3

Comandos como chsh e passwd são codificados especialmente. Eles correm com privilégios extras (eles são setuid ) e contêm seu próprio mecanismo de autorização. Ambos verificam qual usuário está invocando-os e permitem que usuários não-root apenas um subconjunto de suas funcionalidades.

chsh e passwd são a exceção. A maioria dos comandos não se importa com quem invoca.

Proibir usuários de rodar um comando em particular é inútil: eles podem fazer o que o comando fizer de alguma outra maneira, por exemplo, fornecendo seu próprio executável.

Você pode criar uma conta restrita que só pode executar um conjunto de comandos na lista de permissões: com um shell restrito , ou para contas somente de transferência de dados, rssh ou scponly .

Se você quiser permitir que um usuário execute um determinado comando com privilégios elevados (normalmente via sudo ), mas apenas para determinadas combinações de opções, escreva um script de wrapper que verifique as opções e permita que o usuário execute roteiro de wrapper.

    
por 23.09.2013 / 23:23
2

A resposta de Rahul é relevante para a sua pergunta, porque o que você quer é a) não é uma boa ideia e b) provavelmente só é possível criando um shell personalizado. Executáveis como ls são programas separados e independentes que manipulam seus argumentos sozinhos - se você quiser impedir que os usuários usem ls -l , você teria que escrever e compilar seu próprio ls personalizado. Como você provavelmente pode imaginar, isso não seria fácil e também levaria muito tempo, porque você precisa fazer isso para cada comando que quiser alterar.

Você poderia talvez tentar substituir o shell inteiro (provavelmente no seu caso bash ) completamente com um shell diferente que filtra os comandos de seus usuários. Por exemplo, ele pode tentar remover as linhas de comando -l de ls antes de chamar ls . Isso não é tão fácil quanto parece, porque os shells e os comandos que você pode executar a partir de um shell geralmente têm uma sintaxe muito poderosa e complexa, e tentar filtrar provavelmente deixará buracos e quebrará coisas.

I think that this can be possible since there are some commands like chsh or passwd which a standard user can run them, but he get permission denied when he runs chsh root or passwd -a -S.

Isso é algo totalmente diferente, porque esses programas são escritos dessa maneira. Se você quiser alterar o comportamento deles da mesma forma que deseja alterar o comportamento de ls , será necessário modificar os códigos-fonte e recompilá-los.

    
por 23.09.2013 / 22:25