
Я настроил 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, которая отслеживает этот недостаток.