2014-04-18 12 views
5

tôi đang cố gắng để tạo ra một dịch vụ daemon chạy trên hệ thống xe buýt, nơi các điều khoản cho việc gửi và nhận từ dịch vụ này cần được hoàn toàn mở cửa cho bất cứ ai. (Bảo mật không phải là mối quan ngại đối với dịch vụ này). Khi tôi cố gắng để đăng ký dịch vụ sử dụng QtDbus (sử dụng PyQt cho nó) tôi nhận được lỗi này: "Kết nối ': 1.0' không được phép sở hữu dịch vụ 'org.dbus.arduino' do chính sách bảo mật trong file cấu hình" . Ngăn tràn ngăn xếp khác này có cùng lỗi, nhưng không giúp gì cả trong trường hợp này vì một số lý do. dbus_bus_request_name(): Connections are not allowed to own the service.Hệ thống dbus không cho phép đấm ra quyền sở hữu với các file conf

Thông thường bạn đang nghĩ để tệp system.conf trong sự khéo léo và thêm quyền của bạn "đấm ra" tập tin cấu hình trong thư mục system.d. Tôi đã làm điều này, nhưng nó dường như không thay đổi bất cứ điều gì, bất kể làm thế nào mở tôi thực hiện các điều khoản. Trong thực tế, tôi gần như tích cực của nó không thay đổi bất cứ điều gì! Đây là tập tin conf của tôi khi nó ngồi ngay lúc này.

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

Thậm chí nếu tôi làm điều này hoặc những thứ như nó, nó vẫn không hoạt động.

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

tôi thậm chí đặt tên tập tin bắt đầu với az để nó có thể là một trong rất cuối cùng được đọc trong. Dưới đây là file system.conf, lưu ý nơi tôi đã nhận xét ra "cho phép riêng ". Đây là cách duy nhất để có được điều này để làm việc (và tồi tệ nhất có thể "sửa chữa").

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

Tôi hoàn toàn phải sử dụng xe buýt hệ thống bởi vì tôi đang triển khai nó trên một pi mâm xôi mà không có một giao diện đồ họa, (không x11, và không có xe buýt phiên). Tôi đã có thể nhận được pi mâm xôi làm việc chỉ bằng cách hoàn toàn cho phép tất cả mọi thứ trên xe buýt hệ thống (an ninh không phải là gần như là lớn của một thỏa thuận trên thiết bị này). Rõ ràng, không có cách nào tôi cho phép điều đó xảy ra trên máy phát triển của tôi. Là nền tôi đang sử dụng Opensuse 12.2 và mâm xôi pi là Debian Squeeze. Tôi không thể sở hữu dịch vụ với tài khoản người dùng của tôi, cũng không phải root, trừ khi tôi hoàn toàn mở quyền truy cập, trong trường hợp đó nó hoạt động tốt. Tôi cũng sẽ lưu ý rằng khi tôi hoàn toàn mở dbus hệ thống, tôi vẫn phải sử dụng root để gửi tin nhắn tới daemon (một lệnh chấm dứt). Tôi muốn các giải pháp để có thể được runnable thông qua một người dùng cụ thể với root có quyền truy cập là tốt. Tôi cũng ok với giải pháp chỉ cho phép cùng một người dùng và gốc để gửi tin nhắn cho nó.

Nhờ sự giúp đỡ tôi chắc chắn rằng nó là một vấn đề nhỏ!

+0

Có tệp conf Arduino nào mà bạn có thể thay đổi không? – JB0x2D1

+0

Hai tệp conf đầu tiên tôi đăng là tệp conf nằm trong system.d. Nó được gọi là "org.dbus.arduino". Không có vấn đề gì tôi đưa vào tập tin này, (hoặc thậm chí nếu tôi sao chép và dán và đặt vào bất kỳ tập tin conf khác) nó không thay đổi quyền sở hữu dịch vụ. – Mike

+1

Bạn đã thử đặt các câu lệnh ' ...' vào 'system.conf' như một phương tiện vừa ý giữa việc từ chối tất cả và cho phép tất cả? Tôi không chắc chắn về cú pháp ở đây, hoặc nếu nó thậm chí sẽ cho phép bạn làm điều đó ... chỉ cần cố gắng giúp đỡ. – JB0x2D1

Trả lời

5

cuối cùng tôi đã tìm thấy vấn đề này. Khi Dbus tìm kiếm các tập tin cấu hình cho các quyền đột xuất (như quyền sở hữu), tập tin này không chỉ nằm trong system.d/mà nó cũng phải kết thúc bằng .conf.

tập tin cấu hình của tôi "org.dbus.arduino" nên đã "org.dbus.arduino.conf". Tôi đã xóa mã khỏi system.conf. Xác nhận tôi không còn quyền, tạo tệp cấu hình tại "system.d/org.dbus.arduino.conf", tôi đã được cấp quyền. Sau đó tôi đã cố đổi tên tệp thành "org.dbus.arduino" và xác nhận quyền đã bị từ chối.

+0

Tôi chạy vào một vấn đề tương tự. Suy nghĩ bằng cách sử dụng xe buýt phiên như: Sử dụng dbus-launch để khởi động một phiên bus và lưu env trả về vào một tập tin nổi tiếng. Trong máy chủ và máy khách dbus, tệp env để có thể kết nối với bus phiên. Bạn có thấy bất kỳ hạn chế nào không? – minghua

Các vấn đề liên quan