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 )
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
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.
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:
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
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
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?
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