2014-04-18 33 views
5

Próbuję utworzyć usługę demona, która działa na magistrali systemowej, gdzie uprawnienia do wysyłania i odbierania z tej usługi powinny być całkowicie otwarte dla wszystkich. (Bezpieczeństwo nie dotyczy tej usługi). Kiedy próbuję zarejestrować usługę przy użyciu QtDbus (używając do tego PyQt) pojawia się ten błąd: "Połączenie": 1.0 "nie może być właścicielem usługi" org.dbus.arduino "z powodu zasad bezpieczeństwa w pliku konfiguracyjnym" . Ten inny przepełnienie stosu ma ten sam błąd, ale z jakiegoś powodu nie pomaga w tej sytuacji. dbus_bus_request_name(): Connections are not allowed to own the service.System dbus nie pozwala na wybijanie własności plików conf

Normalnie powinieneś opuścić plik system.conf i dodać plik konfiguracyjny "wykreśl" w katalogu system.d. Zrobiłem to, ale wydaje się, że nic nie zmienia, niezależnie od tego, jak bardzo udostępniam uprawnienia. Właściwie to jestem prawie pewien, że nic nie zmienia! Oto mój plik conf, który znajduje się w tej chwili.

<!DOCTYPE busconfig PUBLIC 
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" 
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> 

<busconfig> 
    <policy user="myUser"> 
     <allow own="*"/> 
     <allow own="org.dbus.arduino"/> 
     <allow send_type="method_call" log="true"/> 
    </policy>     
    <policy user="root">   
     <allow own="*"/> 
     <allow own="org.dbus.arduino"/> 
     <allow send_type="method_call" log="true"/> 
    </policy>       
    <policy context="default">    
    </policy>              
</busconfig>     

Nawet jeśli zrobię to lub coś w tym stylu, to NAPRAWDĘ nie działa.

<busconfig>    
    <policy context="default">  
     <allow own="*"/> 
     <allow own="org.dbus.arduino"/> 
     <allow send_type="method_call" log="true"/>  
    </policy>              
</busconfig> 

I nawet umieścić nazwę pliku zaczynając az tak, że może to być bardzo ostatni który jest odczytywany w. Tutaj jest plik system.conf, trzeba pamiętać, gdzie mam wykomentowane „Zezwalaj własna ". Jest to jedyny sposób, aby to zadziałało (i najgorsze z możliwych "napraw").

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN" 
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> 
<busconfig> 

    <!-- Our well-known bus type, do not change this --> 
    <type>system</type> 

    <!-- Run as special user --> 
    <user>messagebus</user> 

    <!-- Fork into daemon mode --> 
    <fork/> 

    <!-- We use system service launching using a helper --> 
    <standard_system_servicedirs/> 

    <!-- This is a setuid helper that is used to launch system services --> 
    <servicehelper>/lib/dbus-1/dbus-daemon-launch-helper</servicehelper> 

    <!-- Write a pid file --> 
    <pidfile>/var/run/dbus/pid</pidfile> 

    <!-- Enable logging to syslog --> 
    <syslog/> 

    <!-- Only allow socket-credentials-based authentication --> 
    <auth>EXTERNAL</auth> 

    <!-- Only listen on a local socket. (abstract=/path/to/socket 
     means use abstract namespace, don't really create filesystem 
     file; only Linux supports this. Use path=/whatever on other 
     systems.) --> 
    <listen>unix:path=/var/run/dbus/system_bus_socket</listen> 

    <policy context="default"> 
    <!-- All users can connect to system bus --> 
    <allow user="*"/> 

    <!-- Holes must be punched in service configuration files for 
     name ownership and sending method calls --> 
    <deny own="*"/> 
    <deny send_type="method_call" log="true"/> 

    <!-- THIS IS THE ONLY WAY TO GET THIS TO WORK 
    <allow own="*"/> 
    <allow send_type="method_call" log="true"/> 
    --> 



    <!-- Signals and reply messages (method returns, errors) are allowed 
     by default --> 
    <allow send_type="signal"/> 
    <allow send_requested_reply="true" send_type="method_return"/> 
    <allow send_requested_reply="true" send_type="error"/> 

    <!-- All messages may be received by default --> 
    <allow receive_type="method_call"/> 
    <allow receive_type="method_return"/> 
    <allow receive_type="error"/> 
    <allow receive_type="signal"/> 

    <!-- Allow anyone to talk to the message bus --> 
    <allow send_destination="org.freedesktop.DBus"/> 
    <!-- But disallow some specific bus services --> 
    <deny send_destination="org.freedesktop.DBus" 
      send_interface="org.freedesktop.DBus" 
      send_member="UpdateActivationEnvironment"/> 

    </policy> 

    <!-- Config files are placed here that among other things, punch 
     holes in the above policy for specific services. --> 
    <includedir>system.d</includedir> 

    <!-- This is included last so local configuration can override what's 
     in this standard file --> 
    <include ignore_missing="yes">system-local.conf</include> 

    <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include> 

</busconfig> 

absolutnie trzeba korzystać z magistrali systemowej, bo jestem wdrażania go na pi malinowym bez GUI (nie x11, a nie autobus sesja). Byłem w stanie sprawić, że raspberry pi działało tylko przez całkowite zezwolenie na wszystko na magistrali systemowej (bezpieczeństwo nie jest tak duże jak na to urządzenie). Oczywiście, nie ma możliwości, że pozwolę, aby to nastąpiło na mojej maszynie programistycznej. Jako tło używam Opensuse 12.2, a raspberry pi to Debian Squeeze. Nie mogę być właścicielem usługi z moim kontem użytkownika, ani root, chyba że całkowicie otworzę uprawnienia, w takim przypadku działa dobrze. Zauważy również, że kiedy całkowicie otworzyłem dbus systemowy, nadal musiałem używać roota do wysyłania wiadomości do demona (polecenie zakończenia). Chciałbym, aby to rozwiązanie było możliwe do uruchomienia przez konkretnego użytkownika z dostępem do roota również. Jestem też w porządku z rozwiązaniem, które pozwala tylko temu samemu użytkownikowi i rootowi na wysyłanie do niego wiadomości.

Dzięki za pomoc jestem pewien, że to mały problem!

+0

Czy istnieje plik conf arduino, który można zmienić? – JB0x2D1

+0

Pierwsze dwa pliki conf, które wysłałem, to plik conf, który znajduje się w system.d. Nazywa się "org.dbus.arduino". Bez względu na to, co umieściłem w tym pliku (lub nawet jeśli skopiuję i wkleję i umieściłem w dowolnym innym pliku conf), nie zmieni to uprawnień do posiadania usługi. – Mike

+1

Czy próbowałeś wstawić ' ...' w pliku 'system.conf' jako szczęśliwe medium pomiędzy deny all a allow all? Nie jestem pewien składni tutaj, lub jeśli nawet pozwoli ci to zrobić ... po prostu staram się pomóc. – JB0x2D1

Odpowiedz

5

W końcu znalazłem problem. Kiedy Dbus szuka plików konfiguracyjnych do wykreślania uprawnień (takich jak właściciele), plik nie musi tylko znajdować się w katalogu system.d /, ale musi również kończyć się .conf.

Mój plik konfiguracyjny "org.dbus.arduino" powinien być "org.dbus.arduino.conf". Usunąłem kod z system.conf. Potwierdzono, że nie mam już uprawnień, utworzyłem plik konfiguracyjny w "system.d/org.dbus.arduino.conf", przyznano mi uprawnienia. Następnie spróbowałem zmienić nazwę pliku na "org.dbus.arduino" i potwierdziłem, że uprawnienia zostały odrzucone.

+0

Wpadłem na podobny problem. Myślenie przy użyciu szyny sesji jak: Użyj polecenia dbus-launch, aby uruchomić magistralę sesji i zapisać zwrócone środowisko env w dobrze znanym pliku. W dbus server i client pobierz plik env, aby móc połączyć się z szyną sesji. Czy widzisz tam jakąkolwiek wadę? – minghua