Como impedir que o root execute um script

10

O servidor de aplicativos Glassfish fornece scripts para administrar o servidor de aplicativos e também os inicia e interrompe, e eu gostaria de restringir o usuário root de executar esse script. O motivo é que alguns desenvolvedores importantes esquecem de administrar o servidor como usuário não privilegiado e, se reiniciarem o servidor de aplicativos como usuário raiz, o servidor de aplicativos precisará ser executado pelo usuário raiz [*].

Não é uma opção para evitar o acesso root e os desenvolvedores esquecem, porque estão acostumados a fazer isso na máquina local. Gostaria que o asadminscript fosse alterado para ser executado como usuário não privilegiado ou, opcionalmente, exibisse uma mensagem de erro sempre que o script fosse executado pela raiz.

Bash shell é usado.

[*]: Tentei corrigir os direitos dos arquivos, mas, apesar de ter rastreado muitos arquivos que o root possui e os chmod, o aplicativo apresenta erros estranhos e tenho que executar o root novamente.

tronda
fonte

Respostas:

18

Semelhante às outras respostas, mas na direção que você queria.

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

Como alternativa, você pode usar sudodentro do script para forçar a execução como usuário não privilegiado, usando o -usinalizador para especificar o usuário para executar como. Eu não uso o Glassfish, mas aqui está um pseudo script de exemplo proto.

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

Espero que você entenda a idéia. Desculpe, eu realmente não sei como é o script ou o nome do usuário não privilegiado.

bahamat
fonte
2

@Tshepang tem a ideia certa. Não sei qual é o mais portátil, mas aqui estão outras maneiras de detectar se o usuário é root:

id -u
$UID

Como alternativa, você pode simplesmente forçá-lo a executar como outro usuário com os mesmos parâmetros:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
fonte
11
Isso é ao contrário. Ele quer que o root não execute esse script.
bahamat 8/09/11
D'oh, esqueci um sudopouco. Agora deve fazer o trabalho.
L0b0 9/09/11
@TobySpeight Não, o script não fará nada se o usuário for root, como pretendido. Acredito que sua alteração também resulta em um argumento extra se $@estiver vazio, e eu a mudei para usar um padrão encontrado em outro lugar.
L0b0
Obrigado @TobySpeight, alterado. Eu tinha certeza de ter visto esse formulário em algum lugar como uma maneira de garantir que zero argumentos sejam passados ​​corretamente. Também foi corrigida a verificação, que definitivamente tinha um bug (não era uma bomba de garfo, mas simplesmente se
autodefinia
Eu diria que era uma bomba de forquilha, porque cada instância bifurcava um novo shell para o sudo(não está sendo usado exec) e o pai esperava por isso, então você acabaria com uma tabela de processo completa. Ainda vale a pena colocar execlá (se você não pretende que o código fiseja executado como usuário errado).
Toby Speight