Какие возможности Linux необходимы для записи на устройство?
Я установил Home Assistant в контейнере Kubernetes. Требуется доступ на запись к устройству /dev/ttyACM0 на главном компьютере (то есть на компьютере, на котором работает контейнер). Это работает, если я сделаю контейнер "привилегированным" в Docker. Kubernetes не дает прямого доступа к движку Docker, но "привилегированный" возможен и с Kubernetes.
Проблема в том, что создание привилегированного контейнера является крайней мерой. Kubernetes также позволяет устанавливать возможности Linux. Теперь мне интересно, можно ли предоставить доступ на запись в /dev/ttyACM0 только с помощью (набора) возможностей Linux?
Для чего это стоит, SYS_RAWIO
+ SYS_ADMIN
было недостаточно.
2 ответа
Даже добавление всех доступных возможностей не помогает. Привилегированный контейнер все еще необходим. См. https://github.com/kubernetes/kubernetes/issues/60748 для решения проблемы Kubernetes, которая отслеживает этот недостаток.
FOWNER
должен сделать это. Если ваше программное обеспечение не имеет проблем с выдачей ioctls для настройки ссылки (в этом случае вам, вероятно, понадобится либо SYS_ADMIN
или же TTY_CONFIG
), проблема заключается только в разрешении файлов.
Это сказало, FOWNER
это ОЧЕНЬ опасная способность выдавать. Все, что имеет такую возможность, может обойти ВСЕ проверки разрешений файловой системы.
В качестве альтернативы рассмотрите одно из следующих, если вы можете запустить этот контейнер под своим собственным пользователем:
- Добавить этого пользователя в группу
/dev/ttyACM0
, Обычно эта группа будет называться что-то вродеtty
,serial
, или жеconsole
хотя вместо этого это может бытьusb
или жеhotplug
, Это самый простой вариант, но он лишь немного безопаснее, чем использование возможностей, поскольку эта группа обычно владеет узлами устройств для всех последовательных устройств и может дополнительно владеть всеми узлами виртуальных терминальных устройств. - Напишите правило udev, соответствующее соответствующему устройству, и добавьте к нему ACL, чтобы позволить пользователю, к которому работает контейнер, обращаться к нему. Это наиболее безопасный доступный метод, поскольку он означает, что контейнер может получить доступ только к этому конкретному узлу устройства. Если у вас несколько устройств USB ACM, убедитесь, что они совпадают по комбинации различных идентификаторов оборудования, поскольку порядок перечисления USB-устройств нестабилен и обычно меняется от одной загрузки к другой.