Donner accès à un ensemble de commandes à un utilisateur non root sans sudo

13

Je veux donner un accès non-sudo à un utilisateur non root sur ma machine, il y a un utilisateur dns-manager, son seul rôle est d'exécuter toutes les commandes BIND (rndc, dnssec-keygen) etc.

Maintenant, chaque fois qu'il doit exécuter une commande, il tape,

sudo rndc reload

Existe-t-il un moyen de me débarrasser de ce sudo, mais uniquement sur un ensemble particulier de commandes (et uniquement pour dns-manager)?

Anss
la source
5
Le contrôle d'accès discrétionnaire comme celui-ci est à peu près à quoi cela sudosert. Quelles sont vos objections commerciales à son utilisation sudopour cela?
MadHatter
1
@peterh Je répète ma question: le contrôle d'accès discrétionnaire (c'est-à-dire la délégation partielle d'administrateur système) est le rôle de sudo. Quelles sont les objections?
MadHatter
3
Que diriez-vous sans mot de passe sudoalors? Ou sudo avec mot de passe pour exécuter l'outil de gestion DNS , qui peut ensuite fonctionner avec namedle privilège de groupe ou d'utilisateur, ou le privilège root, selon les besoins.
MadHatter
4
@peterh "une bonne raison de procéder ainsi" serait le bit manquant. Habituellement, des questions comme celle-ci s'avèrent être des problèmes XY déguisés, et je trouve que la compréhension du problème sous-jacent est la clé pour y répondre de manière complète et professionnelle.
MadHatter
2
@peterh Je pense que nous sommes d'accord les uns avec les autres. Moi aussi, je veux que le PO améliore sa question; approfondir cela fonctionne bien pour moi comme un moyen d'aider l'auteur à sortir des sentiers battus qu'il a construits autour de lui. Il a peut-être une bonne raison de vouloir éviter sudo. En essayant de nous l'exprimer, il peut soit dissiper notre confusion, soit la sienne - ou les deux!
MadHatter

Réponses:

31

Si je comprends bien vos commentaires, le problème ici est que la commande sera émise via une connexion qui n'a pas la possibilité d'entrer le mot de passe par défaut que sudo demande. De plus, dans de nombreuses distributions de système d'exploitation, sudo exigera par défaut un TTY - ce que ce programme peut ne pas avoir.

Cependant, sudo est capable d'avoir une structure d'autorisations très fine, permettant à un ou plusieurs utilisateurs d'émettre une commande particulière sans mot de passe et ATS. Ci-dessous, je vais montrer trois façons de configurer cela pour vos besoins. Quel que soit celui que vous choisissez, l'utilisateur pourra désormais exécuter la commande sudo rndc reloadsans avoir à saisir de mot de passe.

( De plus, cela peut être inutile, mais ... s'il vous plaît rappelez - vous de faire une copie de sauvegarde de votre fichier sudoers avant de le modifier, de garder une coquille où vous êtes ouvert racine dans le cas où vous devez revenir à la sauvegarde et à modifier en utilisant visudoau lieu desudo vi /etc/sudoers . Espérons que ces précautions seront inutiles, mais ... mieux de les avoir et pas besoin d' eux que l'inverse!)

1. Si vous ne souhaitez pas exiger un ATS pour toute demande

Le moyen le plus simple de se débarrasser des exigences TTY (s'il en existe un) est de s'assurer que la ligne commençant par Defaultsin /etc/sudoersne contient pas le mot requiretty- à la place, il doit contenir !requiretty. Cependant, si vous faites cela, cela signifie qu'aucune commande sudo ne nécessitera un tty!

Vous devrez également ajouter la ligne

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Si vous souhaitez exiger un ATS pour tous les utilisateurs sauf celui-ci

Cela peut être fait en définissant une valeur par défaut pour cet utilisateur, comme ceci:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Si vous souhaitez requre un TTY pour toutes les commandes sauf celle-ci par cet utilisateur

C'est un peu plus complexe, en raison de la syntaxe du fichier sudoers. Vous devez créer un alias de commande pour la commande, puis définir une valeur par défaut pour cet alias de commande, comme suit:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD
Jenny D
la source
Bien sûr, cela peut être combiné avec un script wrapper qui appelle la commande à l'aide de sudo, si pour une raison quelconque vous ne pouvez pas utiliser sudo directement même sans mot de passe.
Jenny D
4

Oui. sudo peut être configuré de manière très flexible. Néanmoins, je dois mentionner: ces types de solutions ne doivent pas être considérés comme très sécurisés, et ils ne doivent être utilisés que dans un environnement coopératif où d'autres contrôles sont en place (ainsi, vous pouvez accorder ces privilèges améliorés à votre fidèle subordonné, mais ne devrait pas le faire pour un client que vous ne connaissez que sur le net).

La configuration sudo est présente /etc/sudoersdans la plupart des systèmes. Vous pouvez découvrir sa syntaxe par Google ou par une man sudocommande.

Vous ne devez pas modifier ce fichier directement; cela peut conduire à des conditions de concurrence sécuritaires. À la place, utilisez la visudocommande (qui est un wrapper autour de votre $EDITORvariable d'environnement).


Après avoir configuré sudo, vous pouvez facilement envelopper les commandes visibles. C'est très simple:

  1. Créez un répertoire pour une liste de vos scripts wrapper sudo (fe /usr/local/dnsadmin/bin)
  2. Créez un script wrapper pour les commandes que vous souhaitez rendre utilisables sans sudo. Ce sera une commande très simple, par exemple, /usr/local/dnsadmin/bin/rndcsera:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Obtenez ce répertoire dans leur PATHvariable d'environnement (par exemple par un système ou leur local .profile).

peterh - Réintégrer Monica
la source
Par curiosité - pourquoi utiliseriez-vous execdans le script shell au lieu d'appeler directement la commande? (Je ne dis pas que c'est mal, j'aime juste savoir pourquoi tu le fais pour que je puisse peut-être apprendre quelque chose)
Jenny D
2
J'en ai fini avec le bit sudo sans mot de passe, l'idée des scripts wrapper est géniale.
Anss
2
@JennyD :-) En raison de la stabilité et des performances. Dans le cas de exec, la commande appelée sera substituée à la place du shell. La coquille disparaîtra. Sans exécutable, le shell démarrera cette commande, attendra sa fin, puis se fermera. Cette seconde, sans exécutable, signifie plusieurs processus de coopération, ce qui est inutile. Mais il n'y a pas de grande différence, sans exécutable, cela fonctionnerait aussi bien qu'avec cela.
peterh
@JennyD Mon plaidoyer :-)
peterh
@Snowbody Merci beaucoup pour la lecture! C'est un très grand honneur.
peterh
2

Bien que ce ne soit pas une solution générale dans le cas spécifique où rndcvous n'en avez pas du tout besoin sudo.

rndcpeut communiquer avec n'importe quel namedprocessus via une socket locale ou un port distant, en utilisant une clé secrète pour s'authentifier. Par défaut (ou du moins, pour debian, qui est la distribution que j'utilise), ce fichier peut être trouvé /etc/bind/rndc.keyet n'est normalement lisible que par l'utilisateur bindet le groupe bind.

Quiconque a un accès en lecture à ce fichier de clé (ou à une copie identique de celui-ci) peut utiliser rndcpour contrôler le serveur BIND, donc la solution la plus simple dans ce cas particulier serait d'ajouter l'utilisateur au bindgroupe.

Un nombre surprenant de démons communs ont quelque chose de similaire (je suis personnellement en train de comprendre les possibilités des powerdns à cet égard, mais cela semble prometteur jusqu'à présent). Si vous ne voulez pas le faire, sudovous devrez vérifier si ce que vous voulez accomplir est possible au cas par cas.

Shadur
la source
-1

Vous ne voulez pas utiliser sudo pour accorder root à certaines commandes. Au lieu de cela, vous pouvez chmod 4750 un programme spécifique [qui peut encapsuler la commande], pour élever les droits d'un utilisateur normal pour l'exécuter en tant que root.

bbaassssiiee
la source