如何使用Redis作为mosquitto ACL的后端(使用JPmens插件)?

时间:2015-04-06 15:56:16

标签: authentication redis acl mqtt mosquitto

我正在研究Mosquitto并计划使用Redis作为后端来处理用户名/密码对身份验证和ACL。我正在使用JPmens' authentication plugin来执行此操作。身份验证效果很好,但我无法使ACL工作。 Redis使用唯一密钥,用户名/密码对中使用用户名(我的情况下的密钥)进行身份验证。我试图在集/列表中混合用户名,密码和主题,但它们都不起作用。

mosquitto conf:

auth_plugin /etc/mosquitto/auth-plug.so
auth_opt_backends redis
auth_opt_redis_host 127.0.0.1
auth_opt_redis_port 6379
auth_opt_redis_userquery GET %s
auth_opt_redis_aclquery GET %s-%s

以下名称/密码对正常运行身份验证

  

SET user1 PBKDF2 $ sha256 $ 901 $ Qh18ysY4wstXoHhk $ g8d2aDzbz3rYztvJiO3dsV698jzECxSg

     

SET user2 PBKDF2 $ sha256 $ 901 $ R74X2ae3MufMS20M $ CAbXZFDmXJN7Cc28Dm / Z97OfM8Tz1JHn   ...

以下设置不适用于ACL :( a / b ...作为主题)

  

sadd user22 PBKDF2 $ sha256 $ 901 $ Qh18ysY4wstXoHhk $ g8d2aDzbz3rYztvJiO3dsV698jzECxSg a / b c / d

     

rpush user33 PBKDF2 $ sha256 $ 901 $ q5 / N74O6Iaf / e8Cg $ dEA3tZSi / sJeXKAkX39Gd3agy2WY96gE e / f

这样做的正确方法是什么? 在Redis API中,aclrequery显示:

Single stepping until exit from function be_redis_aclcheck, which has no line number information.

redisCommand (c=0x6537d0, format=0x6561c0 "GET user1-t/c") at hiredis.c:1345
1345    void *redisCommand(redisContext *c, const char *format, ...) {
(gdb) bt
0  redisCommand (c=0x6537d0, format=0x6561c0 "GET my-t/c") at hiredis.c:1345
1  0x00007ffff5e61376 in be_redis_aclcheck () from /etc/mosquitto/auth-plug.so
2  0x00007ffff5e5c351 in mosquitto_auth_acl_check ()

来自/etc/mosquitto/auth-plug.so

此处,user1是用户名,t/c是主题。 GET user1-t/c似乎告诉我Redis数据库中应该有一个字符串类型。谁能给我一个如何让它工作的例子?

由于

2 个答案:

答案 0 :(得分:1)

我已经弄明白它是如何运作的。如果MQTT代理仅允许客户端user1发布和子“a / b”和“c / d”主题,则Redmens中JPmens插件的正确ACL数据将为:

user1-a / b 2

user1-c / d 2

“user1-a / c”是键,2是值。

答案 1 :(得分:1)

如果Redis出于任何原因导致整个系统也崩溃,那么这不是首选。

这将是您架构中的SPF(单点故障)。