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
Je suppose que vous voulez dire '' mosquitto_sub' pas mosquitto_pub' au deuxième alinéa – hardillb
mes bad..yes, je voulais dire mosquitto_sub –
Vous pouvez inclure le code python ainsi que nous pouvons voir comment vous avez mis en place l'ACL – hardillb