Welche Linux-Fähigkeit wird benötigt, um auf ein Gerät zu schreiben?

480
Torsten Bronger

Ich habe den Home Assistant in einem Kubernetes-Container eingerichtet. Es benötigt Schreibzugriff auf das Gerät / dev / ttyACM0 auf dem Host-Computer (dh auf den Computer, auf dem der Container ausgeführt wird). Es funktioniert, wenn ich den Container in Docker als "privilegiert" spreche. Kubernetes gibt keinen direkten Zugriff auf die Docker-Engine, aber "privilegiert" ist auch mit Kubernetes möglich.

Das Problem ist, dass das Erstellen eines Privilegien eines Containers ein Maß für den letzten Ausweg ist. Mit Kubernetes können Sie auch Linux-Funktionen einstellen. Jetzt frage ich mich, ob es möglich ist, Schreibzugriff auf / dev / ttyACM0 mit nur (einer Reihe von) Linux-Fähigkeiten zu gewähren?

Für was es wert ist, war SYS_RAWIO+ SYS_ADMINnicht genug.

0

2 Antworten auf die Frage

0
Austin Hemmelgarn

FOWNERSollte es tun. Wenn Ihre Software keine Probleme mit der Ausgabe von ioctls zur Konfiguration des Links hat (in diesem Fall benötigen Sie wahrscheinlich SYS_ADMINoder TTY_CONFIG), liegt das Problem ausschließlich bei den Dateiberechtigungen.

Das FOWNERist eine sehr gefährliche Fähigkeit, herauszugeben. Alles, was diese Fähigkeit hat, kann ALLE Dateisystem-Berechtigungsprüfungen umgehen .

Als Alternative können Sie eine der folgenden Möglichkeiten in Betracht ziehen, wenn Sie diesen Container unter einem eigenen Benutzer ausführen können:

  • Fügen Sie diesen Benutzer der Gruppe hinzu, zu der er gehört /dev/ttyACM0. Normalerweise wird diese Gruppe so etwas wie genannt werden tty, serialoder console, wenn es stattdessen sein könnte usboder hotplug. Dies ist die einfachste Option, aber es ist nur ein wenig sicherer als die Verwendung von Funktionen, da diese Gruppe normalerweise Eigentümer der Geräteknoten für alle seriellen Geräte ist und möglicherweise auch alle virtuellen Endgeräteknoten besitzt.
  • Schreiben Sie eine udev-Regel, die dem betreffenden Gerät entspricht, und fügen Sie eine ACL hinzu, damit der Benutzer, auf den der Container ausgeführt wird, Zugriff darauf hat. Dies ist die sicherste verfügbare Methode, da der Container nur auf diesen bestimmten Geräteknoten zugreifen kann. Wenn Sie mehr als ein USB-ACM-Gerät besitzen, stellen Sie sicher, dass die Kombination der verschiedenen Hardware-IDs übereinstimmt, da die Reihenfolge der USB-Geräteaufzählung nicht stabil ist und normalerweise von Boot zu Boot unterschiedlich ist.
0
Torsten Bronger

Auch das Hinzufügen aller verfügbaren Funktionen hilft nicht. Ein privilegierter Container wird noch benötigt. Unter https://github.com/kubernetes/kubernetes/issues/60748 finden Sie ein Kubernetes-Problem, das diesen Mangel aufdeckt.