Você tem 'stalone' nos seus sudoers e 'standalone' no seu comando find. Esse pode ser o problema.
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?
Você tem 'stalone' nos seus sudoers e 'standalone' no seu comando find. Esse pode ser o problema.
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.
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
.
Tags sudo permissions su rm