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

453
Torsten Bronger

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

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

Для чего это стоит, SYS_RAWIO+ SYS_ADMINбыло недостаточно.

0

2 ответа на вопрос

0
Austin Hemmelgarn

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

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

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

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

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

Похожие вопросы