Какая возможность Linux необходима для записи на устройство?

Какая возможность Linux необходима для записи на устройство?

Я настроил Home Assistant в контейнере Kubernetes. Ему нужен доступ на запись к устройству /dev/ttyACM0 на хост-компьютере (т. е. компьютеру, на котором запущен контейнер). Он работает, если я сделаю контейнер «привилегированным» в Docker. Kubernetes не предоставляет прямого доступа к движку Docker, но «привилегированный» доступ возможен и с Kubernetes.

Проблема в том, что создание привилегированного контейнера — это крайняя мера. Kubernetes также позволяет устанавливать возможности Linux. Теперь мне интересно, можно ли предоставить доступ на запись к /dev/ttyACM0 с помощью всего лишь (набора) возможностей Linux?

Как бы там ни было, SYS_RAWIO+ SYS_ADMINбыло недостаточно.

решение1

FOWNERдолжно сделать это. Если только у вашего программного обеспечения нет проблем с выдачей ioctl для настройки ссылки (в этом случае вам, вероятно, понадобится либо , SYS_ADMINлибо TTY_CONFIG), проблема заключается исключительно в разрешениях на файлы.

Тем не менее, FOWNERэтоОЧЕНЬопасная способность выдавать. Все, что обладает такой способностью, может обойтиВСЕпроверка прав доступа к файловой системе.

В качестве альтернативы рассмотрите один из следующих вариантов, если вы можете запустить этот контейнер под своим собственным пользователем:

  • Добавьте этого пользователя в любую группу, которой принадлежит /dev/ttyACM0. Обычно эта группа будет называться как-то вроде tty, serial, или console, хотя вместо этого она может быть usbили hotplug. Это самый простой вариант, но он лишь немного безопаснее, чем использование возможностей, поскольку эта группа обычно владеет узлами устройств для всех последовательных устройств и может дополнительно владеть всеми узлами виртуальных терминальных устройств.
  • Напишите правило udev для сопоставления с рассматриваемым устройством и добавьте в него ACL, чтобы разрешить пользователю, под которым запущен контейнер, доступ к нему. Это самый безопасный из доступных методов, поскольку он означает, что контейнер может получить доступ только к этому конкретному узлу устройства. Если у вас более одного USB-устройства ACM, убедитесь, что вы сопоставляете комбинацию различных идентификаторов оборудования, поскольку порядок перечисления USB-устройств нестабилен и обычно меняется от одной загрузки к другой.

решение2

Даже добавиввсеимеющиеся возможности не помогают. Все еще нужен привилегированный контейнер. Смотретьhttps://github.com/kubernetes/kubernetes/issues/60748для проблемы Kubernetes, которая отслеживает этот недостаток.

Связанный контент