Script wird nicht ausgeführt

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
udo1toni
Beiträge: 14001
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Script wird nicht ausgeführt

Beitrag von udo1toni »

Du kannst nicht einfach so sudo verwenden :) Du musst dafür sorgen, dass der User openhab den Befehl ohne Eingabe eines Passworts mit sudo ausführen darf.

Das geht grundsätzlich über die Datei /etc/sudoers, aber Obacht! Du solltest diese Datei keinesfalls einfach so bearbeiten, denn wenn Du die Datei korrumpierst (und das geht schon mit einem Komma an der falschen Stelle) hast Du Dich in dem Moment ausgesperrt, wo die Datei gespeichert wurde, denn anschließend funktioniert der sudo Zugriff auch nicht mehr für den User openhabian oder pi (oder jeden anderen User, der eigentlich sudo benutzen dürfte...). Du solltest die Datei ausschließlich über den Befehl visudo editieren. (natürlich mit sudo visudo ;) )

Suche die Zeile

Code: Alles auswählen

root    ALL=(ALL:ALL) ALL
und füge darunter eine weitere Zeile ein:

Code: Alles auswählen

openhab ALL=(asterisk) NOPASSWD: bin/cp callwest.call /var/spool/asterisk/outgoing
wobei Du eventuell noch /bin/ in Deinem Script ergänzen musst. Die Zeile bewirkt, dass der User openhab mit dem Befehl sudo als User asterisk das Kommando /bin/cp ausführen darf, und zwar mit den angegebenen Parametern.
cp ist ein Werkzeug, mit dem Du das gesamte System grundsätzlich zerstören kannst, weshalb es sinnvoll ist, die Verwendung soweit wie möglich einzuschränken.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Script wird nicht ausgeführt

Beitrag von kaloschke »

Das klingt ja schon mal SEHR gut.
Allerdings bekomme ich für Deine Zeile "openhab ..." (mit copy&paste eingefügt) von visudo einen Syntaxfehler :-(
Ich habe nur "sudo visudo" eingeben. Muss ich da anders vorgehen?
Und habe ich es richtig verstanden, dass mein Script dann nicht mehr unter /etc/openhab/scripts liegen darf, sondern unter /bin liegen muss?
Das wäre nicht so schön, da ich den Ordner /etc/asterisk häufig sichere. Klar kann ich das extra Script dann extra sichern, ist aber nicht so schön.

Benutzeravatar
udo1toni
Beiträge: 14001
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Script wird nicht ausgeführt

Beitrag von udo1toni »

kaloschke hat geschrieben: 21. Apr 2021 11:04 Allerdings bekomme ich für Deine Zeile "openhab ..." (mit copy&paste eingefügt) von visudo einen Syntaxfehler :-(
Hm. Da muss ich mal drüber brüten... ich sehe den Fehler nicht... Du kannst aber mal diese Version ausprobieren:

Code: Alles auswählen

openhab ALL=(ALL:ALL) NOPASSWD: bin/cp
Wenn diese Zeile durch geht, kannst Du sie erweitern.
kaloschke hat geschrieben: 21. Apr 2021 11:04 Ich habe nur "sudo visudo" eingeben. Muss ich da anders vorgehen?
Nein, das ist der korrekte Aufruf.
kaloschke hat geschrieben: 21. Apr 2021 11:04 Und habe ich es richtig verstanden, dass mein Script dann nicht mehr unter /etc/openhab/scripts liegen darf, sondern unter /bin liegen muss?
Nein, Du musst lediglich im Script in der Zeile mit dem sudo das "cp" gegen "/bin/cp" ersetzen, da nur exakt dieser Aufruf für den User openhab erlaubt ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Script wird nicht ausgeführt

Beitrag von kaloschke »

Danke für die schnelle Rückmeldung, aber Dein neuer Vorschlag liefert auch einen Syntaxerror :-(

Benutzeravatar
udo1toni
Beiträge: 14001
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Script wird nicht ausgeführt

Beitrag von udo1toni »

Also, ich habe es gerade noch mal bei mir ausprobiert, die Zeile ist korrekt.

EDIT: Ähh... Da fehlte der führende Slash vor bin... so sollte es passen:
Vermutlich muss auch der Pfad zu callwest-call absolut angegeben werden.

Code: Alles auswählen

openhab ALL=(asterisk) NOPASSWD: /bin/cp callwest.call /var/spool/asterisk/outgoing
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Script wird nicht ausgeführt

Beitrag von kaloschke »

Die gute Nachricht: Es wird von visudo akzeptiert, es gibt also keinen Syntaxerror mehr :-)
Die schlechte:
Das 'Script mit

Code: Alles auswählen

/bin/cp /etc/openhab/scripts/asterisk/callwest.call /var/spool/asterisk/outgoing
funktioniert nicht.

Wenn ich

Code: Alles auswählen

sudo -u openhab /bin/cp /etc/openhab/scripts/asterisk/callwest.call /var/spool/asterisk/outgoing
auf der Kommandozeile eingebe, kommt

Code: Alles auswählen

 /bin/cp: failed to access '/var/spool/asterisk/outgoing': Permission denied
Zur Sicherheit mal ausprobiert:

Code: Alles auswählen

sudo -u asterisk /bin/cp /etc/openhab/scripts/asterisk/callwest.call /var/spool/asterisk/outgoing
Funktioniert!

Wenn ich das richtig verstanden habe, sollte es mit dieser Zeile in soduers auf alle Fälle funktionieren:

Code: Alles auswählen

openhab ALL=(root) NOPASSWD: /bin/cp /etc/openhab/scripts/asterisk/callwest.call /var/spool/asterisk/outgoing
Klappt aber auch nicht>: --- permission ---

Benutzeravatar
udo1toni
Beiträge: 14001
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Script wird nicht ausgeführt

Beitrag von udo1toni »

Du musst den kompletten Weg betrachten, dann wird klar, was wo passiert.

1. in openHAB wird eine Aktion ausgelöst. Diese mündet darin, dass ein Item gesetzt wird.
2. Durch das Setzen des Items wird das Exec Binding getriggert.
3. Das Exec Binding führt einen beliebigen Befehl aus, als User openhab.
3.1. Allerdings nur unter der Bedingung, dass der gesamte Befehl exakt wie im Thing hinterlegt auch in der exec.whitelist eingetragen ist.
3.2. Man könnte an dieser Stelle einfach ein Bash Script aufrufen, welches dann weitere Befehle ausführen kann.
4. Wenn ein Befehl unter einem anderen User als openhab laufen soll, muss ein sudo -u <user> vorangestellt werden, wobei <user> durch den Namen des Users ersetzt wird, in dessen Kontext der Befehl laufen soll.
5. sudo darf nur von Usern verwendet werden, die dazu berechtigt sind.
5.1. sudo verlangt nach der Eingabe eines Passworts.
Aus 5. und 5.1. folgt, dass man zunächst eine entsprechende Konfiguration vornehmen muss, damit a) openhab den Befehl sudo verwenden darf und b) sudo kein Passwort verlangt.
6. Wenn man einfach dem User openhab erlaubt, sudo ohne Passwort zu nutzen, so reißt das ein riesiges Loch in das Sicherheitssystem. Entsprechend muss das gerissene Loch möglichst klein gestaltet werden. Das bedeutet, a) wird vorgegeben, dass sudo nur für einen bestimmten Kontext verwendet werden darf (asterisk) und b) nur ein ganz bestimmter Befehl ausgeführt werden darf. Dieser Befehl muss zwingend mit dem absoluten Pfad angegeben werden, also /bin/cp
c) kann der Befehl noch weiter abgesichert werden, indem auch noch die erlaubten Parameter angegeben werden (in diesem Fall die beiden Pfade <Quelle> und <Ziel>)

Jegliche Konfiguration die vorgenommen wird, dient immer nur dazu, eine Erlaubnis zu erteilen, sie ersetzt keinerlei Aufruf. Wenn Du also den Befehl cp unter dem Kontext asterisk ausführen lassen willst, musst Du dennoch sudo -u asterisk /bin/cp schreiben, es muss auch hier der absolute Pfad angegeben werden, denn dieser ist in /etc/sudoers hinterlegt. Hintergrund: Man könnte im aktuellen Verzeichnis sonst ein Programm unter dem Namen cp speichern und einfach diesen ausführen lassen (wie wäre es z.B., einen Symlink auf fdisk zu erzeugen, dann kann man gleich das gesamte Dateisystem vernichten, ohne umständlich alle möglichen Dateien zu überschreiben.)
Auch die Quell- und Zielpfade müssen mutmaßlich absolut angegeben werden, sowohl in der /etc/sudoers als auch in dem Bash Script, aus welchem der Befehl aufgerufen wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Script wird nicht ausgeführt

Beitrag von kaloschke »

Hm. Dank Dir. Ich glaube, ich habe das auch verstanden. Das mit dem Root diente nur als Test.
Die absoluten Pfade habe ich ja überall eingetragen, bei sudoers und in meinem Script.
Denn nach wie vor ist es doch so, dass es nicht funktioniert. Aber warum nicht?

Benutzeravatar
udo1toni
Beiträge: 14001
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Script wird nicht ausgeführt

Beitrag von udo1toni »

Keine Ahnung. Zeig doch noch mal alle Stellen, wo Du was konfiguriert hast (also Thing, exec.whitelist, script und /etc/sudoers)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Script wird nicht ausgeführt

Beitrag von kaloschke »

Wie ich oben geschrieben habe, ist Openhab m.M. nach gar nicht das Problem. Ich habe es so verstanden, dass durch in Angaben in sudoers der Benutzer openhab vom Startordner in den Zielordner kopieren darf. Dann müsste auf der Kommandozeile

Code: Alles auswählen

sudo -u openhab /bin/cp /etc/openhab/scripts/asterisk/callwest.call /var/spool/asterisk/outgoing
doch funktionieren oder nicht?
Denn dies klappt ja schon nicht.
Oder ich habe es doch nicht verstanden :-(

Antworten