67 votes

Pourquoi le système dispose-t-il de /etc/sudoers.d ? Comment dois-je le modifier ?

La dernière fois, j'ai posé une question sur le risque de ces derniers (dans /etc/sudoers) :

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

En réfléchissant à ce problème, j'ai trouvé /etc/sudoers.d répertoire. Les fichiers dans le répertoire devraient avoir des fonctions similaires à /etc/sudoers (ce qui signifie que les scripts ci-dessus sont toujours problématiques même dans /etc/sudoers.d), et cependant un article dit que nous ne devrions pas utiliser le répertoire parce que nous ne pouvons pas utiliser visudo pour modifier les fichiers qui s'y trouvent. C'est-à-dire que nous perdons le droit d'utiliser sudo si nous faisons une erreur dans le répertoire.

Si c'est vrai, pourquoi avons-nous /etc/sudoers.d ? Ou bien disposons-nous d'un bon moyen de modifier les fichiers en /etc/sudoers.d ?

77voto

John1024 Points 15663

Oui, vous pouvez utiliser visudo pour modifier ces fichiers. Tout ce que vous avez à faire est de spécifier le nom du fichier que vous voulez éditer avec l'option -f option. Par exemple :

visudo -f /etc/sudoers.d/somefilename

Ou, si nécessaire :

sudo visudo -f /etc/sudoers.d/somefilename

Documentation

En man visudo :

-f sudoers
Spécifier un autre emplacement pour le fichier sudoers. Avec cette option, visudo éditera (ou vérifiera) le fichier sudoers de votre choix, au lieu du fichier par défaut, /etc/sudoers. Le fichier de verrouillage utilisé est le fichier sudoers spécifié, auquel est ajouté ".tmp". En mode vérification uniquement, l'argument à -f peut être "-", indiquant que sudoers sera lu depuis l'entrée standard.

En résumé :

  1. Syntaxe : Les deux sites visudo y visudo -f effectuent le même contrôle syntaxique .

  2. Permissions/propriété : En tant que fonctionnalité ajoutée pour faciliter l'administration des grands systèmes les fichiers édités sous visudo -f ne font pas l'objet d'une vérification de la propriété ou des autorisations : cela permet de vérifier la syntaxe d'un fichier hors ligne ou dans le cadre d'un système de contrôle de révision.

Pourquoi utiliser /etc/sudoers.d/

Typiquement /etc/sudoers est sous le contrôle du gestionnaire de paquets de votre distribution. Si vous avez apporté des modifications à ce fichier et que le gestionnaire de paquets souhaite le mettre à niveau, vous devrez inspecter manuellement les modifications et approuver la manière dont elles sont fusionnées dans la nouvelle version. En plaçant vos modifications locales dans un fichier du répertoire /etc/sudoers.d/ vous évitez cette étape manuelle et les mises à jour peuvent se faire automatiquement.

Quand est-ce que sudo ignorer un fichier dans /etc/sudoers ?

Si votre /etc/sudoers contient la ligne :

#includedir /etc/sudoers.d

puis sudo lira les fichiers dans le répertoire /etc/sudoers.d .

Les exceptions sont :

  1. Les fichiers dont le nom se termine par ~
  2. Les fichiers dont le nom contient un . caractère

Ceci est fait (a) pour la commodité des gestionnaires de paquets et aussi (b) pour que les fichiers de sauvegarde des éditeurs soient ignorés.

60voto

DisgruntledGoat Points 21368

Les modifications apportées aux fichiers dans /etc/sudoers.d restent en place si vous mettez le système à niveau. Cela peut empêcher le blocage des utilisateurs lors de la mise à niveau du système. Ubuntu a tendance à apprécier ce comportement. D'autres distributions utilisent également cette disposition.

D'après mon expérience, les règles concernant les fichiers de ce répertoire sont plus souples que celles qui s'appliquent à /etc/sudoers . Cela a inclus :

  • Les erreurs dans le dossier n'ont pas causé sudo d'échouer. Cependant, le fichier a été ignoré.
  • Les règles d'autorisation semblent moins strictes. Il permet au groupe applicable ou autre de lire le fichier. Je ne crois pas que cela était possible avec /etc/sudoers . Les droits d'écriture doivent être limités à root pour maintenir la sécurité. La version actuelle de sudo sur Ubuntu permet des permissions de lecture pour les groupes ou autres. (Cette capacité permet d'auditer l'accès à sudo sans avoir besoin d'un accès root).

En visudo par défaut, la commande /etc/sudoers . Il modifiera et vérifiera tout fichier que vous spécifiez avec l'option -f option. J'utilise cette possibilité pour éditer des fichiers qui seront automatiquement installés en tant que /etc/sudoers ou dans /etc/sudoders.d . Cependant, les définitions d'autres fichiers peuvent ne pas être trouvées. Il est préférable de rendre le fichier indépendant.

La possibilité de disposer de fichiers autonomes simplifie la tâche d'une application permettant de sudo lors de l'installation et les retirer lors de la désinstallation. Les outils de configuration automatisés peuvent également utiliser cette fonctionnalité.

J'ai utilisé cette capacité pour isoler les changements nécessaires pour accorder l'accès à des groupes d'utilisateurs spécifiques sur des systèmes spécifiques.

23voto

Luca Molteni Points 2328

pourquoi avons-nous /etc/sudoers.d ?

Parce qu'il est plus facile pour les outils automatisés (tels que Chef ou Puppet) de déposer des fichiers individuels dans ce répertoire, plutôt que d'effectuer des modifications dans le répertoire /etc/sudoers qui pourrait être fragile.

Les fichiers dans /etc/sudoers.d sont (en fait) concaténés. Vous verrez plusieurs autres exemples de ce modèle dans les documents suivants /etc comme /etc/cron.d y /etc/logrotate.d .

17voto

dragon788 Points 822

Un autre avantage de l'utilisation de visudo -f Comme mentionné dans certaines réponses, il y a une option correspondante. -c o --check qui vérifie que vous n'avez pas d'informations invalides dans un fichier sudoers.d ou dans tout autre fichier que vous pourriez vouloir mettre dans sudoers.d. C'est VRAIMENT pratique dans les cas mentionnés avec des outils automatisés, car vous pouvez lancer par ex.

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

Ceci vérifie silencieusement le fichier (pas de sortie à cause de -q) et seulement si cela ne retourne PAS une erreur (exit 1 signifie un fichier sudoers invalide) alors il copiera le fichier dans sudoers.d, de cette façon vous pouvez créer le fichier et travailler dessus sans avoir à le faire correctement la première fois (en utilisant sudo visudo -f /etc/sudoers.d/myfile doit réussir, sinon il rejette le contenu si vous ne le corrigez pas).

En outre, un un mot de prudence concernant ces déclarations à partir des autres réponses.

D'après mon expérience, les règles sur les fichiers de ce répertoire sont plus souples que pour /etc/sudoers. Cela inclut :

Les erreurs dans le fichier n'ont pas fait échouer sudo. Cependant, le fichier a été ignoré. Les règles de permission semblent moins strictes. J'autorise le groupe applicable à lire le fichier. Je ne pense pas que cela soit possible avec /etc/sudo.

Les fichiers du fichier /etc/sudoers.d doivent respecter la même syntaxe que le fichier /etc/sudoers, car sous couvert, le système concatène simplement tous les fichiers avec le dernier en "gagnant" s'il existe plusieurs entrées pour le même paramètre singulier.

Si les permissions sont terriblement incorrectes (accessible en écriture par le monde entier) sur les fichiers dans /etc/sudoers.d/, alors ils sont ignorés, cela peut être la cause de l'oubli des fichiers invalides, sinon vous pouvez sérieusement briser le programme sudo en ayant un fichier sudoers.d invalide avec des permissions correctes.

Vous pouvez permettre aux fichiers sudoers d'être lisibles par le monde entier, si vous accordez accidentellement à 'other' le droit d'écriture, vous devez sudo en tant qu'autre utilisateur ou depuis un terminal root exécuter cette commande. Cela peut également se produire si le fichier appartient à quelqu'un d'autre que root:root.

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

Je viens de confirmer que si je lance chmod o+w /etc/sudoers.d/vagrant Je ne peux plus faire de sudo en tant qu'utilisateur de vagrant, il me demande mon mot de passe et échoue.

Quand j'ai couru sudo -l pour afficher les autorisations de la commande appliquée en tant qu'autre utilisateur sudo valide, j'ai également reçu un avertissement concernant les autorisations du fichier. C'est la même commande que j'ai utilisée pour confirmer que l'utilisateur 'vagrant' a perdu sudo lorsque j'ai appliqué o+w au fichier donnant à cet utilisateur les droits sudo.

8voto

BarbaAlGhul Points 93

Juste un bref ajout à toute réponse générale... aucune des autres réponses n'a résolu mon problème, à savoir que l'ordre est important.

Si vos lignes fonctionnent dans sudoers mais pas dans sudoers.d, essayez de déplacer les #include, ou de changer l'ordre de vos fichiers sudoers.d (en les préfixant avec un numéro). Il semble que la chose la plus spécifique devrait être en premier dans le fichier.

J'avais quelque chose comme :

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

Et le 2ème n'avait aucun effet car le premier correspondait déjà. NOPASSWD n'est pas une condition, mais un moyen de modifier l'action.

Et ce n'était pas évident car ce n'était pas dans un seul fichier, à cause du répertoire sudoers.d.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X