暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

redis cluster 添加acl支持

原创 huayumicheng 2022-11-27
846

1、访问控制列表,可以设置多个用户,并且给每个用户单独设置命令权限和数据权限

2、acl 命令

ACL HELP	查看ACL 的help文档
ACL LIST	查看当前活动的ACL
ACL USERS	返回所有用户名
ACL WHOAMI	返回当前用户名
ACL CAT	查看命令类别
ACL SETUSER	创建或修改用户属性
ACL GETUSER	查看用户的ACL权限
ACL DELUSER	删除指定的用户
ACL SAVE	当前服务器中的ACL权限持久化到aclfile中
ACL LOAD	将aclfile中的权限加载至redis服务中,使其立刻生效
ACL GENPASS	随机返回sha256密码,我们可以直接使用该密文配置ACL密码
ACL LOG	查看ACL安全日志
AUTH	切换用户

3、acl cat

192.168.100.61:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"

--查看命令分类
192.168.100.61:6379> acl cat
 1) "keyspace"
 2) "read"
 3) "write"
 4) "set"
 5) "sortedset"
 6) "list"
 7) "hash"
 8) "string"
 9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"

--查看geo 具体可以执行哪些命令

192.168.100.61:6379> acl cat geo
 1) "geodist"
 2) "georadius"
 3) "geohash"
 4) "geopos"
 5) "georadiusbymember_ro"
 6) "geosearchstore"
 7) "georadius_ro"
 8) "geoadd"
 9) "georadiusbymember"
10) "geosearch"
192.168.100.61:6379> 

4、规则

--启用和禁用用户
on:启用用户,可以以该用户身份进行认证。
off:禁用用户,不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用。

--允许和禁止调用命令
+:将命令添加到用户可以调用的命令列表中。
-:将命令从用户可以调用的命令列表中移除。
+@:允许用户调用 类别中的所有命令,有效类别为@admin,@set,@sortedset等,可调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,包括当前和未来版本中存在的所有命令。
-@:禁止用户调用 类别中的所有命令。
+|subcommand:允许使用已禁用命令的特定子命令。
allcommands:+@all的别名。包括当前存在的命令以及将来通过模块加载的所有命令。
nocommands:-@all的别名,禁止调用所有命令。

--允许或禁止访问某些Key
<pattern>:添加可以在命令中提及的键模式。例如和 allkeys 允许所有键。
resetkeys:使用当前模式覆盖所有允许的模式。如: ~foo:* ~bar:* resetkeys ~objects:* ,客户端只能访问匹配 object:* 模式的 KEY--为用户配置有效密码
:将此密码添加到用户的有效密码列表中。例如,>mypass将“mypass”添加到有效密码列表中。该命令会清除用户的nopass标记。每个用户可以有任意数量的有效密码。
<:从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。
:将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。允许用户将哈希存储在users.acl文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符且小写的十六进制字符。
!:从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。
nopass:移除该用户已设置的所有密码,并将该用户标记为nopass无密码状态:任何密码都可以登录。resetpass命令可以清除nopass这种状态。
resetpass:清空该用户的所有密码列表。而且移除nopass状态。resetpass之后用户没有关联的密码同时也无法使用无密码登录,因此resetpass之后必须添加密码或改为nopass状态才能正常登录。
reset:重置用户状态为初始状态。执行以下操作resetpass,resetkeys,off,-@all


5、redis  cluster  添加 acl 

--每个节点配置文件添加acl支持

touch /data/redis/6379/conf/users.aclfile
touch /data/redis/6380/conf/users.aclfile


cat << EOF >>/data/redis/6379/conf/6379.conf 
requirepass 123456
masterauth  123456
aclfile "/data/redis/6379/conf/users.aclfile"
EOF


cat << EOF >>/data/redis/6380/conf/6380.conf 
requirepass 123456
masterauth  123456
aclfile "/data/redis/6380/conf/users.aclfile"
EOF

--aclfile 和 acl配置是冲突的,需要删除之前自动生成的acl规则 sed -i '/^user default on/d' /data/redis/6379/conf/6379.conf sed -i '/^user default on/d' /data/redis/6380/conf/6380.conf

--重启redis
systemctl stop redis_server_6379.service systemctl stop redis_server_6380.service systemctl start redis_server_6379.service systemctl start redis_server_6380.service

--重启redis之后,cluster认证模式失效,需要重新配置用户密码

[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 192.168.100.61:6379> acl setuser default >123456 OK redis-cli -c -h 192.168.100.62 -p 6379 redis-cli -c -h 192.168.100.64 -p 6379 redis-cli -c -h 192.168.100.61 -p 6380 redis-cli -c -h 192.168.100.62 -p 6380 redis-cli -c -h 192.168.100.64 -p 6380
--保存配置acl配置信息[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 192.168.100.61:6379> acl save

6、查看集群状态

--命令行直接带密码输入

[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 --user default --pass 123456 cluster info
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:10
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1584
cluster_stats_messages_pong_sent:1529
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:3114
cluster_stats_messages_ping_received:1529
cluster_stats_messages_pong_received:1580
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:3111


--2>/dev/null  去掉提示符

[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 --user default --pass 123456 cluster info 2>/dev/null
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:10
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1895
cluster_stats_messages_pong_sent:1838
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:3734
cluster_stats_messages_ping_received:1838
cluster_stats_messages_pong_received:1891
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:3731



--手动输入密码
[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 --user default --askpass cluster info        
Please input password: ******
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:10
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1622
cluster_stats_messages_pong_sent:1557
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:3180
cluster_stats_messages_ping_received:1557
cluster_stats_messages_pong_received:1618
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:3177

7、--添加用户,acl 用户需要在cluster节点的每个node都添加

[root@redis1 ~]# redis-cli -c -h 192.168.100.61 -p 6379 --user default --pass 123456 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.61:6379> acl setuser test on >'tom.123' allkeys +@all
OK
192.168.100.61:6379> acl list
1) "user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* &* +@all"
2) "user test on #72b2eecf2c41e61945864ea08c886f35c2c977026efc064031417707c54dd9d3 ~* &* +@all"
192.168.100.61:6379> acl save
OK


8、添加用户的一些常见场景

创建DBA管理账号
> ACL SETUSER dba on #6d0ac515af9df81653ed0aa3ffa692663c3f556079791e2f00a4578990da66f3 allkeys +@all
OK
创建读写账号
> ACL SETUSER readwrite on >abc allkeys -@all +@read +@write
OK
创建只读账号
> ACL SETUSER readonly on >abc allkeys -@all +@read
OK
创建只写账号
> ACL SETUSER write_user on >abc allkeys -@all +@write
OK
创建复制账号
> ACL SETUSER replica-user >abc -@all +psync +replconf +ping on
OK
创建哨兵账号
> ACL SETUSER sentinel-user >abc -@all +client +subscribe +publish +ping +info +multi +slaveof +config +client +exec on
OK
创建监控账号
> ACL SETUSER monitor on >abc +monitor
OK
创建指定key、有指定类型权限的账号
-- 指定对h开头的hash类型的key有权限
> ACL SETUSER ops_user on >abc ~h* +@hash
OK
其中key的模式是正则匹配,需要~开头,针对权限则是hash的类,其权限可以通过ACL CAT hash查看。

注意:以上操作完只有需要执行ACL SAVE。不然重置之后用户信息全部都清空了。
在默认配置中,Redis 6(第一个具有ACL的版本)的工作方式与Redis的旧版本完全相同,即每个新连接都能够调用每个可能的命令并访问每个键,因此ACL功能与旧版本向后兼容。同样使用requirepass配置指令配置密码的旧方法仍然可以按预期工作(只是为默认用户设置密码)。关于ACL更多的操作指南可以看官方文档。

参考:https://blog.csdn.net/qq_29235677/article/details/121475204


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论