Comment empêcher root d'exécuter un script

10

Le serveur d'applications Glassfish fournit des scripts pour administrer le serveur d'applications et également les démarrer et les arrêter et je voudrais empêcher l'utilisateur root d'exécuter ce script. La raison en est que certains développeurs clés oublient d'administrer le serveur en tant qu'utilisateur non privilégié et s'ils redémarrent le serveur d'applications en tant qu'utilisateur root, le serveur d'applications doit être exécuté par l'utilisateur root [*].

Ce n'est pas une option pour éviter de donner un accès root et les développeurs oublient parce qu'ils sont tellement habitués à le faire sur leur machine locale. Je voudrais que le asadminscript soit modifié pour s'exécuter en tant qu'utilisateur non privilégié ou éventuellement afficher un message d'erreur chaque fois que le script est exécuté par root.

Bash shell est utilisé.

[*]: J'ai essayé de fixer les droits sur les fichiers, mais même si j'ai retrouvé de nombreux fichiers que root possède et chmod, l'application rencontre des erreurs étranges et je dois à nouveau exécuter en tant que root.

tronda
la source

Réponses:

18

Similaire aux autres réponses, mais dans la direction que vous vouliez.

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

Alternativement, vous pouvez utiliser sudodans le script pour forcer l'exécution en tant qu'utilisateur non privilégié en utilisant l' -uindicateur pour spécifier l'utilisateur à exécuter en tant que. Je n'utilise pas Glassfish, mais voici un pseudo script proto-exemple.

#!/bin/bash

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

J'espère que vous avez l'idée. Désolé, je ne sais pas vraiment à quoi ressemble le script, ni le nom de l'utilisateur non privilégié.

bahamat
la source
2

@Tshepang a la bonne idée. Je ne sais pas lequel est le plus portable, mais voici d'autres façons de détecter si l'utilisateur est root:

id -u
$UID

Alternativement, vous pouvez simplement le forcer à s'exécuter en tant qu'autre utilisateur avec les mêmes paramètres:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
la source
1
C'est en arrière. Il veut que root n'exécute pas ce script.
bahamat
Oh, j'ai oublié le sudobit. Maintenant, il devrait faire l'affaire.
l0b0
@TobySpeight Non, le script ne fait rien si l'utilisateur est root, comme prévu. Je crois que votre modification entraîne également un argument supplémentaire si $@est vide, et je l'ai changé pour utiliser un modèle trouvé ailleurs.
l0b0
Merci @TobySpeight, modifié. J'étais sûr d'avoir vu ce formulaire quelque part comme un moyen de s'assurer que zéro argument était passé correctement. Correction du chèque, qui avait définitivement un bug (ce n'était pas une bombe fourchette, mais s'appellerait tout simplement indéfiniment.
l0b0
Je dirais que c'était une bombe fork, car chaque instance ferait un nouveau shell pour le sudo(il n'utilise pas exec) et le parent l'attendrait, donc vous finiriez par vous retrouver avec une table de processus complète. Cela vaut toujours la peine d'y être ajouté exec(si vous ne souhaitez pas que le code fis'exécute en tant qu'utilisateur incorrect).
Toby Speight