루트가 아닌 사용자로 시스템 모드에서 dbus-monitor 실행

루트가 아닌 사용자로 시스템 모드에서 dbus-monitor 실행

루트가 아닌 사용자로 시스템 버스에서 D-Bus 호출을 모니터링할 수 있습니까? 시스템에서 원시 D-Bus 호출을 캡처하는 서비스를 만들고 싶지만 보안상의 이유로 루트 권한 없이 사용자 정의 서비스를 실행하는 것을 선호합니다. 서비스는 원치 않는 메시지를 필터링하고 중요한 콘텐츠 값을 정리한 후 나머지 메시지에 대한 로그 파일을 생성합니다. 목표는 전송된 모든 구성 및 읽기 선택 명령이 D-Bus 인터페이스를 제공하는 사용자 정의 서비스에 의해 실제로 올바르게 기록되는지 확인할 수 있도록 특정 서비스의 로그를 보완하는 로그 스트림을 생성하는 것입니다.

"dbusmonitor" 그룹의 사용자에게 "BecomeMonitor" 기능을 제공하기 위해 system-local.conf를 만들었습니다. 그 결과 그룹에 속하지 않은 사용자와는 약간 다른 오류 메시지가 표시되었지만 원하는 동작이 발생하지 않았습니다.

콘텐츠/etc/dbus-1/system-local.conf:

<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy group="dbusmonitor">
    <allow send_destination="org.freedesktop.DBus"
           send_interface="org.freedesktop.DBus.Monitoring"
           send_member="BecomeMonitor"
           send_type="method_call"/>
  </policy>
</busconfig>

NetworkManager 대상의 dbus-monitor에 대한 일반 사용자 출력입니다. dbus 호출이 이루어지면 출력에 아무 것도 나타나지 않습니다.

[test@localhost ~]$ groups
test

[test@localhost ~]$ dbus-monitor --system "destination='org.freedesktop.NetworkManager'"

dbus-monitor: unable to enable new-style monitoring: org.freedesktop.DBus.Error.AccessDenied: "Rejected send message, 1 matched rules; type="method_call", sender=":1.461" (uid=1002 pid=6471 comm="dbus-monitor --system destination='org.freedesktop" label="unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023") interface="org.freedesktop.DBus.Monitoring" member="BecomeMonitor" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)". Falling back to eavesdropping.

signal time=1661974390.087332 sender=org.freedesktop.DBus -> destination=:1.461 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.461"

다음은 권한 있는 그룹의 구성원인 사용자에 대한 동일한 dbus-monitor 명령의 출력입니다. 오류 메시지는 약간 다릅니다. 마찬가지로 dbus 호출도 잡히지 않습니다.

[admin@localhost ~]$ groups
admin wheel dbusmonitor

[admin@localhost ~]$ dbus-monitor --system "destination='org.freedesktop.NetworkManager'"

dbus-monitor: unable to enable new-style monitoring: org.freedesktop.DBus.Error.AccessDenied: "rejected attempt to call BecomeMonitor by connection :1.528 (uid=1000 pid=9157 comm="dbus-monitor --system destination='org.freedesktop" label="unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023") with uid 1000". Falling back to eavesdropping.

signal time=1661978040.536692 sender=org.freedesktop.DBus -> destination=:1.528 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.528"

다음은 루트 사용자에 대한 동일한 dbus-monitor 명령의 출력입니다. "org.freedesktop.NetworkManager.state"에 대한 dbus 호출이 성공적으로 캡처되었으며 이는 원하는 동작입니다.

[root@localhost ~]#  dbus-monitor --system "destination='org.freedesktop.NetworkManager'"

signal time=1661979771.623836 sender=org.freedesktop.DBus -> destination=:1.546 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.546"
signal time=1661979771.623861 sender=org.freedesktop.DBus -> destination=:1.546 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
   string ":1.546"

method call time=1661979774.507096 sender=:1.547 -> destination=org.freedesktop.NetworkManager serial=2 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.DBus.Introspectable; member=Introspect
method call time=1661979774.508390 sender=:1.547 -> destination=org.freedesktop.NetworkManager serial=3 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=state

중요한 경우 RHEL8에서 테스트하고 있습니다. SELinux를 허용 모드로 전환해도 이 문제에는 아무런 영향이 없습니다.

system-local.conf 파일의 "dbusmonitor" 그룹에 추가 권한을 할당해야 합니까? 아니면 이 능력이 다른 곳에서는 이차적으로 제한됩니까?

관련 정보