¿Qué capacidad de Linux se necesita para escribir en un dispositivo?

¿Qué capacidad de Linux se necesita para escribir en un dispositivo?

Configuré Home Assistant en un contenedor de Kubernetes. Necesita acceso de escritura al dispositivo /dev/ttyACM0 en la computadora host (es decir, la computadora que ejecuta el contenedor). Funciona si hago que el contenedor sea "privilegiado" en Docker. Kubernetes no proporciona acceso directo al motor Docker, pero también es posible tener acceso "privilegiado" con Kubernetes.

El problema es que privilegiar un contenedor es una medida de último recurso. Kubernetes también permite configurar las capacidades de Linux. Ahora me pregunto si es posible otorgar acceso de escritura a /dev/ttyACM0 con solo (un conjunto de) capacidades de Linux.

Por lo que vale, SYS_RAWIO+ SYS_ADMINno fue suficiente.

Respuesta1

FOWNERDeberías hacerlo. A menos que su software tenga problemas para emitir ioctls para configurar el enlace (en cuyo caso probablemente necesite SYS_ADMINo TTY_CONFIG), el problema es únicamente de permisos de archivo.

Dicho esto, FOWNERes unMUYpeligrosa capacidad de ceder. Cualquier cosa con esa capacidad puede eludirTODOcomprobaciones de permisos del sistema de archivos.

Como alternativa, considere una de las siguientes opciones si puede hacer que este contenedor se ejecute con su propio usuario:

  • Agregue ese usuario a cualquier grupo que posea /dev/ttyACM0. Por lo general, este grupo se llamará algo así como tty, serialo console, aunque podría ser usbo hotplug. Esta es la opción más sencilla, pero es sólo un poco más segura que usar capacidades, porque este grupo generalmente tiene la propiedad de los nodos de dispositivo para todos los dispositivos serie y, además, puede poseer todos los nodos de dispositivos terminales virtuales.
  • Escriba una regla udev para que coincida con el dispositivo en cuestión y agréguele una ACL para permitir que el usuario que ejecuta el contenedor acceda a él. Este es el método más seguro disponible, porque significa que el contenedor solo puede acceder a ese nodo de dispositivo específico. Si tiene más de un dispositivo USB ACM, asegúrese de hacer coincidir la combinación de las distintas ID de hardware, ya que el orden de enumeración de los dispositivos USB no es estable y generalmente varía de un inicio a otro.

Respuesta2

Incluso agregandotodoLas capacidades disponibles no ayudan. Todavía se necesita un contenedor privilegiado. Verhttps://github.com/kubernetes/kubernetes/issues/60748para un problema de Kubernetes que rastrea esta deficiencia.

información relacionada