限制特定用户组访问 SocketCAN

限制特定用户组访问 SocketCAN

我有一台 PC,机器人通过 CAN(使用 SocketCAN)连接到该 PC。我想控制谁可以向机器人发送命令,最好是通过一个组(即只有“use_robot”组中的用户有权通过 CAN 发送/接收任何内容)。

我怎样才能实现这个目标?据我了解,SocketCAN 使用网络接口,因此,可能以某种方式与 iptables 一起使用?

答案1

我想控制谁可以向机器人发送命令,最好是通过一组......

我今天花了一点时间看这个。我可以阻止群组成员发送使用 nftables 规则集传输至 CAN 接口的流量如下:

table netdev canfilter {
        chain can1egress {
                type filter hook egress device can1 priority filter; policy accept;
                skgid 1000 counter drop;
        }
}

counter上面的规则集中的内容不是必需的;它只是将数据包计数添加到 的输出中nft list ruleset。)

这会阻止组 1000 的成员通过接口发送can1。如果我尝试cangen can1以 gid 1000 的用户身份运行,我会看到:

$ sudo -u testuser cangen can1
write: No buffer space available

然而,如果我与不在该组中的用户执行相同的操作,则它可以正常工作(并且我可以使用candump另一个链接接收流量)。

我认为这可以实现你的目标。


我认为不可能限制接待通过uid;查看使用类似以下内容生成的日志:

table netdev canfilter {
        chain can0ingress {
                type filter hook ingress device can0 priority filter; policy accept;
                log group 0;
        }
}

看起来在接收端我们无法访问 uid/gid 元数据(这是有道理的,因为数据包可能来自本地系统以外的地方)。


为了测试这一点,我使用了cangencandump实用程序can-utils项目,以及ulogd用于日志记录,因为我对 CAN 接口使用隔离的命名空间(因此常规内核日志记录不是一个选项)。


我简化了测试并将所有内容放在网上这里

相关内容