我在 Kubernetes 容器中设置了 Home Assistant。它需要对主机(即运行容器的计算机)上的 /dev/ttyACM0 设备具有写访问权限。如果我让容器在 Docker 中具有“特权”,它就可以正常工作。Kubernetes 不提供对 Docker 引擎的直接访问权限,但 Kubernetes 也可以提供“特权”。
问题是,授予容器特权是不得已的手段。Kubernetes 还允许设置 Linux 功能。现在我想知道是否可以仅使用(一组)Linux 功能授予对 /dev/ttyACM0 的写访问权限?
不管怎样,SYS_RAWIO
“+”SYS_ADMIN
还不够。
答案1
FOWNER
应该可以。除非您的软件在发出 ioctl 来配置链接时遇到问题(在这种情况下您可能需要SYS_ADMIN
或TTY_CONFIG
),否则问题仅仅是文件权限问题。
FOWNER
这就是说,非常危险的能力。任何具有这种能力的东西都可以绕过全部文件系统权限检查。
作为替代方案,如果您可以让此容器在其自己的用户下运行,请考虑以下操作之一:
- 将该用户添加到拥有 的任何组
/dev/ttyACM0
。通常,此组的名称类似于tty
、serial
或console
,但也可能改为usb
或hotplug
。这是最简单的选择,但它只比使用功能稍微安全一点,因为此组通常拥有所有串行设备的设备节点的所有权,并且可能还拥有所有虚拟终端设备节点。 - 编写一个 udev 规则来匹配相关设备,并向其添加 ACL,以允许容器正在运行的用户访问它。这是最安全的方法,因为这意味着容器只能访问该特定设备节点。如果您有多个 USB ACM 设备,请确保匹配各种硬件 ID 的组合,因为 USB 设备枚举顺序不稳定,并且通常因启动而异。
答案2
甚至添加全部可用的功能没有帮助。仍然需要特权容器。请参阅https://github.com/kubernetes/kubernetes/issues/60748用于跟踪此缺陷的 Kubernetes 问题。