EMQ4.4版本配置redis插件启动成功,redis acl规则并没有执行

环境信息

  • EMQX 版本:4.4.8
  • 操作系统及版本:centos7
  • 其他

问题描述

在4.1.0上配置redis插件可以成功使用acl功能,升级到4.4版本后acl功能没有起作用,4.4.8版本配置如下

配置文件及日志

##--------------------------------------------------------------------
## Redis Auth/ACL Plugin
##--------------------------------------------------------------------
## Redis Server cluster type
## single    Single redis server
## sentinel  Redis cluster through sentinel
## cluster   Redis through cluster
auth.redis.type = sentinel

## Redis server address.
##
## Value: Port | IP:Port
##
## Single Redis Server: 127.0.0.1:6379, localhost:6379
## Redis Sentinel: 127.0.0.1:26379,127.0.0.2:26379,127.0.0.3:26379
## Redis Cluster: 127.0.0.1:6379,127.0.0.2:6379,127.0.0.3:6379
auth.redis.server = 10.187.4.139:26380,10.187.4.139:26379,10.187.4.139:26381

## Redis sentinel cluster name.
##
## Value: String
 auth.redis.sentinel = mymaster

## Redis pool size.
##
## Value: Number
auth.redis.pool = 8

## Redis database no.
##
## Value: Number
auth.redis.database = 1

## Redis password.
##
## Value: String
 auth.redis.password = ruomima123

## Redis query timeout
##
## Value: Duration
## auth.redis.query_timeout = 5s

## Authentication query command.
##
## Value: Redis cmd
##
## Variables:
##  - %u: username
##  - %c: clientid
##  - %C: common name of client TLS cert
##  - %d: subject of client TLS cert
##
## Examples:
##  - HGET mqtt_user:%u password
##  - HMGET mqtt_user:%u password
##  - HMGET mqtt_user:%u password salt
auth.redis.auth_cmd = HMGET mqtt_user:%u password

## Password hash.
##
## Value: plain | md5 | sha | sha256 | bcrypt
auth.redis.password_hash = plain

## sha256 with salt prefix
## auth.redis.password_hash = salt,sha256

## sha256 with salt suffix
## auth.redis.password_hash = sha256,salt

## bcrypt with salt prefix
## auth.redis.password_hash = salt,bcrypt

## pbkdf2 with macfun iterations dklen
## macfun: md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512
## auth.redis.password_hash = pbkdf2,sha256,1000,20

## Superuser query command.
##
## Value: Redis cmd
##
## Variables:
##  - %u: username
##  - %c: clientid
##  - %C: common name of client TLS cert
##  - %d: subject of client TLS cert
auth.redis.super_cmd = HGET mqtt_user:%u is_superuser

## ACL query command.
##
## Value: Redis cmd
##
## Variables:
##  - %u: username
##  - %c: clientid
auth.redis.acl_cmd = HGETALL mqtt_acl:%c

## Redis ssl configuration.
##
## Value: on | off
#auth.redis.ssl = off

## CA certificate.
##
## Value: File
#auth.redis.ssl.cacertfile = path/to/your/cafile.pem

## Client ssl certificate.
##
## Value: File
#auth.redis.ssl.certfile = path/to/your/certfile

## Client ssl keyfile.
##
## Value: File
#auth.redis.ssl.keyfile = path/to/your/keyfile

## In mode verify_none the default behavior is to allow all x509-path
## validation errors.
##
## Value: true | false
#auth.redis.ssl.verify = false

## If not specified, the server's names returned in server's certificate is validated against
## what's provided `auth.redis.server` config's host part.
## Setting to 'disable' will make EMQX ignore unmatched server names.
## If set with a host name, the server's names returned in server's certificate is validated
## against this value.
##
## Value: String | disable
## auth.redis.ssl.server_name_indication = disable

你好,EMQX 有打印相关的错误日志吗?

没有看到报错日志


redis中的规则
image

如果你需要拒绝未在 Redis 中明确允许的操作,那么还需要修改一下 emqx.conf 中的 acl_nomatch 配置项,这个配置项用来指定未找到匹配的 ACL 规则时的操作,默认为允许。


这个配置修改了

还是没变化
同时我看了之前4.1.0的配置这项也是默认的

some/topic/sub/1没有跟redis中的规则test/#匹配上,应该是明确的吧

修改 acl_nomatch 这个配置后需要重启 EMQX 服务,你看下是不是因为这个所以改动没生效。

重启了两次了还是不行

不好意思,估计你是因为最后命中了内置的 ACL 规则,你可以看下这个文档:

把最后一行的 {allow, all} 注释掉然后重启一下服务就可以了。


这个不对吧,先去redis,redis里面已经拒绝了,应该不会走到这内置的acl里面啊

Redis 里面的是白名单,没有显式拒绝就会继续检查 ACL

麻烦看下这个帖子,这个是4.1的版本redis中的权限事test/gtja,去订阅的时候订阅不了别的topic。
https://askemq.com/t/topic/431



这个是4.1的acl.conf的配置
image

我用4.1版本的emq连通一个redis表现不一样


这里是明显拒绝的

我本地尝试了一下并没有出现和你一样的问题,按理 some/topic/sub/1 这个主题确实应该被禁止订阅的。

你试一下下面这个操作:

# 进入远程控制台
./bin/emqx remote_console

# 运行以下命令
dbg:tracer().
dbg:p(all, c).
dbg:tracer(emqx_auth_redis_cli, q, cx).

然后重复一下你的订阅操作,再看一下最新的日志。

完成以后回到前面的远程控制台,再运行一下 dbg:stop(). 然后 Ctrl+C 退出即可。

好的 我试一下


有报错,但是我看redis插件启动是正常的
image


关了重启,日志看redis插件都是正常的

啊sorry是我打错了…

dbg:tracer().
dbg:p(all, c).
dbg:tpl(emqx_auth_redis_cli, q, cx).

看结果从redis里面查出来是空的

抱歉,我应该找到原因了 sentinel 的database没对上,redis sentinel 集群的那一条是我手动加的,手动加的应该默认成databsae 0了,我将配置的也改成0就可以拒绝了,非常感谢
image