利用redis的acl功能,实现多项目共享redis

程序员咋不秃头 2024-05-31 00:53:18

公司的redis之前是每个项目的测试环境都是给项目单独部署一套环境。现在要降本增效,计划测试环境让多个项目共享redis,省下几台服务器的钱。

多个项目共享就有个麻烦的问题,redis6以前只有一个用户,无法做到项目隔离,很可能发生误操作其他项目key的问题。

redis6发布了acl功能,利用这个功能我们可以给每个项目配置自己的用户和权限,做到项目只能操作以自己项目id开头的key。

如常部署

使用acl的redis和以前的redis部署是一样的。

只有一点区别,就是可以配置使用外部acl文件

aclfile "/data/redis/users.aclfile"

这样后面配置了新用户后,可以执行

acl save

保存用户信息到这个文件。

也可以现在就在这个文件里配置好用户信息,这样启动redis就能加载这些用户权限。

正常部署redis-cluster,启动之后,我们看下现在的用户列表。

acl list : 查看现在的用户列表

> acl listuser default on sanitize-payload #dddf5898f49ae0cc658937a0a95b04076c0a91ccbba549f59aed37bfb373cfad ~* &* +@all

对这行结果的解释:

user default: 这定义了一个用户名为 default 的用户。on: 表示该用户是启用状态sanitize-payload: 这表示用户认证时使用了密码,密码是经过散列处理的,以 # 开头,后面跟着散列后的密码字符串。在这个例子中,#dddf5... 就是散列后的密码。~*: 这是一个键匹配模式,~* 表示该用户可以访问所有键(keys)。波浪号 ~ 表示匹配模式,星号 * 表示匹配任意字符串。&*: 这是一个命令匹配模式,&* 表示该用户可以执行所有命令。符号 & 表示匹配命令,星号 * 表示匹配任意命令。+@all: 表示授予用户所有命令的执行权限。+ 表示授权,@all 是一个权限分类,表示所有命令。配置权限

使用setuser命令,注意是每个节点都要去执行。

acl setuser demo on >HiRedis ~demo:* +@all -@admin -@dangerousacl save

解释:

demo:用户名

on: 启用

>HiRedis : 密码。注意前面这个>。表示我要明文配置密码。如果要添加一个SHA256编码后的密码,用#c3ab8ff13720...

~demo:*: 表示这个用户只能操作demo开头的key。如果要配置多个用空格隔开即可。

+@all:表示可以执行所有命令

-@admin -@dangerous:表示禁止admin类的命令和dangerous类的命令的使用。一般的业务账户是不需要这些的。

具体admin类命令都有哪些呢?

使用 acl cat 查看

> acl catkeyspace 以一种不可知的方式读或写keys、database、或他们的metadata,包含DEL, RESTORE, DUMP, RENAME, EXISTS, DBSIZE, KEYS, EXPIRE, TTL, FLUSHALL, 等;readwritesetsortedsetlisthashstringbitmap hyperlogloggeostreampubsubadmin 管理命令,通常应用是不需要这些命令的,包含REPLICAOF, CONFIG, DEBUG, SAVE, MONITOR, ACL, SHUTDOWN等;fast 时间复杂度为O(1)的命令集,可以循环参数的数量,但不是键中的元素数量。slow 所有不包含fast的命令集;blocking 阻塞连接直到被其他命令释放;dangerous 潜在风险的命令集(每一个都应该考虑他的风险原因),包含FLUSHALL, MIGRATE, RESTORE, SORT, KEYS, CLIENT, DEBUG, INFO, CONFIG, SAVE, REPLICAOF, etc;connectiontransactionscripting

查看具体某一个

> acl cat adminpfselftestmodule|loadmodule|listmodule|loadexmodule|unloadacl|loadacl|saveacl|dryrunacl|listacl|logacl|usersacl|getuseracl|deluseracl|setuserclient|pauseclient|listclient|unpauseclient|killclient|unblockclient|no-evictroledebugshutdownreplconflastsaveslaveofsavepfdebugbgrewriteaoflatency|doctorlatency|graphlatency|resetlatency|histogramlatency|latestlatency|historyslowlog|resetslowlog|lenslowlog|getreplicaofpsyncbgsavesyncconfig|resetstatconfig|rewriteconfig|getconfig|setfailovermonitorcluster|replicascluster|meetcluster|forgetcluster|flushslotscluster|setslotcluster|addslotsrangecluster|replicatecluster|failovercluster|set-config-epochcluster|delslotsrangecluster|addslotscluster|count-failure-reportscluster|delslotscluster|slavescluster|bumpepochcluster|saveconfigcluster|reset

再看看dangerous

> ACL CAT dangerouspfselftestmodule|loadmodule|listmodule|loadexmodule|unloadrestore-askingacl|loadacl|saveacl|dryrunacl|listacl|logacl|usersacl|getuseracl|deluseracl|setuserkeysclient|pauseclient|listclient|unpauseclient|killclient|unblockclient|no-evictroledebugrestoreshutdownmigratereplconfflushalllastsaveinfoslaveofsavesort_ropfdebugbgrewriteaoflatency|doctorlatency|graphlatency|resetlatency|histogramlatency|latestlatency|historyflushdbslowlog|resetslowlog|lenslowlog|getreplicaofpsyncbgsavesyncsortconfig|resetstatconfig|rewriteconfig|getconfig|setfailovermonitorcluster|replicascluster|meetcluster|forgetcluster|flushslotscluster|setslotcluster|addslotsrangecluster|replicatecluster|failovercluster|set-config-epochcluster|delslotsrangecluster|addslotscluster|count-failure-reportscluster|delslotscluster|slavescluster|bumpepochcluster|saveconfigcluster|resetswapdb

keys命令是作为dangerous命令的,所以我们新建的这个用户将不能使用keys命令

测试

现在用demo用户登录

[root@p-ktcstcpgl02 logs]# redis-cli -c -p 7379127.0.0.1:7379> auth demo HiRedisOK127.0.0.1:7379> keys a(error) NOPERM User demo has no permissions to run the 'keys' command> get aNOPERM No permissions to access a key> set demo:a 200OK> get demo:a200

现在就没权限执行keys了,也只能操作demo:开头的key

tips:

开启acl的用户不能使用redis-cli -u xxx -a xxx登陆

正确的命令是

redis-cli --user demo --pass HiRedis
1 阅读:93

程序员咋不秃头

简介:感谢大家的关注