前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis安全 | 权限设置

Redis安全 | 权限设置

作者头像
一个架构师
发布2022-06-27 15:17:29
4.3K0
发布2022-06-27 15:17:29
举报

到V6.0版本为止, Redis的安全设置共有两种方式, 一种是通过requirepass设置密码, 第二种是通过ACL进行更精确的安全设置.

一. requirepass

在之前V6.0版本前,可以使用 requirepass 设置用户访问密码.

1.1

redis.conf 配置文件

在redis.conf中通过 requirepass项配置访问密码;

代码语言:javascript
复制
requirepass pwd # pwd为设置密码

1.2

命令方式设置

通过config set requirepass命令设置访问密码

代码语言:javascript
复制
127.0.0.1:6379> config set requirepass "pwd"
OK

1.3

清空密码

代码语言:javascript
复制
127.0.0.1:6379> CONFIG SET requirepass ""
OK

这种方式的缺点就是无法对访问进行精确控制, 很容易因为用户权限太大而带来误操作的风险, 因此在 V6.0 版本中引入ACL 机制, 能对用户操作进行精确控制;

二. ACL访问控制列表

Redis6.0发布了权限管理功能ACL(access control list 访问控制列表), 可以根据不同的用户设置不同的权限, 限制用户访问命令和待访问的数据.

ACL是使用领域专用语言DSL(Domain specific language)定义的, 描述用户能够执行的操作, 其中规则是从上到下, 从左到右应用;

2.1

acl setuser

创建用户或者设置用户访问规则;

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 on >pwd ~* +get
OK

2.2

acl list

查看权限列表;

代码语言:javascript
复制
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
2) "user u1 on #a1159e9df3670d549d04524532629f5477ceb7deec9b45e47e8c009506ecb2c8 ~* &* -@all +get"

user 用户

u1 用户名, default是系统默认用户名, 兼容旧版本;

on 是否启用用户, 默认为off(禁用);

#... 用户密码, nopass表示不需要密码;

~* 可访问的数据Key(正则匹配);

+@ 表示用户的权限, "+"添加权限, "-"删减权限; @为redis命令分类, 可以通过 ACL CAT 查询相关分类. +@all 表示所有权限;

2.3

auth 登录

使用指定用户登录;

代码语言:javascript
复制
127.0.0.1:6379> auth u1 pwd
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> set a a 
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

2.4

acl setuser

使用setuser设置其他规则;

2.4.1

仅添加用户

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 off &* -@all"

2.4.2

启用用户

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 on
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"

2.4.3

禁用用户

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 off
OK

2.4.4

设置密码

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 >pwd
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on #a1159e9df3670d549d04524532629f5477ceb7deec9b45e47e8c009506ecb2c8 &* -@all"

2.4.5

删除密码

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 <pwd
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"

2.4.6

添加用户指定命令权限

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 +get
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all +get"

2.4.7

删除用户指定命令权限

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 -get
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"

2.4.8

添加用户指定种类命令权限

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 +@set
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all +@set"

2.4.9

删除用户指定种类命令权限

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u1 -@set
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
127.0.0.1:6379> 

2.5

acl getuser

查看指定用户权限信息

代码语言:javascript
复制
127.0.0.1:6379> acl getuser u1
 1) "flags"
 2) 1) "on"
    2) "allchannels"
 3) "passwords"
 4) (empty array)
 5) "commands"
 6) "-@all"
 7) "keys"
 8) (empty array)
 9) "channels"
10) 1) "*"
127.0.0.1:6379>

2.6

acl deluser

删除指定用户

代码语言:javascript
复制
127.0.0.1:6379> acl setuser u2
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
3) "user u2 off &* -@all"
127.0.0.1:6379> acl deluser u2
(integer) 1
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
127.0.0.1:6379>

2.7

acl cat

查看命令类别或者指定类别下的命令

2.7.1

查看所有种类

代码语言:javascript
复制
127.0.0.1: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"

2.7.2

查看指定种类下所有命令

代码语言:javascript
复制
127.0.0.1:6379> acl cat string
 1) "msetnx"
 2) "setex"
 3) "getrange"
 4) "setrange"
 5) "decr"
 6) "getset"
 7) "substr"
 8) "incr"
 9) "strlen"
10) "setnx"
11) "get"
12) "stralgo"
13) "mset"
14) "psetex"
15) "append"
16) "getdel"
17) "getex"
18) "incrby"
19) "decrby"
20) "set"
21) "incrbyfloat"
22) "mget"
127.0.0.1:6379>

2.8

acl log

查看安全日志

代码语言:javascript
复制
127.0.0.1:6379> acl log
1)  1) "count"
    2) (integer) 1
    3) "reason"
    4) "command"
    5) "context"
    6) "toplevel"
    7) "object"
    8) "acl"
    9) "username"
   10) "u1"
   11) "age-seconds"
   12) "236.501"
   13) "client-info"
   14) "id=4 addr=127.0.0.1:40204 laddr=127.0.0.1:6379 fd=8 name= age=506 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=23 qbuf-free=40931 argv-mem=7 obl=0 oll=0 omem=0 tot-mem=61463 events=r cmd=acl user=u1 redir=-1"
2)  1) "count"
    2) (integer) 1
    3) "reason"
    4) "auth"
    5) "context"
    6) "toplevel"
    7) "object"
    8) "auth"
    9) "username"
   10) "u2"
   11) "age-seconds"
   12) "372.00299999999999"
   13) "client-info"
   14) "id=4 addr=127.0.0.1:40204 laddr=127.0.0.1:6379 fd=8 name= age=371 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=31 qbuf-free=40923 argv-mem=9 obl=0 oll=0 omem=0 tot-mem=61473 events=r cmd=auth user=default redir=-1"

2.9

acl whoami

查看当前用户

代码语言:javascript
复制
127.0.0.1:6379> acl whoami
"default"

2.10

acl genpas

随机生成密码

该命令默认创建一个 256 bit 的 32 字节的伪随机字符串, 并将其转换为 64 字节的字母+数字的字符串. 如有有参数, 则使用指定的位数长度.

代码语言:javascript
复制
127.0.0.1:6379> acl genpass
"f0bc11d9dc86a6e2bd32555ed3a0cc8f03cdcab51d57eaa11b4d8f7a2d8362ac"
127.0.0.1:6379> acl genpass 16
"337b"
127.0.0.1:6379> acl genpass 32
"49d6ccd4"
127.0.0.1:6379>

2.11

aclfile 权限存储文件

在redis.conf中配置aclfile项

代码语言:javascript
复制
aclfile /etc/redis/users.acl

2.11.1

acl save

将当前 ACL 配置保存到一个外部文件

代码语言:javascript
复制
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> acl setuser u1 
OK
127.0.0.1:6379> acl save
OK

查看acl文件

代码语言:javascript
复制
# cat users.acl 
user default on nopass ~* &* +@all
user u1 off &* -@all

2.11.2

acl load

acl load命令是将保存权限的aclfile文件加载到系统中; 加载后可以对文件进行修改;

代码语言:javascript
复制
# cat users.acl 
user default on nopass ~* &* +@all

加载ACL数据

代码语言:javascript
复制
127.0.0.1:6379> acl load
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"

总结

以上, 就是redis的密码设置访问, 权限控制等安全设置.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档