
Ich habe Home Assistant in einem Kubernetes-Container eingerichtet. Es benötigt Schreibzugriff auf das Gerät /dev/ttyACM0 auf dem Hostcomputer (also dem Computer, auf dem der Container läuft). Es funktioniert, wenn ich den Container in Docker-Sprache „privilegiert“ mache. Kubernetes bietet keinen direkten Zugriff auf die Docker-Engine, aber „privilegiert“ ist auch mit Kubernetes möglich.
Das Problem ist, dass die Privilegierung eines Containers nur als letztes Mittel infrage kommt. Kubernetes ermöglicht auch die Festlegung von Linux-Fähigkeiten. Nun frage ich mich, ob es möglich ist, Schreibzugriff auf /dev/ttyACM0 nur mit (einer Reihe von) Linux-Fähigkeiten zu gewähren?
Allerdings war SYS_RAWIO
+ SYS_ADMIN
nicht genug.
Antwort1
FOWNER
sollte es tun. Sofern Ihre Software keine Probleme mit der Ausgabe von ioctls zum Konfigurieren des Links hat (in diesem Fall benötigen Sie wahrscheinlich entweder SYS_ADMIN
oder TTY_CONFIG
), handelt es sich ausschließlich um ein Problem mit den Dateiberechtigungen.
Das heißt, FOWNER
ist einSEHRgefährliche Fähigkeit, nachzugeben. Alles mit dieser Fähigkeit kann umgehenALLEÜberprüfung der Dateisystemberechtigungen.
Ziehen Sie alternativ eine der folgenden Möglichkeiten in Betracht, wenn Sie diesen Container unter seinem eigenen Benutzer zum Laufen bringen können:
- Fügen Sie diesen Benutzer der Gruppe hinzu, die besitzt . Normalerweise wird diese Gruppe etwa wie , , oder
/dev/ttyACM0
genannt , es könnte aber auch oder heißen . Das ist die einfachste Option, aber nur ein wenig sicherer als die Verwendung von Fähigkeiten, weil diese Gruppe normalerweise Eigentümer der Geräteknoten für alle seriellen Geräte ist und zusätzlich auch Eigentümer aller virtuellen Terminalgeräteknoten sein kann.tty
serial
console
usb
hotplug
- Schreiben Sie eine Udev-Regel, die dem betreffenden Gerät entspricht, und fügen Sie ihr eine ACL hinzu, die dem Benutzer, unter dem der Container ausgeführt wird, den Zugriff darauf ermöglicht. Dies ist die sicherste verfügbare Methode, da der Container nur auf diesen bestimmten Geräteknoten zugreifen kann. Wenn Sie über mehr als ein USB-ACM-Gerät verfügen, achten Sie darauf, dass die Kombination der verschiedenen Hardware-IDs übereinstimmt, da die Reihenfolge der USB-Geräteaufzählung nicht stabil ist und normalerweise von einem Start zum nächsten variiert.
Antwort2
Sogar das Hinzufügenalleverfügbare Funktionen helfen nicht. Ein privilegierter Container wird weiterhin benötigt. Siehehttps://github.com/kubernetes/kubernetes/issues/60748für ein Kubernetes-Problem, das diesen Mangel verfolgt.