ubuntu: laisser un utilisateur exécuter un script avec des autorisations root

9

J'ai Ubuntu 8.04 et je veux écrire un script bash qui fonctionne comme roottout utilisateur peut l'exécuter.

Je peux moi-même faire du sudo.

Comment je fais ça?

CLARIFICATION : Je ne veux pas le faire avec sudo, car les utilisateurs devront alors taper leur mot de passe. Je veux juste qu'ils exécutent le script en tant que root, peut-être quelque chose de setuid, dunno.

fil volant
la source

Réponses:

23

S'il s'agissait d'un binaire normal, vous pouvez définir setuid en exécutant

# chmod u+s /path/to/binary

Malheureusement, les scripts ne peuvent pas être configurés. (Eh bien, vous pouvez, mais c'est ignoré). La raison en est que la première ligne du script indique au système d'exploitation sous quel interpréteur exécuter le script. Par exemple, si vous aviez un script avec:

#!/bin/bash

Vous finiriez par courir

/bin/bash /path/to/script

Évidemment, vous auriez besoin que l'interpréteur soit setuid, ce qui signifierait alors que tous les scripts seraient setuid. Ce serait mauvais.

Vous pouvez le faire avec sudo en mettant ce qui suit dans votre fichier / etc / sudoers en exécutant visudo.

ALL ALL=NOPASSWD: /path/to/script

Et maintenant, tout utilisateur peut exécuter

$ sudo /path/to/script

Cela leur permet d'exécuter le script sans taper leur mot de passe.

Il existe une alternative qui ne nécessite pas sudo dans la commande, qui nécessite la création d'un petit binaire setuided qui exécute votre script, mais chaque binaire setuid supplémentaire ajoute un autre problème de sécurité potentiel.

David Pashley
la source
Je pense que c'est la réponse que je cherchais. Je ne peux pas définir un script bash, seulement un binaire? (Bien sûr, je prendrais des mesures pour le rendre non modifiable)
flybywire
Non, vous ne pouvez pas créer de setuid de script.
wfaulk
wfaulk: Vous pouviez le faire auparavant, mais les distributions Linux les plus récentes ne le permettent plus. Vous pouvez utiliser un outil comme shc pour «compiler» le script, puis le rendre setuid.
Kyle Brandt
wfaulk: Bien sûr, cela ferait de votre mieux pour faire quelque chose qui est intentionnellement désactivé, donc c'est probablement une mauvaise idée :-)
Kyle Brandt
Remplacez le terme ALLpar un nom d'utilisateur pour permettre à un sudoer d'exécuter sans saisir de mot de passe.
hdave
3

J'avais besoin d'insérer cette ligne À LA FIN de / etc / sudoers: ALL ALL = NOPASSWD: <filename> Apparemment, une %admin ALL=(ALL) ALLsubstitution ultérieure nécessitait un mot de passe pour les utilisateurs admin.

Il n'y a aucun problème de sécurité permettant à un script d'être exécuté en tant que root tant que le script effectue une action bien déterminée, inoffensive et autorisée et, si les valeurs de certains paramètres ne peuvent pas entraîner un mauvais comportement du script.

Mais il y a un piège ...

Utilisez toujours les chemins d'accès complets dans les noms de commande et de fichier. Si vous écrivez quelque chose comme echo Hello world!dans myrootscript, quelqu'un pourrait écrire un ~/bin/echo scriptet myrootscriptexécuter en tant que root tout ce qu'il contient.

/bin/echo "Hoping this will keep you safe" :-)

André
la source
s'il est possible pour un utilisateur non root sur la machine de modifier ce script, il est possible pour cet utilisateur de reprendre la machine. Si ce même utilisateur a un mot de passe faible, rien n'empêche votre machine d'être totalement compromise.
hdave
2

Par défaut, les membres du wheelgroupe sont autorisés à sudon'importe quelle commande en tant que root. C'est probablement ainsi que vous l'utilisez sudoà ce jour.

Pour autoriser un autre utilisateur, vous devrez créer une sudoersrègle. Par exemple:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Permettra à l'utilisateur mickey.moused'exécuter la commande /usr/local/bin/test.shcomme rootsans nécessiter une invite de mot de passe supplémentaire.

Vous devriez lire ce document pour plus d'informations.

Dan Carley
la source
Debian / Ubuntu utilisent le groupe admin plutôt que la roue. C'est peut-être un nom légèrement plus précis.
David Pashley
Appelez-moi à l'ancienne, mais ..;)
Dan Carley
1
à l'ancienne: P
David Pashley
0

Utilisez chmod +s <filename>pour voir le bit suid. Cela signifie que lorsque le fichier est exécuté, il s'exécute avec les autorisations du propriétaire du fichier (il est donc préférable de le redéfinir pour le faire fonctionner comme cela).

Cependant, cela peut être TRÈS dangereux avec quelque chose comme un script bash, car un utilisateur trouve un moyen de le changer, il peut facilement gagner un shell root. Assurez-vous qu'il ne peut être écrit par personne d'autre que root.

Linux ne vous permet pas de définir des scripts, pour ce faire, vous devez le compiler en tant que programme. À la place, vous pouvez utiliser le fichier sudoers (/ etc / sudoers) et ajouter une ligne comme celle-ci.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
la source
0

Une autre alternative: vous pouvez faire un petit wrapper setuid C autour de ce script qui

  • vérifie les limitations que vous pourriez vouloir appliquer (liste d'utilisateurs, heure, charge système, ...)
  • journaux / audits d'exécution si souhaité
  • exécute le script

Un peu comme votre propre sous-ensemble des multiples capacités de sudo.

mpez0
la source