Ermöglichen Sie Nicht-Sudo-Gruppen, den Upstart-Job zu steuern

11

Ich versuche, einen Upstart-Job einzurichten, der beim Systemstart ausgeführt wird. Dieser Job kann auch von Mitgliedern einer anderen Gruppe als gestartet / gestoppt werden sudo. In einer früheren Version habe ich update-rc.dSkripte verwendet und darin gespeichert /etc/init.d/, um dies durch Hinzufügen %Group ALL = NOPASSWD: /etc/init.d/scriptnamezu meiner sudoers-Datei zum Laufen zu bringen, aber ich kann anscheinend kein Äquivalent für Upstart finden.

Ich habe versucht %Group ALL = NOPASSWD: /sbin/initctl start jobname, der sudoers-Datei etwas hinzuzufügen, aber der Versuch, den Befehl auszuführen, start jobnameführt zu folgendem Fehler:

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

Soweit ich das beurteilen kann, handelt es sich um eine Beschwerde darüber, dass mein Benutzerkonto nicht in der Lage ist, Startnachrichten in der D-Bus-Konfigurationsdatei für Upstart zu senden. Ich konnte keine Informationen zum Bearbeiten dieser Datei finden, um einer Gruppe die Berechtigung zum Zugriff auf einen bestimmten Dienst zu erteilen. Gibt es eine solche Option? Gibt es eine Möglichkeit, die Sudoers-Datei zu bearbeiten, damit ich den Job ausführen kann, ohne die Konfigurationsdatei zu bearbeiten? Bleib ich besser bei der vorherigen Version?

Winkel O'Saxon
quelle

Antworten:

7

Sie können zunächst herausfinden, wo die für Upstart spezifische D-Bus-Konfiguration aufbewahrt wird. Sehen Sie diesen destination="com.ubuntu.Upstart"Ausschnitt aus der Fehlermeldung? Versuchen Sie nun, es im Ordner mit den D-Bus-Konfigurationsdateien zu durchsuchen:

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

Diese Upstart.confDatei enthält einige Beispiele für Richtlinien. Ich denke, Sie könnten versuchen, das Format einer Richtlinie aus ihnen herauszufinden. Versuchen Sie dann, Ihrem bestimmten Benutzer nur die Aktionen zuzulassen, die er benötigt. Zum Beispiel wie in:

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

Dies sollte es dem pope_benedictBenutzer ermöglichen, diesen Job zu starten.

Beachten Sie, dass die Werte für die Richtlinienattribute "Zulassen" in Ihrer ursprünglichen Fehlermeldung aufgeführt sind.

Iuliu Pascaru
quelle
1
Oh, und vergessen Sie nicht, D-Bus danach neu zu starten! :)
Iuliu Pascaru
Ich fand das ein bisschen verwirrend, aber das half: blog.arkency.com/2014/07/…
Mike Campbell
7

Ich persönlich verwende die folgende Zeile in der Datei /etc/sudoers.d/jobname_myuser:

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

wie hier beschrieben: /server//a/390723/68608

Szymon Jeż
quelle
2

Eine solche Option gibt es in sudo nicht.

Der Unterschied zwischen Sysv-Skripten und Upstart-Konfigurationsdateien besteht darin, dass: Sysv-Skripte Skripte sind, eigenständige ausführbare Dateien, und Sie können sudo anweisen, dass eine Gruppe sie ausführen darf. Auf der anderen Seite sind Upstart-Konfigurationsdateien lediglich Konfigurationsdateien, keine ausführbaren Dateien. Die Ausführung von start(Symlink zu initctl) ist also das, was sudo zulässt. Ihr Problem hierbei ist, dass Sie es den Leuten initctlerlauben, initctlalles zuzulassen, damit Sie alles zulassen .

Die Lösung ist jedoch einfach, wenn Sie sich nur um einen einzigen Job kümmern. Machen Sie ein Skript, sagen wir /usr/bin/jobname.shmit

#!/bin/sh
initctl $1 jobname

chmod 755 /usr/bin/jobname.shFügen Sie dann und schließlich diese ausführbare Datei zu Ihrer Sudoers-Datei hinzu:

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

Auf diese Weise kann jeder diesen bestimmten Job anrufen jobname.sh startoder jobname.sh stopsteuern. Vielleicht möchten Sie einige Kontrollen hinzufügen nur zu erlauben , startund stopParameter usw.

Tuminoid
quelle
Mit anderen Worten, mein Problem ist nicht, dass das System Gruppenmitgliedern die Ausführung initctlverweigert, sondern dass Upstart alle von Benutzern / Gruppen gesendeten Signale ablehnt, denen nicht explizit ein Richtlinieneintrag "Zulassen" in Upstart.conf zugewiesen wurde. Und es gibt keine Möglichkeit, mehr Granularität bereitzustellen als eine Einstellung für alle Jobs oder keine in der Konfigurationsdatei?
Angle O'Saxon
Initctl läuft in Ihrem Fall auch ohne Änderung der Sudoer einwandfrei. Upstart lehnt die Nachrichten nur ab, wenn Sie dies nicht speziell für Nicht-Root-Benutzer zulassen. Siehe die beiden anderen Antworten. Sie können die dbus-Richtlinie auf com.ubuntu.Upstart0_6.<JOB>Jobbasis (siehe Teil) in der Upstart.conf definieren. Abhängig von Ihren Anforderungen ist es möglicherweise einfacher, diese Art von Skript dafür zu erstellen, als dbus-Richtlinien zu schreiben und dbus usw. neu zu starten. Dbus-Richtlinien sind offensichtlich die "richtige" Vorgehensweise, aber je nach Fall kann ein einfaches Skript a langer Weg mit weniger Mühe.
Tuminoid
Das Bearbeiten der DBus-Richtlinie, die com.ubuntu.Upstart0_6.jobnameals verwendet werden soll send_interface, hat dieselbe Fehlermeldung wie zuvor erzeugt. Wenn ich zu Recht vermute, dass die Fehlerausgabe die Signalinformationen enthält, sieht es so aus, als ob die Schnittstelle oder das Ziel nicht den Upstart-Dienst widerspiegeln, auf den sich das Signal bezieht. Ich denke, dass die Dienstinformationen nur Argumente in der D-Bus-Methodenaufrufnachricht sind, und ich bin nicht sicher, ob ich die D-Bus-Richtlinie für Upstart bearbeiten kann, um Entscheidungen basierend auf Argumentwerten zu treffen.
Angle O'Saxon
Ein Skript der von Ihnen vorgeschlagenen Art funktioniert für mich ziemlich gut, mit einer Einschränkung: Ich musste es als ausführen sudo jobname.sh start, damit Upstart die Anfrage als vom rootBenutzer stammend ansieht. Ich bemühe mich, dies zu versuchen Dies ist der "richtige" Weg (also in erster Linie die Abkehr von Sys-V-Skripten). Daher möchte ich, dass dies über eine D-Bus-Richtlinie oder eine andere Upstart-Konfigurationsoption funktioniert, aber wenn ich nicht kann Lass das funktionieren Ich werde diese Antwort akzeptieren.
Angle O'Saxon
1
Ich würde auch zitieren "$1". Mit Ihrem [ "$1" = "start" -o "$1" = "stop" ]Test glaube ich, dass es eine sichere, aber nicht zitierte $1Erweiterung in einem Skript ist, das als Root ausgeführt wird. Dies ist nur eine ungesunde Angewohnheit (es sei denn, die Wortaufteilung ist absichtlich erwünscht) ...
Beni Cherniavsky-Paskin
0

Wie oben erwähnt, verfügt der dbus-Daemon über eine Konfigurationsdatei, die ihn auf eine bestimmte Anwendung spezialisiert hat.

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

Die Konfigurationsdatei legt auch Ressourcenlimits, Sicherheitsparameter usw. fest.

Weitere Informationen finden Sie in der Manpage dbus-daemon-1 (1) - Linux

Fügen Sie /etc/dbus-1/system.d/Upstart.conf die folgenden Richtlinien hinzu, damit eine Gruppe Upstart-Jobs starten / stoppen kann

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

Sie sollten die Auswirkungen dieser Richtlinie auf die Sicherheit berücksichtigen, bevor Sie die Standardrichtlinie ändern. Mitglieder des YourGroupName können alle Upstart-Jobs starten / stoppen .

Goran Miskovic
quelle
Aber gibt es eine Möglichkeit, die Jobs, die sie kontrollieren können, einzuschränken? Oder ist das nicht möglich, weil D-Bus den Nachrichteninhalt nicht beachtet?
Angle O'Saxon
Ich habe versucht, diese Richtlinie zu Upstart.conf hinzuzufügen (den Gruppennamen durch meinen tatsächlichen Gruppennamen zu ersetzen), D-Bus neu gestartet und start: You do not have permission to modify job: jobnamebeim Versuch, den Dienst zu starten, eine Meldung erhalten .
Angle O'Saxon
IN ORDNUNG. Dies bedeutet, dass die Richtlinie erfolgreich angewendet wird. Es scheint, dass sich Ihre Job.conf in / etc / init befindet. Benutzerjobs sollten in ~ / .init sein. Ist es in Ihrem Anwendungsfall plausibel, Ihre Job.conf in ~ / .init zu platzieren?
Goran Miskovic
In Bezug auf Ihre erste Frage: Die Richtlinie definiert, auf welche Schnittstellen und Mitglieder zugegriffen werden kann. Es definiert, welche Inhalte / Argumente gesendet / übergeben werden können. Die derzeitige restriktive Politik wurde stromaufwärts gelockert. Siehe kann nicht gestartet werden, um Benutzerjob auszuführen
Goran Miskovic