특정 사용자 그룹으로 SocketCAN에 대한 액세스를 제한합니다.

특정 사용자 그룹으로 SocketCAN에 대한 액세스를 제한합니다.

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 can1gid 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 메타데이터에 액세스할 수 없는 것 같습니다(패킷이 로컬 시스템이 아닌 다른 곳에서 왔을 수 있으므로 이는 의미가 있습니다).


cangen이것을 테스트하기 위해 and candump유틸리티를 사용했습니다.can-utils프로젝트 및ulogdCAN 인터페이스에 대해 격리된 네임스페이스를 사용하고 있기 때문에 로깅을 위해 사용합니다(따라서 일반 커널 로깅은 옵션이 아닙니다).


테스트를 단순화하고 모든 것을 온라인에 올렸습니다.여기.

관련 정보