Comment exécuter un programme spécifique en tant que root sans invite de mot de passe?


170

J'ai besoin d'exécuter quelque chose comme sudo sans mot de passe, alors j'ai utilisé visudoet ajouté ceci à mon sudoersfichier:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Puis je l'ai essayé:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Pourquoi demande-t-il un mot de passe? Comment puis-je exécuter / utiliser des commandes en tant que root avec un utilisateur non-root, sans demander de mot de passe?

Réponses:


91

Vous avez une autre entrée dans le sudoersfichier qui correspond également à votre utilisateur. La NOPASSWDrègle doit être postérieure à celle-ci pour qu’elle ait la priorité.

Ceci fait, vous sudodemanderez normalement un mot de passe pour toutes les commandes, sauf /path/to/my/programqu'il vous laissera toujours exécuter sans demander votre mot de passe.


6
cela fonctionnerait-il encore s'il /path/to/my/programs'agissait d'un script python?
sadmicrowave

Le programme peut-il plutôt être un alias, défini pour bash (c'est-à-dire dans .bashrc)? Ou même un script shell à l'intérieur /usr/local/sbin? Essayer.
Nikos Alexandris

Nikos - non, ça ne peut pas être un alias. Cela doit indiquer un vrai chemin.
Paul Hedderly le

sudoers? où se trouve? Pensez à utiliser votre réponse (
Vasilii Suricov

@VasiliiSuricov: C'est généralement le cas /etc, mais certains systèmes le placent ailleurs. Si vous ne le trouvez pas, essayez man sudoers. L'emplacement local de ce fichier doit être remplacé par la manpage au moment de la sudocréation de ce système.
Warren Young

135

S'il y a plusieurs entrées correspondantes /etc/sudoers, sudo utilise la dernière. Par conséquent, si vous pouvez exécuter une commande avec une invite de mot de passe et que vous souhaitez pouvoir exécuter une commande particulière sans invite de mot de passe, vous avez besoin de l'exception en dernier lieu.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Notez l'utilisation de (root), pour permettre au programme d'être exécuté en tant que root mais pas en tant qu'autre utilisateur. (Ne donnez pas plus d'autorisations que le minimum requis, à moins que vous n'ayez réfléchi aux implications.)

Remarque pour les lecteurs qui n'exécutent pas Ubuntu ou qui ont modifié la configuration sudo par défaut (le sudo d'Ubuntu est correct par défaut) : L'exécution de scripts de shell avec des privilèges élevés est risquée. Vous devez donc démarrer à partir d'un environnement propre (une fois le shell lancé, il est trop tard (voir Autoriser setuid sur les scripts shell ), vous avez donc besoin de sudo pour s'en occuper). Assurez-vous que vous avez Defaults env_resetdans /etc/sudoersou que cette option est la valeur par défaut à la compilation ( sudo sudo -V | grep envdevrait inclure Reset the environment to a default set of variables).


3
ex to go root de jhon avec sudo su pas de passe -----> john ALL = (TOUS) NOPASSWD: / bin / su
bortunac

5
@adrian Si vous voulez autoriser des commandes arbitraires en tant que root, faites-le john ALL=(ALL) NOPASSWD: all. Il ne sert à rien de passer par su.
Gilles

Question: devrais-je modifier les autorisations de mon script shell afin qu'il puisse être modifié et lu uniquement par l'utilisateur root, pour des raisons de sécurité? Je pense à un attaquant qui modifie le script, qui dispose de toutes les autorisations accordées sans qu'un mot de passe ne soit nécessaire, de sorte qu'il fasse ce qu'il / elle veut. Évidemment, l'attaquant ne peut même pas lire le fichier sudoers pour savoir quels scripts ont ce privilège, mais il peut toujours essayer avec tous mes scripts personnalisés une fois qu'il / elle trouve le dossier dans lequel ils sont stockés dans l'espoir que certains soient autorisés, ou quelque chose comme ça. .
Jeffrey Lebowski

1
@JeffreyLebowski Si vous avez une règle sudo qui exécute le script (directement ou indirectement), il est essentiel que seul root (ou les personnes disposant de privilèges root de toute façon) puissent écrire dans le fichier script et dans le répertoire contenant le fichier script. son répertoire parent et ainsi de suite. Peu importe que tout le monde puisse lire le fichier de script (à moins qu’il ne contienne un mot de passe ou quelque chose comme ça, mais c’est une mauvaise idée; s’il existe un mot de passe, il devrait être dans son propre fichier, sinon il y a trop de risque de le faire fuir accidentellement, par exemple copier-coller cette section du code dans une question de ce site).
Gilles

1
@alper No. Très peu de choses nécessitent un redémarrage. Après avoir changé sudoers, vous n'avez rien de spécial à faire: sudovérifiez-le à chaque fois.
Gilles

24

AVERTISSEMENT : Cette réponse a été jugée peu sûre. Voir les commentaires ci-dessous

Solution complète: les étapes suivantes vous aideront à obtenir le résultat souhaité:

  1. Créez un nouveau fichier de script (remplacez-le create_dir.shpar le nom de script souhaité):

    vim ~/create_dir.sh
    

    Le script sera créé dans le répertoire personnel de l'utilisateur.

  2. Ajoutez des commandes que seul un utilisateur rootou un sudoutilisateur peut exécuter, par exemple en créant un dossier au niveau du répertoire racine:

    mkdir /abc
    

    Remarque: N'ajoutez pas sudoà ces commandes. Sauvegarder et quitter (utiliser :wq!)

  3. Attribuez-lui des autorisations d'exécution en utilisant:

    sudo chmod u+x create_dir.sh
    
  4. Apportez des modifications pour que ce script ne nécessite pas de mot de passe.

    1. Ouvrez le sudoersfichier:

      sudo visudo -f /etc/sudoers
      
    2. Ajoutez la ligne suivante à la fin:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Remplacez ahmadpar quel que soit votre nom d'utilisateur. Assurez-vous également qu'il s'agit de la dernière ligne. Sauvegarder et quitter.

  5. Maintenant, lors de l'exécution de la commande, ajoutez sudoavant comme ceci:

    sudo ./create_dir.sh
    

    Cela exécutera les commandes à l'intérieur du fichier de script sans demander de mot de passe.

Suivez les étapes faciles mentionnées ici http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


Il serait préférable que vous fournissiez les étapes pertinentes ici et que vous utilisiez le lien comme sauvegarde pour des informations plus détaillées. Ainsi, votre réponse conserve la valeur possible même si ce lien ne serait plus valide.
Anthon

15
Ce conseil n'est pas sécurisé. La sudopartie de sudo chmod u+x create_dir.shest inutile car l'utilisateur est (vraisemblablement) propriétaire de son répertoire personnel. Étant donné que l'utilisateur peut écrire sur create_dir.sh, vous lui avez effectivement attribué un shell root libre.
Lekensteyn

1
@Lekensteyn Ce qui signifie également pour tout programme exécuté en tant qu'utilisateur. Autant permettre à l'utilisateur d'exécuter n'importe quoi avec sudo sans mot de passe.
pydsigner

2
Est-ce que je manque quelque chose? Je crois que le tout chmodest inutile, puisque vous comptez sudosurélever vos privilèges.
G-Man

10

Je pense que votre syntaxe est fausse. Au moins, j'utilise ce qui suit pour moi:

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
La (ALL)partie est optionnelle, le laisser sortir a exactement le même effet. Ce (root)serait mieux si, mais son absence n'explique pas le problème.
Gilles

+1 pour sudo pour cette commande et rien d'autre! Aucune raison de casser tout le système ...
Johan

3
@Johan: C'était déjà dans la question.
Gilles

5

Si vous voulez éviter de devoir utiliser sudo ni modifier le fichier de configuration sudoers, vous pouvez utiliser:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Cela fera exécuter la commande en tant que root sans avoir besoin de sudo.


Wow, je n'avais jamais entendu parler de cette solution auparavant, ahurissant
quelque chose de

Pourquoi est-ce que je dois faire défiler la liste jusqu'en bas pour trouver la meilleure réponse? Merci pour cette solution simple et sécurisée.
RyanNerd

5

Si vous avez une distribution comme Manjaro, vous devez d’abord traiter un fichier qui remplace la définition de / etc / sudoers. Vous pouvez le supprimer ou travailler directement avec ce fichier pour ajouter vos nouvelles configurations.

Ce fichier est:

sudo cat /etc/sudoers.d/10-installer

La SEULE façon de le voir est sous les privilèges root, vous ne pouvez pas lister ce répertoire sans celui-ci, ce fichier est spécifique à Manjaro, vous pouvez trouver cette configuration avec un autre nom, mais dans le même répertoire.

Dans le fichier de votre choix, vous pouvez ajouter la ou les lignes suivantes pour obtenir la ou les configurations souhaitées:

Ignorer l'authentification pour un groupe

%group ALL=(ALL) NOPASSWD: ALL

ou Ignorer l'authentification pour un utilisateur

youruser ALL=(ALL) NOPASSWD: ALL

ou Ignorer l'authentification d'un exécutable pour un utilisateur spécifique

youruser ALL=(ALL) NOPASSWD: /path/to/executable

NOTE RAPIDE: Vous ouvrez une porte à l’utilisation de SUDO sans authentification, ce qui signifie que vous pouvez exécuter tout ce qui est modifié de votre système, et l’utiliser de manière responsable.


4

Vérifiez que sudo n'est pas aliasé. Courir comme ça

/usr/bin/sudo /path/to/my/program

Par exemple, un alias de shell comme celui-ci:

alias sudo="sudo env PATH=$PATH"

peut causer ce comportement.


Vous avez raison, mon commentaire était irrecevable ici , désolé pour cela. Néanmoins, je suis intrigué - comment vous attendez-vous à ce que l'aliasing change le traitement de sudoersbyo. Ou est-ce que vous parlez de rediriger sudovers quelque chose qui affiche toujours ce message d'erreur pour récupérer les mots de passe? C'est peu probable ici ...
peterph

2
J'avais le même problème que l'OP. Cela s'est avéré être causé par avoir alias sudo="sudo env PATH=$PATH"dans ma ~/.bashrc. Plutôt que de simplement résoudre le problème pour moi-même et de façon aveugle, je soumettais ma réponse comme une solution possible pour quiconque prend ce fil.
Sepero

1
C’est bien, mais lorsque ce n’est pas évident (ce qui dans ce cas n’est pas du tout le cas pour certaines personnes), il est bon de donner une explication à la réponse pour fournir un contexte et empêcher les gens d’utiliser aveuglément des incantations magiques. +2 (- (- 1) + +1). :)
peterph

2

Lorsque vous exécutez votre script, vous devez l'exécuter en tant que sudo /path/to/my/script.

Edit: En fonction de votre commentaire à une autre réponse, vous souhaitez l'exécuter à partir d'une icône. Vous devrez créer un .desktopfichier qui exécute votre programme avec sudo, comme sur le terminal.

Vous pouvez également envisager d'utiliser gtk-sudoune invite visuelle de mot de passe.

Vous devriez probablement considérer que l’idée que vous ne devriez pas exécuter les choses en tant que root et que changer le système plus tard pour ne plus avoir besoin d’autorisations root serait une meilleure solution.


7
Ne faites pas de scripts shell setuid . Voir Autoriser setuid sur les scripts shell .
Gilles

J'ai envisagé de ne pas en parler parce que c'est une si mauvaise option. Je viens de le supprimer parce que je crains que ce demandeur utilise le conseil même avec l’avertissement qu’il s’agissait d’un mauvais conseil!
Caleb

2

Cela a résolu le problème pour moi (j'ai également essayé d'autres réponses qui auraient pu aider):

Le script que j'appelais se trouvait dans /usr/binun répertoire sur lequel je n'ai pas l'autorisation d'écriture (bien que je puisse généralement lire tous les fichiers là-bas). Le script était chmodded + x (autorisation exécutable), mais cela ne fonctionnait toujours pas. En déplaçant ce fichier vers un chemin de mon répertoire personnel, /usr/binj'ai finalement pu l'appeler avec sudo sans entrer de mot de passe.

De plus, quelque chose me faisait douter (clarifier pour les futurs lecteurs): Vous devez exécuter votre script en tant que sudo. Tapez sudolors de l' appel du script. N'utilisez pas sudola commande dans votre script qui a réellement besoin de root (changer le rétroéclairage du clavier dans mon cas). Cela fonctionne peut-être aussi, mais vous n'en avez pas besoin et cela semble être une meilleure solution que de ne pas le faire.


Le deuxième paragraphe avait la réponse à mon problème
M. Ahmad Zafar le

@MuhammadAhmadZafar Heureux d'avoir aidé!
Luc

4
En fait, utiliser à l' sudointérieur d'un script est parfaitement correct à condition que vous disposiez des droits appropriés (définis dans sudoers) pour exécuter la commande en question sans mot de passe. Cela sécurise un peu les choses.
Peter

pourrait vraiment utiliser cette réponse ré-écrite comme étape par étape 'c'est comment vous le faites' plutôt que comme un dialogue avec les autres réponses
Walrus the Cat

@WalrustheCat Bon point. En relisant ma réponse, je pense que j'ai peut-être été un peu confus moi-même. Pour le moment, cependant, je ne me souviens pas de la situation exacte et je ne peux donc pas faire un meilleur résumé. Si vous le comprenez, peut-être une combinaison de plusieurs réponses, soumettez certainement une nouvelle réponse!
Luc

1

Une autre possibilité consiste à installer, configurer, puis utiliser la super commande pour exécuter votre script en tant que

super /path/to/your/script

Si vous voulez exécuter certains binaire exécutable (par exemple , que vous avez compilé dans ELF binaire à partir du code source C) -qui est pas un Script- en tant que root, vous pourriez envisager d'en faire setuid (et en fait /bin/login, /usr/bin/sudoet /bin/suet superutilisent tous cette technique ) Cependant, soyez très prudent, vous pourriez ouvrir une énorme faille de sécurité .

Concrètement, votre programme doit être codé paranoïaquement (vérifiez donc tous les arguments, ainsi que l’environnement et les conditions extérieures avant de "jouer", en supposant un utilisateur potentiellement hostile), puis vous pouvez utiliser soigneusement seteuid (2) et friends (voir aussi setreuid (2) ) (voir aussi les capacités (7) et les identifiants (7) & execve (2) ...)

Vous utiliserez chmod u+s(lisez chmod (1) ) lors de l'installation d'un tel binaire.

Mais soyez très prudent .

Lisez beaucoup de choses sur setuid , y compris la programmation Linux avancée , avant de coder une telle chose.

Notez qu'un script, ou tout le tralala chose -ed, ne peuvent pas être setuid. Mais vous pourriez coder (en C) un petit setuid-binary le recouvrant.


0

Idéalement, si vous personnalisez les commandes pouvant être exécutées via, sudovous devez apporter ces modifications dans un fichier séparé sous /etc/sudoers.d/plutôt que de les modifier sudoersdirectement. Vous devriez également toujours utiliser visudopour éditer le (s) fichier (s). Vous ne devriez JAMAIS accorder NOPASSWDde ALLcommandes.

Exemple: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Insérez votre ligne accordant la permission: myuser ALL= NOPASSWD: /path/to/your/program

Puis enregistrez et quittez et visudovous avertirons si vous avez des erreurs de syntaxe.

Vous pouvez exécuter sudo -lpour voir les autorisations accordées à votre utilisateur. Si l'une des NOPASSWDcommandes spécifiques à l'utilisateur apparaît AVANT une %groupyouarein ALL=(ALL) ALLcommande dans la sortie, vous serez invité à entrer votre mot de passe.

Si vous êtes en train de créer beaucoup de ces fichiers sudoers.d, vous voudrez peut-être les créer nommés par utilisateur pour faciliter leur visualisation. Gardez à l'esprit que l'ordre des NOMS DE FICHIERS et des règles dans le fichier est très important, le DERNIER chargé gagne gagne, qu'il soit PLUS ou MOINS permissif que les entrées précédentes.

Vous pouvez contrôler le classement des noms de fichiers en utilisant un préfixe 00-99 ou aa / bb / cc, mais n'oubliez pas que si vous avez des fichiers sans préfixe numérique, ils se chargeront après les fichiers numérotés. les paramètres. Cela s'explique par le fait que, selon vos paramètres de langue, le "tri lexical" utilisé par le shell trie les nombres en premier, puis entrelace les majuscules et les minuscules lors d'un tri "croissant".

Essayez de lancer printf '%s\n' {{0..99},{A-Z},{a-z}} | sortet printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortde voir si votre langue actuelle est imprimée, AaBbCcetc. ou ABCensuite abcde déterminer quel serait le meilleur préfixe de la dernière lettre à utiliser.


0

Pour autoriser tout utilisateur à exécuter un programme en tant que sudo sans demander de mot de passe, vous pouvez ajouter la ligne suivante

%sudo ALL=(root) NOPASSWD: /path/to/your/program

dans /etc/sudoers

Notez que % sudo le fait.


Bien que ce soit une façon de réaliser une règle sudo, cela ne répond pas à la question de savoir pourquoi la définition de l'indicateur NOPASSWD sur cette règle entraîne toujours une invite de mot de passe. Voir la réponse acceptée pour une idée pourquoi cela est arrivé.
Jeff Schaller

0

Le cas suivant concerne le cas où vous souhaitez exécuter une commande sans mot de passe uniquement si elle contient un ensemble d'options spécifique, où une partie des options est variable . Autant que je sache, il n’est pas possible d’utiliser des variables ou des plages de valeurs dans les déclarations sudoers, c’est-à-dire que vous pouvez autoriser l’accès de manière explicite command option1mais sans command option2utiliser:

user_name ALL=(root) /usr/bin/command option1

mais si la structure est command option1 value1, où value1peut varier, vous devez disposer de lignes sudoers explicites pour chaque valeur possible de value1. Le script shell permet de contourner le problème.

Cette réponse a été inspirée par la réponse de M. Ahmad Zafar et corrige le problème de sécurité.

  1. Créez un script shell où vous appelez la commande sans sudo.
  2. Enregistrez le script dans un dossier privilégié racine (par exemple /usr/local/bin/), faites en sorte que le fichier soit la propriété de la racine (par exemple chown root:wheel /usr/local/bin/script_name) sans accès en écriture pour les autres (par exemple chmod 755 /usr/local/bin/script_name).
  3. Ajoutez l'exception aux sudoers utilisant visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Exécutez votre script sudo script_name.

Par exemple, je souhaite modifier le délai de veille de l'affichage sous macOS. Ceci est fait en utilisant:

sudo pmset displaysleep time_in_minutes

Je considère que changer le délai de veille est une action innocente qui ne justifie pas les tracas liés à la saisie d'un mot de passe, mais qui pmsetpeut faire beaucoup de choses et j'aimerais garder ces autres choses derrière le mot de passe sudo.

J'ai donc le script suivant sur /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

À la fin du sudoersfichier, j'ai la ligne suivante:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Pour définir le délai d'expiration à 3 minutes, j'exécute mon script à partir du compte d'utilisateur ordinaire user_name:

sudo ds 3

PS La majeure partie de mon script est une validation d’entrée, qui n’est pas obligatoire. Par conséquent, les éléments suivants fonctionnent également:

#!/bin/bash
pmset displaysleep $1 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.