Por que ainda estou solicitando uma senha depois de adicionar uma exceção ao meu arquivo / etc / sudoers?

1

Como faço para dar permissão a um usuário para usar o comando rm, mas apenas dentro de um determinado diretório? Eu tentei adicionar isso ao meu arquivo / etc / sudoers

myuser ALL = NOPASSWD : /bin/rm ???? /usr/java/jboss/standalone/vfs/*

mas quando sou lgogado como esse usuário e executo o comando

/bin/find $JBOSS_HOME/standalone/tmp/vfs -mindepth 1 -mmin +1441 -exec sudo rm -rf {} \;

Eu sou solicitado a fornecer uma senha

[sudo] password for myuser:

O que mais eu preciso mudar para fazer isso funcionar corretamente?

    
por Dave 09.03.2017 / 21:56

3 respostas

2

Você tem 'stalone' nos seus sudoers e 'standalone' no seu comando find. Esse pode ser o problema.

    
por 09.03.2017 / 22:14
1

Lembre-se que com este comando sudo, um /bin/rm -rf /usr/java/jboss/standalone/vfs/file /something_other_might_be_whole_filesystem também é permitido (semelhante ao que o roaima afirmou no comentário).

Se você tiver que fazer isso dessa maneira, eu sugiro colocar o comando "find" inteiro sob "sudoers", pois não há curingas.

Possivelmente, uma solução muito melhor seria alterar a propriedade do diretório ou colocar myuser no grupo que possui acesso de gravação ao diretório mencionado.

    
por 10.03.2017 / 10:44
1

Como outros já observaram, seu comando permite que o usuário apague e a árvore de diretórios no sistema. Para dar a um usuário a permissão para excluir arquivos em um diretório específico, você precisaria escrever um script wrapper. No arquivo sudoers:

myuser ALL = NOPASSWD: /usr/local/sbin/rm_jboss_vfs

Em /usr/local/sbin/rm_jboss_vfs :

#!/bin/sh
for x do
  case "$x" in
    */../*|*/..) echo >&2 "$0: .. forbidden"; exit 3;;
    /usr/java/jboss/standalone/vfs/[!.]*) rm -rf -- "$x";;
    *) echo >&2 "$0: only absolute paths under /usr/java/jboss/standalone/vfs are permitted"; exit 3;;
done

Observe que o usuário ainda pode escapar do /usr/java/jboss/standalone/vfs se houver links simbólicos lá. Uma abordagem mais segura seria chroot no diretório. Use um shell com o comando rm incorporado, como sash .

#!/bin/sash
set -e
-chroot /usr/java/jboss/standalone/vfs
for x do
  case "$x" in
    /usr/java/jboss/standalone/vfs/[!.]*) -rm -rf -- "$x";;
    *) echo >&2 "$0: only absolute paths under /usr/java/jboss/standalone/vfs are permitted"; exit 3;;
done

O problema com a solicitação de senha provavelmente se deve à presença de outra entrada no arquivo que permite ao usuário executar esse comando com um prompt de senha. Se duas entradas coincidirem, o sudo usará a última, então coloque qualquer entrada NOPASSWD: por último. Veja Como executar um específico programa como root sem um prompt de senha?

Em vez de usar a elevação de privilégios, seria melhor dar ao usuário a permissão para fazer o que eles precisam. As permissões do Unix são muito grosseiras para isso: dar permissão a um usuário para remover arquivos em um diretório requer permissão de gravação para o diretório (assim, em particular, a permissão para criar arquivos lá). Pelo menos, em vez de executar o script de exclusão como raiz, execute-o como um grupo jboss_vfs_deleters e dê a esse grupo a permissão para gravar nos diretórios em questão. Definir as permissões do diretório:

setfacl -d -R -m group:jboss_vfs_deleters:rwX /usr/java/jboss/standalone/vfs
setfacl -R -m group:jboss_vfs_deleters:rwX /usr/java/jboss/standalone/vfs

No arquivo sudoers :

myuser ALL = (jboss_vfs_deleters) NOPASSWD: /usr/local/sbin/rm_jboss_vfs

Execute sudo -g jboss_vfs_deleters /usr/local/sbin/rm_jboss_vfs … (você pode ocultar isso em um script wrapper não privilegiado).

A desvantagem de usar um grupo é que você não pode mais usar chroot , você precisa usar a abordagem de filtragem baseada em nomes menos robusta.

Observe que os arquivos em /usr não devem ser modificados durante a operação normal. Eu não sei o que são esses arquivos, mas se você os estiver modificando em operação normal, eles provavelmente estarão abaixo de /var .

    
por 11.03.2017 / 03:03