Какие возможности 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-устройств нестабилен и обычно меняется от одной загрузки к другой.
Другие вопросы по тегам