2016-12-12 2 views
0

J'utilise mosquitto version 1.4.10 avec tls-certificate. J'utilise ce plugin https://github.com/mbachry/mosquitto_pyauth pour autoriser un utilisateur.Et cela fonctionne bien pour mosquitto_pub (comme dans, quand quelqu'un essaie de publier, il est d'abord autorisé par le module).mosquitto - désactiver l'abonnement sans autorisation

Cependant, il semble que mosquitto_sub puisse s'abonner à n'importe quoi sans autorisation. Comment forcer la sécurité lorsque quelqu'un tente d'accéder à un sujet en mode lecture seule? J'ai parcouru le fichier mosquitto.conf et je n'arrive pas à trouver quelque chose en rapport avec cela.

par exemple, je suis en mesure de souscrire à ceci:

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

et en mesure de voir les messages provenant de certains éditeur comme ceci:

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 

Ce que je suis en train de faire est de prévenir mosquitto_sub lire tous les messages au niveau racine sans autorisation.

le code python qui fait l'autorisation ressemble à ceci: (données auth sont stockées dans cassandra db)

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 

fonction acl_check semble être toujours appelé quand mosquitto_pub essaie de se connecter, mais jamais appelé quand mosquitto_sub Connects . le code C derrière ce module python est ici: https://github.com/mbachry/mosquitto_pyauth/blob/master/auth_plugin_pyauth.c

+0

Je suppose que vous voulez dire '' mosquitto_sub' pas mosquitto_pub' au deuxième alinéa – hardillb

+0

mes bad..yes, je voulais dire mosquitto_sub –

+0

Vous pouvez inclure le code python ainsi que nous pouvons voir comment vous avez mis en place l'ACL – hardillb

Répondre

0

ajouter ce qui suit à votre mosquitto.conf

... 
allow_anonymous false 
... 

Cela empêchera les utilisateurs sans informations d'identification de se connecter au courtier.

Vous pouvez également ajouter une règle acl pour l'utilisateur anonymous s'il existe certains sujets que vous souhaiteriez voir afficher par des clients non authentifiés.

+0

Bonjour, l'utilisateur n'est pas anonyme. il est un utilisateur authentifié. mais il ne devrait pas être autorisé à souscrire à tout ce qui n'est pas autorisé. J'ai mis à jour la question avec les commandes sub et pub. –

+0

aussi: j'ai déjà ajouté allow_annonymous pour être faux. –