Pourquoi l’option sudoers NOPASSWD ne fonctionne-t-elle pas?

75

J'ai une ligne NOPASSWD dans / etc / sudoers (édité avec visudo)

gatoatigrado    ALL=(ALL) NOPASSWD: /bin/set-slow-cpufreq

Cependant, la sortie est,

gatoatigrado@coral:~> sudo -n /bin/set-slow-cpufreq
sudo: sorry, a password is required to run sudo

Ce type de commande fonctionne sur une machine OpenSuSE, mais pas sur Ubuntu 11.10. Qu'est-ce que je fais mal?

Remarque : Je ne trouve aucun message de journal système pertinent, par exemple via tail -f /var/log/syslog.

modifier

Voici / etc / sudoers.

Defaults    env_reset

# things I've tried copying from an opensuse machine
Defaults always_set_home
Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE"

root    ALL=(ALL:ALL) ALL
gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq
%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL
gatoatigrado
la source
2
Pouvez-vous montrer le plein sudoers, l'ordre des règles n'est pas sans importance.
enzotib

Réponses:

118

Vous devriez mettre cette ligne après la ligne avec la règle pour le sudogroupe, car, comme le dit la sudoerspage de manuel:

   When multiple entries match for a user, they are applied in order.
   Where there are multiple matches, the last match is used (which is not
   necessarily the most specific match).
enzotib
la source
5
cela vaut également pour les utilisateurs de plusieurs groupes: par exemple, l'utilisateur appartient au groupe admin et au groupe sudo si la règle pour sudo est postérieure à admin, la règle pour sudo remplace la règle admin pour l'utilisateur des deux groupes.
Populus
2
Merci! J'ai ajouté ma ligne à la fin de /etc/sudoerset cela fonctionne maintenant. Explication complète ici aux personnes intéressées: techglimpse.com/ubuntu-sudoers-nopasswd-option-not-working
elimisteve
4

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).

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

Insérez votre ligne accordant la permission: gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq

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 imprime, AaBbCcetc., ou ABCensuite abcde déterminer quel serait le meilleur préfixe de la dernière lettre à utiliser.

dragon788
la source
Je suis d'accord avec ça. Une partie de la logique dans l'édition du fichier / etc / sudoers semblait contre-intuitive - je ne pouvais pas obtenir% wheel ALL = (ALL) NOPASSWD: ALL fonctionne comme il était écrit en sudoers jusqu'à ce que je lise un message où quelqu'un dit #includedir La ligne /etc/sudoers.d doit précéder les autres lignes telles que% SUDO et% WHEEL. Lorsque j'ai placé le répertoire #include au-dessus des autres autorisations de groupe, ils ont commencé à fonctionner. Alors, j’ai créé des fichiers pour chaque groupe dans /etc/sudoers.d/ numérotés dans le même ordre qu’ils figuraient dans le fichier sudoers, mais la racine ALL = ((ALL)) devait toujours être sudoers sous la ligne #includedir. Bizarre.
AveryFreeman
En fait, je pense que l’incluseur devrait rester à la fin des sudoers. Ce que vous avez probablement vu, c’est que l’un des autres fichiers de votre fichier sudoers.d annulait votre modification. Vous avez peut-être également eu une ligne plus bas dans votre fichier principal qui restreignait le groupe de roues. Gardez à l'esprit que sudoers est traité là où la dernière règle à appliquer à une commande ou à un groupe gagne. Il est donc utile d'être plus spécifique, mais si une commande générale quelconque arrive à la fin et n'a pas NOPASSWD, elle remplacera vos exceptions précédentes. C'est pourquoi vous devriez avoir vos règles dans des fichiers séparés pour qu'elles soient traitées plus tard.
dragon788
Je ne pense pas, c’était une nouvelle installation d’arch. Tout ce que j'ai fait, c'est essayer de décommenter cette ligne. Mais c'est certainement une bonne chose à vérifier, merci.
AveryFreeman
Certains systèmes n'utilisent pas réellement wheel et utilisent plutôt un groupe appelé sudo, adm ou admin. Je ne me souviens pas du comportement d'Arch, mais vous pouvez vous lancer idet voir à quels groupes vous appartenez.
dragon788
Arch utilise la roue.
AveryFreeman
4

Juste couru dans cela aussi.

Ma situation est que je suis en train de mettre en place un système distant qui fonctionnera sans tête. J'ai activé le chiffrement intégral du disque (sinon, un attaquant disposant d'un accès physique peut faire tout ce qu'il veut.) Je souhaite utiliser uniquement la clé de publication (je vais supprimer le mot de passe afin que le schéma "avoir quelque chose, sache quelque chose" soit un mot de passe paire de clés protégée - la connexion root est bien entendu entièrement désactivée)

Le programme d'installation Ubuntu demande à un utilisateur administrateur non root d'être ajouté au groupe sudo. Je m'étais ensuite ajouté manuellement au sudoersfichier en utilisant sudo visudo:

my_username ALL=(ALL:ALL) NOPASSWD:ALL

NOTE Si vous utilisez nopasswd sur votre ordinateur portable, vous devez toujours verrouiller votre ordinateur pendant que vous vous en éloignez. Sinon, un attaquant occasionnel peut faire beaucoup de compromis pendant que vous vous levez pour mettre de la crème dans votre café.

Je devais encore authentifier par mot de passe.

La réponse de enzotib est la clé de ce qui se passe. Le groupe sudo apparaît dans sudoers après l'entrée de mon nom d'utilisateur.

Plutôt que de déplacer mon entrée au-dessous de la ligne sudo, j’ai simplement supprimé la ligne que j’avais précédemment ajoutée puis ajoutée NOPASSWDà l’entrée pour%sudo

Cela semble fonctionner. Encore une fois, utilisez uniquement nopasswd si vous en avez vraiment besoin (dans mon cas, c’était exactement ce dont j’avais besoin, pour la plupart des utilisateurs nécessitant un mot de passe pour une activité sudo, c’est mieux)

AVERTISSEMENT supplémentaire: modifiez toujours les sudoers avec visudo. (sudo visudo) De plus, le fait d’avoir une autre fenêtre ouverte commutée sur l’utilisateur root vous permet de récupérer les erreurs éventuelles lors de la modification du fichier sudoers.

Jorfus
la source
Ce n’est jamais une bonne idée d’activer NOPASSWD contre toutes les commandes, cela signifie que quiconque se connecte à votre système et parvient à faire entrer un utilisateur dans le groupe sudo sera en mesure de faire TRÈS BON n'importe quel mauvais système à votre système. Je peux facilement le faire avec seulement quelques minutes d'accès à l'aide d'un LiveCD ou en incitant votre utilisateur à exécuter une cmd appelée sudoqui utilise vos propres autorisations pour ajouter un autre utilisateur au groupe sudo en plus de l'exécution de la commande demandée.
dragon788
2
Ne faites pas de déclarations générales comme celle-ci. Sur un système sans tête, il n'est pas du tout souhaitable de définir un mot de passe de connexion (reposant plutôt sur des paires de clés). J'ai activé le cryptage intégral du disque. Bonne chance avec ce cd en direct. (ce qui, en passant, vous permettrait de faire toutes sortes de choses amusantes sur un système non chiffré, quel que soit le fichier sudoers). De plus, vous ne pouvez écrire dans aucun des emplacements de mon chemin et je ne vous donnerai pas de shell pour commencer. sauf si je vous fais confiance pour ne pas tenter de renverser le système. Votre problème de sécurité n’est pas invalide, il est simplement dépassé et n’est pas aussi universellement applicable que vous le supposez.
Jorfus
Pour ceux qui ne comprennent pas bien la sécurité comme vous, ce type de recommandation est probablement meilleur que l’alternative, mais je conviens que ce n’est pas idéal.
dragon788
@ dragon788 En réalité, nous pouvons peut-être modifier nos réponses pour aider les utilisateurs de tous les niveaux à faire un pas en avant vers une sécurité renforcée. J'ajouterai un avertissement pour activer le chiffrement intégral du disque afin d'empêcher toute compromission lorsqu'un attaquant dispose d'un accès physique, ainsi que la remarque suivante: si un utilisateur d'ordinateur portable oublie de verrouiller son ordinateur en public, la procédure sudo nopasswd pourrait rapidement conduire à une compromission. (Bien que je propose la mise en une touche rapide de serrure.Serrure cinq minutes et l' écran pourrait effectivement conduire à une meilleure sécurité.)
jorfus
Excellente mise à jour, ma réponse ne contient aucune recommandation forte autre que ces commentaires, et assez ironiquement au travail où j'utilise le chiffrement intégral du disque, j'ai activé NOPASSWD parce que j'ai un mot de passe très sécurisé qui devient difficile à taper et j'utilise xautolock pour verrouiller ma machine après un court temps d'inactivité.
dragon788
0

Sur le système distant, supprimez le cryptage, mais laissez la racine appartenir à la racine, comme dans le groupe des "Administrateurs" - ce n'est pas 0!
Vous pouvez modifier #sudo -g Administrators ceux qui nécessitent un accès complet - pas dans le sudo fichier, mais dans le .loginprofil. N'importe quel script standard peut maintenant avoir accès à la télécommande en tant que "racine" et vous pouvez protéger les fichiers qui doivent être protégés.
Un autre "groupe" pratique est "Sandbox" avec un répertoire de connexion dans le cache du navigateur et peut le lire librement et rien d'autre. Utilisez le premier caractère majuscule.

Knut H
la source