como ativar o sudo para um diretório

2

Eu tenho Redhat 6.3 e desejo ativar o comando sudo para chown , kill e chmod , portanto, no usuário raiz, fiz o seguinte:

visudo
#add the following line
aabuhasna ALL=(ALL) NOPASSWD: /usr/bin/kill, /bin/chmod, /bin/chown

Com base no usuário de linha adicionado aabuhasna , é possível fazer chmod e chown em qualquer diretório ou arquivo, mas quero restringir isso para um diretório, por exemplo se eu usar o comando chown aabuhasna:aabuhasna /test_dir/* ele funciona mas se eu usar chown aabuhasna:aabuhasna /opt/* ele falha, o mesmo vale para chmod . por favor, informe obrigado

    
por Ahmad Abuhasna 07.05.2015 / 13:08

1 resposta

1

Os curingas com comandos sudo são um pouco arriscados. Eles podem parecer dar segurança sem realmente fazer isso. Para sudo , o * não significa "nenhum arquivo sob este diretório" como no shell. Em vez disso, significa "qualquer opção adicional" e deve ser independente. Infelizmente, você não pode em sudo restringir parte dos argumentos e, além disso, não seria seguro (porque o usuário pode especificar ../../ que frustraria suas intenções).

Então, aqui está o que você faz: escrever um script que valide cuidadosamente os argumentos da linha de comando e certifique-se de que eles não contenham elementos como ../ . Então esse script é incluído no sudo para o usuário. Mais um ponto: bash é uma má escolha neste contexto, devido às inúmeras maneiras pelas quais o usuário mal-intencionado pode subverter sua intenção. Então aqui está um perl Exemplo que eu testei e deve se encaixar em suas necessidades (após a customização, e substituindo echo pela string vazia).

#!/usr/bin/perl -w
my $user = "aabuhasna";
my $group = "aabuhasna";
my $prefix = "/test_dir";

$mode=shift @ARGV or die "Please provide a mode for the new file";
die "Invalid chmod input: $mode" unless $mode =~ /^[0-9]+$/;
$mode = oct($mode);
die "Invalid permissions in mode: $mode" if $mode != ($mode & 0777);
my $uid = (getpwnam($owner))[2] or die "Unknown user: $user";
my $gid = (getpwnam($group))[2] or die "Unknown group: $group";
foreach (@ARGV) {
   die "Invalid Directory Argument: $_" if m:\.\./:;
   next if -l $prefix."/".$_;
   push @files,$prefix."/".$_;
}
die "No files specified!" unless @files;

chmod $mode, @files;
chown $uid, @gid, @files;

A entrada do sudo para este script, digamos que você o coloque em /usr/local/bin/changemodeowner é simples:

aabuhasna ALL=(ALL) NOPASSWD: /usr/local/bin/changemodeowner

Não há * necessário aqui.

    
por 07.05.2015 / 14:31