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.