Fichier Sudoers, activer NOPASSWD pour l'utilisateur, toutes les commandes

Préface

C'est une question assez complexe liée au fichier sudoers et à la commande sudo en général.

REMARQUE: J'ai effectué ces modifications sur une machine dédiée exécutant Ubuntu Desktop 13.04, que j'utilise uniquement à des fins d'apprentissage. Je comprends que c'est un énorme risque pour la sécurité d'activer NOPASSWD sudo.

Question

Au départ, mon seul changement au fichier sudoers (/etc/sudoers) était une ligne, une spécification utilisateur qui aurait dû permettre à nicholsonjf d'exécuter toutes les commandes avec sudo sans avoir à entrer de mot de passe (voir la ligne qui commence par nicholsonjf):

# This file MUST be edited with the 'visudo' command as root.## Please consider adding local content in /etc/sudoers.d/ instead of# directly modifying this file.## See the man page for details on how to write a sudoers file.#Defaults        env_resetDefaults        mail_badpassDefaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Host alias specification# User alias specification# Cmnd alias specification# User privilege specificationroot    ALL=(ALL:ALL) ALLnicholsonjf    ALL=NOPASSWD: ALL# Members of the admin group may gain root privileges%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command%sudo   ALL=(ALL:ALL) ALL# See sudoers(5) for more information on "#include" directives:#includedir /etc/sudoers.d

Cependant, cela n'a pas fonctionné, et j'étais toujours invité à entrer mon mot de passe chaque fois que j'exécutais une commande en tant que nicholsonjf. Je n'ai pu commencer à exécuter des commandes sudo en tant que nicholsonjf qu'une fois que j'ai supprimé nicholsonjf des groupes sudo et admin.

Quelqu'un peut-il expliquer pourquoi cela a fonctionné?

Est-ce parce que l'utilisateur nicholsonjf héritait des droits sudo des deux spécifications de groupe de admin et sudo (vu ci-dessous dans le fichier sudoers), qui remplaçaient la spécification utilisateur nicholsonjf parce qu'ils étaient plus bas dans le fichier de configuration?

La ligne que vous avez ajoutée a été remplacée. De man sudoers:

Lorsque plusieurs entrées correspondent pour un utilisateur, elles sont appliquées dans l'ordre. Lorsqu'il y a plusieurs correspondances, la dernière correspondance est utilisée (ce qui n'est pas nécessairement la correspondance la plus spécifique).

Dans votre cas nicholsonjf était membre du groupe sudo donc pour lui cette ligne s'appliquait:

%sudo   ALL=(ALL:ALL) ALL

Si vous souhaitez remplacer des entrées dans /etc/sudoers il suffit de mettre les nouvelles entrées après eux.

La nouvelle entrée devrait ressembler à

myuser ALL=(ALL) NOPASSWD: ALL pour un seul utilisateur, ou

%sudo ALL=(ALL) NOPASSWD: ALL pour un groupe.

Pour un seul utilisateur, ajoutez cette ligne à la fin de votre sudoers fichier utilisant le sudo visudo commande:

superuser ALL=(ALL) NOPASSWD:ALL

Pour un groupe

%supergroup  ALL=(ALL) NOPASSWD:ALL

Pour ne jamais demander un mot de passe à l'utilisateur actuel lorsque cet utilisateur utilise sudo exécutez cette commande:

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password

Il crée un fichier appelé /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password avec le contenu suivant:

<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL

Les avantages de le faire de cette façon plutôt que d'ajouter manuellement cette ligne à /etc/sudoers utiliser sudo visudo (comme suggéré par les autres réponses) sont

  1. /etc/sudoers est parfois modifié par les mises à jour du système, alors que les fichiers dans /etc/sudoers.d ne sont pas
  2. le sudo visudo la méthode est sujette aux erreurs (comme en témoigne cette question même), alors que copier et coller une commande est plus difficile à gâcher

Notez que vous pouvez toujours être invité à entrer le mot de passe dans d'autres contextes, tels que l'installation d'éléments à partir du Logiciel Ubuntu application graphique.

Selon sudo cat /etc/sudoers.d/README cette fonctionnalité (de mettre des fichiers sudoer supplémentaires dans /etc/sudoers.d) est activé par défaut depuis Debian 1.7. 2p1-1, qui sorti à la fin des années 1990 (Ubuntu est basé sur Debian).

En faisant des recherches, j'ai réalisé qu'il y avait une ligne dans le /etc/sudoers fichier qui n'est pas un commentaire, mais un directive cela fait n'importe quel fichier ou dossier sous le répertoire /etc/sudoers/* remplacer le contenu de /etc/sudoers.

C'est une petite directive sournoise, car elle semble être une ligne commentée au premier coup d'œil. Il ressemble à ceci:

#includedir /etc/sudoers.d

Voici comment j'ai implémenté l'utilisateur non root, sans mot de passe, dans une image Docker éphémère à utiliser dans un pipeline CICD avec l'image de base d'ubuntu: 18.04:

RUN \  useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \  sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \  sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \  sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \  echo "Customized the sudoers file for passwordless access!" && \  echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \  echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \  echo "foo user:";  su foo -c 'whoami && id' && \  echo "root user:"; su root -c 'whoami && id'

Que se passe-t-il avec le code ci-dessus:

  • L'utilisateur et le groupe foo est créé.
  • Utilisateur foo est ajouté aux deux le foo et sudo groupe.
  • Le répertoire personnel est défini sur /home/foo.
  • Le shell est défini sur /bin/bash.
  • Le sed la commande effectue des mises à jour en ligne du /etc/sudoers fichier à autoriser foo et root accès sans mot de passe des utilisateurs au sudo groupe.
  • Le sed la commande désactive le #includedir directive qui permettrait à tous les fichiers des sous-répertoires de remplacer ces mises à jour en ligne.

Comme Vince avoir mentionné dans un commentaire, vous pouvez utiliser cette ligne:

%sudo ALL=NOPASSWD: ALL

(Ceci est différent des lignes indiquées dans ceux réponse, et cela a résolu le problème pour moi.)

On peut insérer une chaîne dans une ligne sans formatage EOF à la fin du fichier sudoers ou supprimer avec sed -i:

cat >> /etc/sudoers <<<'PaSe ALL=(ALL:ALL) NOPASSWD:ALL'

Référence:https://stackoverflow.com/questions/41298208/how-to-append-a-line-at-the-end-of-etc-sudoers-file-using-shell-script-without/70039824#70039824

remarque: ALL=NOPASSWD: ALL doit être ALL=(ALL) NOPASSWD: ALL sinon cela ne fonctionne pas…

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

voir aussi cette réponse : sudo does not ask for password - Ask Ubuntu