2016-12-12 2 views
0

Я использую mosquitto версии 1.4.10 с tls-сертификатом. Я использую этот плагин https://github.com/mbachry/mosquitto_pyauth, чтобы авторизовать пользователя. И он хорошо работает для mosquitto_pub (как в случае, когда кто-то пытается опубликовать его, он сначала авторизуется модулем).mosquitto - отключить подписку без авторизации

Однако, похоже, что mosquitto_sub может подписаться на что угодно без авторизации. Как заставить защиту, когда кто-то просто пытается получить доступ к теме в режиме только для чтения?

Я просмотрел файл mosquitto.conf и не могу найти ничего, что связано с этим.

, например, я могу подписаться, как это:

mosquitto_sub --cafile /etc/mosquitto/ca.crt --cert /etc/mosquitto/client.crt --key /etc/mosquitto/client.key -h ubuntu -p 1883 -t c/# -d 

и возможность видеть сообщения, поступающие из какого-то издательства, как это:

mosquitto_pub --cafile /etc/mosquitto/ca.crt --cert /etc/mosquitto/client.crt --key /etc/mosquitto/client.key -h ubuntu -p 1883 -t c/2/b/3/p/3/rt/13/r/123 -m 32 -q 1 

То, что я пытаюсь сделать, это предотвратить mosquitto_sub чтение всех сообщений на корневом уровне без разрешения.

питон код, который делает авторизацию выглядит следующим образом: (данные аутентификации хранятся в Кассандре дб)

import sys 
import mosquitto_auth 

from cassandra.cluster import Cluster 
from cassandra import ConsistencyLevel 


## program entry point from mosquitto... 
def plugin_init(opts): 
    global cluster, session, select_device_query 
    conf = dict(opts) 
    cluster = Cluster(['192.168.56.102']) 
    session = cluster.connect('hub') 
    select_device_query = session.prepare('SELECT * from devices where uid=?') 
    select_device_query.consistency_level = ConsistencyLevel.QUORUM 
    print 'Cassandra cluster initialized' 


def acl_check(clientid, username, topic, access): 

    device_data = session.execute(select_device_query, [username]) 

    if device_data.current_rows.__len__() > 0: 
     device_data = device_data[0] 
     # sample device data looks like this : 
     # Row(uid=u'08:00:27:aa:8f:91', brand=3, company=2, device=15617, property=3, room=490, room_number=u'3511', room_type=13, stamp=datetime.datetime(2016, 12, 12, 6, 29, 54, 723000)) 
     subscribable_topic = 'c/' + str(device_data.company) \ 
          + '/b/' + str(device_data.brand) \ 
          + '/p/' + str(device_data.property) \ 
          + '/rt/' + str(device_data.room_type) \ 
          + '/r/' + str(device_data.room) \ 
          + '/#' 

     matches = mosquitto_auth.topic_matches_sub(subscribable_topic, topic) 
     print 'ACL: user=%s topic=%s, matches = %s' % (username, topic, matches) 
     return matches 

    return False 

функция acl_check, кажется, всегда вызывается, когда mosquitto_pub пытается подключиться, но никогда не вызывается, когда mosquitto_sub соединяется , С код позади этого питона модуля здесь: https://github.com/mbachry/mosquitto_pyauth/blob/master/auth_plugin_pyauth.c

+0

Я предполагаю, что вы имеете в виду '' mosquitto_sub' не mosquitto_pub' во втором абзаце – hardillb

+0

мои bad..yes, я имел в виду mosquitto_sub –

+0

Вы можете захотеть включить код питона, а поэтому мы можем видеть, как вы реализовали ACL – hardillb

ответ

0

добавить следующие строки в mosquitto.conf

... 
allow_anonymous false 
... 

Это остановит пользователей без верительных от входа к брокеру.

Вы также можете добавить правило acl для пользователя anonymous, если есть определенные темы, которые вы хотите, чтобы клиенты, не прошедшие проверку подлинности, могли их видеть.

+0

Привет, пользователь не анонимный. он является аутентифицированным пользователем. но он не должен иметь право подписываться на все, что ему не разрешено. Я обновил вопрос с помощью команд sub и pub. –

+0

также: я уже добавил allow_annonymous как false. –

Смежные вопросы