2014-04-18 30 views
5

Sto provando a creare un servizio daemon che viene eseguito sul bus di sistema in cui le autorizzazioni per l'invio e la ricezione da questo servizio dovrebbero essere completamente aperte a chiunque. (La sicurezza non è una preoccupazione per questo servizio). Quando provo a registrare il servizio utilizzando QtDbus (usando PyQt per questo) ottengo questo errore: "Connessione": 1.0 "non è autorizzato a possedere il servizio" org.dbus.arduino "a causa delle politiche di sicurezza nel file di configurazione" . Questo altro overflow dello stack ha lo stesso errore, ma per qualche motivo non aiuta affatto in questa situazione. dbus_bus_request_name(): Connections are not allowed to own the service.System dbus non consente il punch out di proprietà con i file conf

Normalmente si dovrebbe lasciare intatto il file system.conf e aggiungere le autorizzazioni "punch out" nel file di configurazione nella directory system.d. Ho fatto questo, ma non sembra cambiare nulla, indipendentemente da come apro le autorizzazioni. In effetti sono quasi sicuro che non cambi niente! Ecco il mio file conf perché si trova proprio in questo momento.

<!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>     

Anche se lo faccio o cose simili, ANCORA non funziona.

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

Ho anche messo il nome del file che inizia con az in modo che possa essere l'ultima quella che viene letta in. Ecco il file system.conf, nota dove ho commentato il "consentire proprio "sezione". Questo è l'UNICO modo per farlo funzionare (e la peggiore "correzione" possibile).

<!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> 

devo assolutamente di utilizzare il bus di sistema perché sto distribuirlo su una PI di lamponi senza interfaccia grafica, (senza X11, e nessun autobus sessione). Sono stato in grado di far funzionare il raspberry pi completamente consentendo tutto sul bus di sistema (la sicurezza non è un grosso problema su questo dispositivo). Ovviamente, non posso in alcun modo permettere che ciò accada sulla mia macchina di sviluppo. Come sfondo sto usando Opensuse 12.2 e il raspberry pi è Debian Squeeze. Non posso possedere il servizio con il mio account utente, né root, a meno che non apro completamente le autorizzazioni, in questo caso funziona perfettamente. Noterò anche che quando ho aperto completamente il sistema dbus, dovevo ancora usare root per inviare messaggi al demone (un comando terminato). Mi piacerebbe che la soluzione fosse in grado di essere eseguibile tramite un particolare utente con accesso root anche. Sto anche bene con la soluzione che consente allo stesso utente e root di inviare messaggi.

Grazie per qualsiasi aiuto sono sicuro che è un piccolo problema!

+0

C'è un file conf arduino che è possibile modificare? – JB0x2D1

+0

I primi due file conf che ho postato sono il file conf che si trova in system.d. Si chiama "org.dbus.arduino". Indipendentemente da ciò che ho inserito in questo file, (o anche se copio e incollo e inserisco altri file conf), non cambia le autorizzazioni per possedere il servizio. – Mike

+1

Hai provato a mettere le istruzioni di < ... 'in' system.conf' come un mezzo felice tra negare tutto e consentire tutto? Non sono sicuro della sintassi qui, o se ti lascerà fare ... cercando solo di aiutare. – JB0x2D1

risposta

5

Ho finalmente trovato il problema. Quando Dbus cerca i file di configurazione per le autorizzazioni di punzonatura (come i proprietari) il file non deve essere solo in system.d/ma deve anche finire in .conf.

Il mio file di configurazione "org.dbus.arduino" avrebbe dovuto essere "org.dbus.arduino.conf". Ho rimosso il codice da system.conf. Confermato di non avere più permessi, ho creato un file di configurazione su "system.d/org.dbus.arduino.conf", mi è stato concesso il permesso. Ho quindi tentato di rinominare il file solo con "org.dbus.arduino" e ho confermato che le autorizzazioni erano state negate.

+0

Mi sono imbattuto in un problema simile. Pensare usando il bus di sessione come: Usa dbus-launch per avviare un bus di sessione e salvare l'env restituito in un file ben noto. In dbus server e client source il file env per essere in grado di connettersi al bus di sessione. Vedi qualche svantaggio lì? – minghua