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.

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.