Autoriser un groupe non sudo à contrôler le travail Upstart

11

J'essaie de configurer un travail Upstart à exécuter au démarrage du système, et qui peut également être démarré / arrêté par des membres d'un groupe autre que sudo. Avec une version précédente, j'ai utilisé update-rc.det des scripts stockés /etc/init.d/pour que cela fonctionne en ajoutant %Group ALL = NOPASSWD: /etc/init.d/scriptnameà mon fichier sudoers, mais je n'arrive pas à obtenir un équivalent pour Upstart.

J'ai essayé d'ajouter %Group ALL = NOPASSWD: /sbin/initctl start jobnameau fichier sudoers, mais essayer d'exécuter la commande start jobnameproduit cette erreur:

start: Rejected send message, 1 matched rules; type="method_call", sender=":1.21" (uid=1000 pid=5148 comm="start jobname " interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

Autant que je sache, c'est une plainte sur la façon dont mon compte d'utilisateur n'est pas autorisé à envoyer des messages de démarrage dans le fichier de configuration D-Bus pour Upstart. Je n'ai pas pu trouver réellement d'informations sur la façon de modifier ce fichier pour donner à un groupe l'autorisation d'accéder à un service spécifique - une telle option existe-t-elle? Existe-t-il un moyen de modifier le fichier Sudoers afin que je puisse exécuter le travail sans modifier le fichier de configuration? Suis-je mieux de rester avec la version précédente?

Angle O'Saxon
la source

Réponses:

7

Vous pouvez commencer à trouver où la configuration spécifique de D-Bus pour Upstart est maintenu. Voir qui destination="com.ubuntu.Upstart"extrait du message d'erreur? Maintenant, essayez de le grep dans le dossier avec les fichiers de configuration D-Bus:

vhost07:~ $ grep -r "com.ubuntu.Upstart" /etc/dbus-1
/etc/dbus-1/system.d/Upstart.conf:    <allow own="com.ubuntu.Upstart" />
[...skipped...]

Ce Upstart.conffichier a quelques exemples de politiques. Je suppose que vous pourriez essayer de comprendre le format d'une politique de leur part . Ensuite , essayez de permettre à votre utilisateur spécifique seulement les actions dont il a besoin. Par exemple, comme dans:

<policy user="pope_benedict">
  <allow send_destination="com.ubuntu.Upstart"
         send_interface="com.ubuntu.Upstart0_6.Job"
         send_member="Start"/>
</policy>

Cela devrait permettre à l' pope_benedictutilisateur de commencer ce travail.

Notez que les valeurs des attributs de stratégie «autoriser» sont répertoriées dans votre message d'erreur d'origine.

Iuliu Pascaru
la source
1
Oh, et n'oubliez pas de redémarrer D-Bus après cela! :)
Iuliu Pascaru
J'ai trouvé ce un ahurissant de peu, mais cela a contribué: blog.arkency.com/2014/07/...
Mike Campbell
7

J'utilise personnellement la ligne suivante dans le fichier /etc/sudoers.d/jobname_myuser:

myuser ALL = (root) NOPASSWD: /sbin/start jobname, /sbin/stop jobname, /sbin/restart jobname, /sbin/status jobname

comme décrit ici: /server//a/390723/68608

Szymon Jeż
la source
2

Une telle option n'existe pas dans sudo.

La différence entre les scripts Sysv et les fichiers de configuration Upstart est juste que: les scripts Sysv sont des scripts, des exécutables à part entière et vous pouvez dire à sudo d'autoriser un groupe à les exécuter. En revanche, les fichiers de configuration Upstart ne sont que de simples fichiers de configuration, pas exécutables, de sorte que l'exécution start(lien symbolique initctl) est la chose permet sudo. Votre problème ici est que permettant aux gens de courir initctlvous leur permettre de initctltout.

La solution est si simple , si votre préoccupation qu'un seul emploi. Faire un script, par exemple /usr/bin/jobname.shavec

#!/bin/sh
initctl $1 jobname

puis chmod 755 /usr/bin/jobname.shet enfin ajoutez cet exécutable à votre fichier sudoers:

%Group ALL = NOPASSWD: /usr/bin/jobname.sh

De cette façon, tout le monde peut appeler jobname.sh startou jobname.sh stopcontrôler ce travail spécifique. Vous pouvez ajouter quelques vérifications pour permettre uniquement startet les stopparamètres , etc.

Tuminoid
la source
En d'autres termes, mon problème n'est pas que le système refuse aux membres du groupe la possibilité de s'exécuter initctl, mais que Upstart refuse tous les signaux envoyés par des utilisateurs / groupes qui ne reçoivent pas explicitement une entrée de stratégie Allow dans Upstart.conf? Et il n'y a aucun moyen de fournir plus de granularité qu'un paramètre tous travaux ou aucun dans le fichier de configuration?
Angle O'Saxon
Initctl dans votre cas fonctionne bien même sans changement de sudoers, Upstart refuse simplement les messages de celui-ci si vous ne l'autorisez pas spécifiquement pour les utilisateurs non root. Voir les deux autres réponses. Vous pouvez définir la politique dbus sur la base de chaque tâche (voir la com.ubuntu.Upstart0_6.<JOB>partie) dans Upstart.conf. Selon vos besoins, il pourrait être plus simple de créer ce type de script au lieu d'écrire des politiques dbus et de redémarrer dbus, etc. La politique Dbus est évidemment la «bonne» chose à faire, mais selon le cas, un script simple peut aller long chemin avec moins de problèmes.
Tuminoïde
La modification de la politique DBus à utiliser com.ubuntu.Upstart0_6.jobnamecomme send_interfaceproduit le même message d'erreur qu'auparavant. Si j'ai raison de penser que la sortie d'erreur contient les informations sur le signal, il semble que l'interface ou la destination ne reflète pas le service Upstart auquel le signal fait référence. Je pense que les informations de service ne sont que des arguments dans le message d'appel de la méthode D-Bus, et je ne suis pas sûr de pouvoir modifier la politique D-Bus pour que Upstart prenne des décisions en fonction des valeurs des arguments.
Angle O'Saxon
Un script du type que vous proposez fonctionne assez bien pour moi, avec une mise en garde: j'ai dû l'exécuter en tant que sudo jobname.sh start, de sorte que Upstart voit la demande comme venant de l'utilisateur. rootJe fais un effort pour essayer de le faire c'est la "bonne" façon (donc l'abandon des scripts Sys-V en premier lieu), donc j'aimerais que cela fonctionne via une politique D-Bus ou une autre option de configuration Upstart, mais si je ne peux pas pour que ça marche, j'accepte cette réponse.
Angle O'Saxon
1
Je citerais également "$1". Avec votre [ "$1" = "start" -o "$1" = "stop" ]test, je crois que l' $1expansion sûre mais non citée dans un script exécuté en tant que root est juste une habitude malsaine (à moins que le fractionnement de mots ne soit délibérément souhaité) ...
Beni Cherniavsky-Paskin
0

Comme indiqué ci-dessus, le démon dbus possède un fichier de configuration qui le spécialise pour une application particulière.

ls /etc/dbus-1/system.d/
avahi-dbus.conf
bluetooth.conf
...
Upstart.conf
wpa_supplicant.con

Le fichier de configuration établit également des limites de ressources, des paramètres de sécurité, etc.

Pour plus de détails, voir dbus-daemon-1 (1) - Page de manuel Linux

Pour permettre à un groupe de démarrer / arrêter des travaux Upstart, ajoutez la stratégie suivante à /etc/dbus-1/system.d/Upstart.conf

  <policy group="YourGroupName">
    <allow send_destination="com.ubuntu.Upstart"
       send_interface="com.ubuntu.Upstart0_6.Job"
       send_type="method_call" send_member="Start" />
    <allow send_destination="com.ubuntu.Upstart"
       send_interface="com.ubuntu.Upstart0_6.Job"
       send_type="method_call" send_member="Stop" />
  </policy>

Vous devez tenir compte des implications de sécurité d'une telle stratégie avant de modifier la stratégie par défaut. Les membres de YourGroupName pourront démarrer / arrêter toutes les tâches Upstart.

Goran Miskovic
la source
Mais existe-t-il un moyen de limiter les emplois qu'ils peuvent contrôler? Ou n'est-ce pas possible parce que D-Bus ne fait pas attention au contenu des messages?
Angle O'Saxon
J'ai essayé d'ajouter cette stratégie à Upstart.conf (en remplaçant le nom de groupe par mon nom de groupe réel), j'ai redémarré D-Bus et j'ai réussi start: You do not have permission to modify job: jobnamequand j'ai essayé de démarrer le service.
Angle O'Saxon
D'ACCORD. Cela signifie que la stratégie est appliquée avec succès. Il semble que yourjob.conf se trouve dans / etc / init. Les tâches utilisateur doivent être dans ~ / .init. Est-il plausible dans votre cas d'utilisation de placer yourjob.conf dans ~ / .init?
Goran Miskovic
En ce qui concerne votre première question: la politique définit les interfaces et les membres accessibles. Il définit quel contenu / arguments peuvent être envoyés / transmis. La politique restrictive actuelle a été assouplie en amont. Voir ne peut pas se lancer pour exécuter le travail utilisateur
Goran Miskovic