udev 规则授予用户对网络接口 can0 的完全访问权限

udev 规则授予用户对网络接口 can0 的完全访问权限

我试图授予用户在网络设备上执行与 root 相同的操作的权限can0,例如启动或关闭网络设备。我的第一个想法是将设备的组和/或所有者设置为我的用户和我所属的组。

以下是udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)设置 udev 规则之前显示的内容:

$ udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)
  looking at device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0/net/can0':
    KERNEL=="can0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{netdev_group}=="0"
...
  looking at parent device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0':
    KERNELS=="spi0.0"
    SUBSYSTEMS=="spi"
    DRIVERS=="mcp251x"

这是我尝试过的规则(在/etc/udev/rules.d/50-can.rules):

KERNELS=="spi0.0", SUBSYSTEMS=="spi", DRIVERS=="mcp251x", GROUP="can", OWNER="<myuser>"

报告udevadm test $(udevadm info -q path -p /sys/class/net/can0)所有者和组应该正确设置:

...
OWNER 1001 /etc/udev/rules.d/50-can.rules:7
GROUP 1003 /etc/udev/rules.d/50-can.rules:7
...

然而,在重新加载规则(udevadm control -R)并重新启动后,我仍然无法can0以用户身份启动或关闭:

$ ip link set can0 down
RTNETLINK answers: Operation not permitted

我知道这条规则匹配正确,因为我可以通过设置属性来更改接口的名称NAME

can0我怀疑问题可能与我在 下找不到接口有关/dev,这可能表明它没有字符/块设备,并且程序(例如ip)不会通过传统的 UNIX 所有权访问该设备/权限。如果这是正确的,我如何使用 udev 来完成此操作(即授予我的用户完全权限can0)?

注意:我看到类似的问题,例如如何授予普通用户对网络接口的写访问权限?,但他们的解决方案是使用 sudo。我宁愿只使用 udev 来完成此操作,但我会将其用作最后的手段。

答案1

根据 @AB 的线索,我最终使用libpam( pam_cap.so) 在登录(和 ssh)期间将功能添加CAP_NET_ADMIN到我的用户inheritable集,然后将相同的功能添加到/bin/ip和集。我现在可以作为用户打开或关闭网络接口,而无需依赖.inheritablepermittedsudo

这里解释了执行此操作的方法:https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capability-per-user

相关内容