Empêcher sudo de demander un mot de passe lors de l'exécution d'une commande non autorisée

15

J'ai accordé une autorisation de groupe pour exécuter certaines commandes sans mot de passe via sudo. Lorsqu'un des utilisateurs fait une faute de frappe ou exécute une commande incorrecte, le système lui demande son mot de passe, puis il obtient une erreur. C'est déroutant pour l'utilisateur, donc je voudrais simplement afficher une erreur au lieu de lui demander un mot de passe. Est-ce possible?

Voici un exemple de mon fichier sudoers:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Exemple quand ils exécutent le mauvais script:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Sortie désirée:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Notez l'absence d'invite de mot de passe.

Mon google-fu m'a échoué et ne renvoie des résultats que si je ne demande pas de mot de passe lorsque l'utilisateur est autorisé à exécuter la commande.

user184982
la source
8
Si cela était possible, cela pourrait ouvrir un (petit) trou de sécurité. Si vous vous êtes connecté et que j'emprunte votre clavier, je ne vois pas quelles commandes sudovous permettront d'exécuter sans entrer votre mot de passe. Avec la fonctionnalité que vous souhaitez, je pourrais obtenir ces informations pour des commandes spécifiques.
Keith Thompson
4
C'est un gros problème de sécurité, vous ne devez pas utiliser sudo avec des scripts comme commande. Les gens peuvent simplement modifier le script et exécuter ce qu'ils veulent en le masquant totalement d'un audit. Ajoutez plutôt l'appel à sudo dans le script.
coteyr
1
@coteyr exécuter des fichiers binaires avec sudoest tout aussi important si les utilisateurs ont un accès en écriture à ces fichiers.
Dmitry Grigoryev
1
@CarlWitthoft c'est pourquoi vous utilisez des chemins absolus pour spécifier les programmes autorisés dans sudoers.
Dmitry Grigoryev
1
@DmitryGrigoryev, oui, mais si vous allez utiliser sed ou un tel pour un seul fichier, il n'y a aucun avantage pour sudo. Permettre à un utilisateur de modifier un fichier est la raison pour laquelle les fichiers ont des autorisations. Vous n'avez pas à réinventer la roue. Si vous voulez qu'un utilisateur puisse modifier un fichier, laissez-le. Il n'y a pas besoin ou avantage de sauter à travers les cerceaux avec sudo pour permettre à un utilisateur de modifier un fichier, sans mot de passe. Vous pouvez toujours les autoriser. Le bon outil pour le bon travail.
coteyr

Réponses:

25

D'une lecture rapide de sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

Et pour les sceptiques:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

Testé ainsi:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Donc, un aliasfor sudopour ces gens ferait probablement l'affaire, pour empêcher l'invite de mot de passe. Maintenant, pourquoi cela nécessite une compilation personnalisée sudo, je ne sais pas, je viens de lire le manuel.

branler
la source
En effet. Je alias sudo="$(which sudo) -n"mettrais quelque chose comme dans / etc / bashrc, puis j'utiliserais sudo(comportement ajusté) ou command sudo(comportement par défaut) comme souhaité.
un CV
7

Une chose qui a fonctionné pour moi, (version Sudo 1.8.17p1), mais qui ne satisfait qu'une partie de votre problème, est de définir le nombre de tentatives de mot de passe à 0.

Defaults:%mygroup passwd_tries = 0

Cela fait que sudo quitte avec le code 1 lorsqu'une commande nécessitant un mot de passe est essayée. Cependant, il ne produit aucune sorte de message d'erreur.

meuh
la source
C'est également une réponse valable, mais l'absence de message d'erreur peut prêter à confusion. L'erreur correcte mais inattendue de la réponse ci-dessus est également source de confusion. C'est un lancer, je suppose. Merci de fournir une réponse alternative, les options sont toujours appréciées!
user184982
2

Vous ne pouvez pas.

Il n'y a aucun moyen de savoir qui vous êtes tant que vous ne vous êtes pas authentifié et, par défaut, vous ne pouvez pas vous authentifier sans mot de passe.

Vous pouvez modifier l'authentification pour utiliser des clés USB, des scanners d'empreintes digitales, l'authentification vocale, la reconnaissance faciale ou un tas d'autres choses, mais le point est le même.

Vous ne pouvez pas vous authentifier, sans authentification ET avant de vous authentifier, sudo n'a rien à vous dire ce que vous pouvez ou ne pouvez pas exécuter.

coteyr
la source
2
Taper votre mot de passe lorsque vous exécutez sudo n'est pas une identification («dites qui vous êtes»). Sudo sait qui vous êtes. La saisie de votre mot de passe est une confirmation de présence.
Gilles 'SO- arrête d'être méchant'
Je considère la confirmation de présence comme une "authentification". Comme dans Authentification, puis Autorisation.
coteyr
2
La réponse dit "authentification" et non "identification". Bien que sudo sache qui vous prétendez être, en fonction de l'utilisateur connecté à ce terminal, il ne sait pas qui vous êtes tant que vous n'avez pas authentifié cette identité.
Dave Sherohman
2

@StrongBad a fait un commentaire qui mérite d'être une réponse:

Je pense que la meilleure solution serait d'écrire un script wrapper qui appelle toujours sudoavec les bons paramètres. (Comprenant-n )

Le script wrapper peut effectuer une analyse d'arguments, etc. afin que le script sudo appelé soit aussi petit que possible et donc moins susceptible d'avoir des bogues.

Stig Hemmer
la source
1

Ce n'est pas possible. La seule façon est de changer le code source et de compiler votre propre fork desudo

user1700494
la source
Vous avez raison, mais je ne pense pas que je vais obtenir la permission de charger une version personnalisée de sudo sur tous nos serveurs de production. hah
user184982