NEWS
IoBroker User, file ownership und permissions
-
Hallo zusammen,
eine Frage, die ich mir bei allen Installationsanleitungen und allen ioBroker Installationen, die mir bisher untergekommen sind gefragt habe ist: warum werden Zugriffsrechte immer nach dem Maximalprinzip verteilt? Ich versteh den Vorteil, denn so ist die Fehleranfälligkeit etwas geringer. Die Nachteile liegen allerdings auch auf der Hand. Wir wollen alle nicht, dass Unberechtigte Zugriff auf unseren ioBroker bekommen. Wir wollen außerdem nicht, dass die zum Teil doch recht wertvollen Passwörter und Zugangsdaten, die auf dem ioBroker-System liegen "verloren" gehen.
Daher die Fragen: Warum laufen die ioBroker-Prozesse als root? Warum und wofür sind die Permissives 777 für /opt/iobroker notwendig? Meines Erachtens hätte man da schon einen erheblichen Sicherheitsgewinn, wenn ioBroker als non-root User ausgeführt würde und das /opt/iobroker nicht world writable wäre. Denn wer greift denn auf diesen Ordner zu? Eigentlich nur die Prozesse von ioBroker, die alle entweder als root oder eben als der konfigurierte ioBroker-User ausgeführt werden. Für 777 sehe ich daher keine Notwendigkeit, lasse mich aber gern aufklären.
Um nicht nur zu kritisieren habe ich heute eine Installation auf Basis von CentOS 7 umgesetzt mit der ioBroker nicht mehr als root läuft. /opt/iobroker hat von mir 770 bekommen, damit läuft alles. 750 sollte auch gehen, aber in der ioBroker-Group ist ohnehin kein weiterer User. Ich habe außerdem Capabilites für Node hinzugefügt, damit die Netzwerkzugriffe und Zugriffe auf Systemressourcen funktionieren. Könnte man möglicherweise noch weiter einschränken, das war heute nur ein erster Versuch. Auch die zu installierenden Pakete können sicher noch ausgedünnt werden.
Einige Fallstricke gibts auch noch. Nach einem ioBroker update && ioBroker upgrade bekommt /opt/iobroker wieder 777. Da muss man also jedes Mal nacharbeiten oder ein eigenes Skript nutzen. Außerdem wäre ein systemd-Service schöner, die Installation bringt aber ein init-script mit, daher hab ich es erstmal dabei belassen.
Hier die Bash History meiner Installation. Daraus sollte sich auch relativ leicht eine Installation automatisieren lassen (für andere Linux-Distris als RHEL/CentOS und ggf. Fedora natürlich so nicht einsetzbar).
# Before Installation add user (other than root) for access via ssh, deploy public keys and disable password login, # disable root login and use formerly created user to su to root for this installation # Execute the following using root: yes | yum update curl --silent --location https://rpm.nodesource.com/setup_8.x | bash - yum -y install nodejs yum -y install gcc gcc-c++ make yum -y groupinstall "Development Tools" yum -y install python yum -y install avahi yum -y install arpwatch yum -y install avahi-devel yum -y install avahi-tools yum -y install avahi-compat-* yum -y install libusb* yum -y install mariadb-server sudo setcap "cap_net_admin,cap_net_raw,cap_sys_rawio,cap_sys_resource+eip" /usr/bin/node adduser iobroker usermod -aG dialout iobroker mkdir /opt/iobroker chown iobroker:iobroker /opt/iobroker chmod -R 755 /opt/iobroker cd /opt/iobroker sudo -u iobroker npm install iobroker sudo -u iobroker npm install serialport ln -s /opt/iobroker/node_modules/iobroker/install/iobroker /usr/bin/iobroker cp /opt/iobroker/node_modules/iobroker/install/linux/iobroker.sh /etc/init.d/ sed -i '/IOBROKERUSER=*/c\IOBROKERUSER=iobroker' /etc/init.d/iobroker.sh firewall-cmd --permanent --zone=public --add-port=8081/tcp # Add more ports, if necessary! This is only to make the web interface available. firewall-cmd --reload chown -R iobroker:iobroker /opt/iobroker sudo -u iobroker iobroker update sudo -u iobroker iobroker upgrade # After every update /opt/iobroker is chmodded 777\. Therefore we have to correct it this time and every time we run the upgrader chown -R iobroker:iobroker /opt/iobroker sudo -u iobroker chmod -r 770 /opt/iobroker sudo -u iobroker iobroker start
Anschließend liefert ein ps folgendes und es werden keine iobroker Prozesse mehr als root ausgeführt:
iobroker 71177 0.2 2.8 1233972 53140 ? Ssl 18:06 0:18 iobroker.js-controller iobroker 71187 0.1 2.8 1095868 52396 ? Sl 18:06 0:15 io.admin.0 iobroker 71197 0.0 1.6 986472 30556 ? Sl 18:06 0:02 io.discovery.0 iobroker 71207 0.0 1.8 998552 34252 ? Sl 18:06 0:02 io.web.0 iobroker 71701 0.0 1.6 987036 30928 ? Sl 19:08 0:01 io.ping.0 iobroker 71711 0.1 2.2 1006560 42084 ? Sl 19:08 0:05 io.javascript.0 iobroker 71721 0.0 2.0 1000188 39104 ? Sl 19:08 0:02 io.cloud.0 iobroker 71907 0.0 1.9 1012512 36372 ? Sl 19:14 0:02 io.yahka.0
-
Hallo und Willkommen im Forum,
Als lernwilliger Linux-noob bin ich gerne bereit das zu testen.
Hast du Adapter laufen, die auf den Serialport (GPIOs oder USB) zugreifen.
Hier kam es am häufigsten zu Problemen.
Gruß
Rainer
-
Guter Hinweis, vielen Dank!
Habe ich soeben getestet, da gibts tatsächlich Fehler vom cul Adapter:
Cannot open port: Error: Error: Permission denied, cannot open /dev/ttyS0
Die mir momentan am einfachsten erscheinende Lösung ist wohl, iobroker der Gruppe dialout hinzuzufügen, ich passe da oben mal an.
Damit scheint es zu funktionieren:
maxcul.0 2017-07-12 21:06:37.940 info serialPort /dev/ttyS0 is open! maxcul.0 2017-07-12 21:06:37.932 info using serial device /dev/ttyS0@38400 maxcul.0 2017-07-12 21:06:37.808 info starting. Version 0.3.0 in /opt/iobroker/node_modules/iobroker.maxcul, node: v8.1.4
Hast Du noch einen Tipp für einen Adapter, den ich speziell für USB testen könnte?
-
Hast Du noch einen Tipp für einen Adapter, den ich speziell für USB testen könnte? `
zwave kann mit speziellen USB-Sticks kommunizieren. Aber glaube, das ist für Linux kein Unterschied zu nem normalen Serialport. -
Gibt es hierzu schon etwas Neues?
Irgendwie habe ich kein gutes Gefühl alles per root auszuführen und zu installieren. Ist zumindest sehr ungewohnt.
Läuft die Variante mit eigenem Benutzer und eigener Gruppe (wie oben beschrieben) mittlerweile problemlos?
-
Es funktioniert so wie beschrieben. Aber ich habe nicht jeden erdenklichen Adapter getestet. Für mich reicht es, da mag aber noch das ein oder andere zu debuggen sein.