在Redis6之前的版本中,因安全认证的主要方式是使用Redis实例的密码进行基础控制,而无法按照不同的应用来源配置不同账号以及更细粒度的操作权限控制来管理。本文先从client list中的信息入手,逐步了解Redis的客户端名设置、用户设置及权限控制管理。
一、客户端名
1、查看客户端连接情况
在Redis4版本中,使用 client list 命令查看客户端连接情况的时候可以发现,有的name中有名字,而大部分是没有内容的。有的人误以为这个名称是Redis的登录用户名。例如:
127.0.0.1:6379> client list
id=7 addr=127.0.0.1:50194 fd=7 name=testuser age=1222 idle=1185 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=8 addr=127.0.0.1:50238 fd=8 name= age=1180 idle=1174 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=9 addr=127.0.0.1:51394 fd=9 name= age=3 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
而client list命令的结果中的每一列的含义如下:
id: 7, 表示客户端连接的唯一标识符。
addr: 127.0.0.1:50194,客户端的 IP 地址和端口号。
fd: 7,客户端的文件描述符(File Descriptor)。
name: testuser,客户端的连接名字,通常是客户端自己设置的名字,可以用来标识连接来源
age: 1222,客户端连接的时长为 1222 秒。
idle: 1185,客户端的空闲时长为 1185 秒。
flags: N,客户端的连接状态标志,可能包含一系列标志,比如 "O" 表示输出缓冲区有未发送的数据,"S" 表示客户端是被从服务器中阻塞的,"N"表示无特殊标志
db: 0,客户端当前所在的数据库。
sub: 0,客户端订阅的频道数量。
psub: 0,客户端订阅的模式数量。
multi: -1,客户端不在事务中(没有执行 MULTI 命令)。如果客户端在执行事务,则显示事务的 ID;否则,为 "-1"
qbuf: 0,查询缓冲区的长度,即客户端还未读取的查询缓冲区的长度。
qbuf-free: 0, 查询缓冲区的空闲长度长度。
obl: 0,输出缓冲区的长度,即客户端还未读取的输出缓冲区的长度。
oll: 0,输出缓冲区的列表长度。
omem: 0,客户端的输出缓冲区占用内存字节数。
events: r,表示客户端关注可读事件。
cmd: client,表示客户端最后执行的命令是 CLIENT
可以看出,上面的名称是客户端的名称,而不是用户名。
2、设置客户端连接名
从上面的内容可以看出,Redis客户端连接名是可以自定义设置的。可以使用 CLIENT SETNAME 命令进行设置,使用 CLIENT GETNAME 命令进行查看。具体操作如下:
# 设置客户端名
127.0.0.1:6379> CLIENT SETNAME gjc
OK
#查看客户端名
127.0.0.1:6379> CLIENT GETNAME
"gjc"
# 查看客户端连接信息
127.0.0.1:6379> client list
id=7 addr=127.0.0.1:50194 fd=7 name=testuser age=2338 idle=2301 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=8 addr=127.0.0.1:50238 fd=8 name= age=2296 idle=2290 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=9 addr=127.0.0.1:51394 fd=9 name=gjc age=1119 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
这样就可以自定义设置客户端名了。
3、客户端名的优缺点
默认情况下,大部分人操作Redis都不会关注该设置。但其实客户根据情况进行选择是否设置。对于设置客户端名的优缺点如下:
优点:
- 标识连接来源:设置客户端名字可以用于标识连接的来源。在一个多用户的系统中,可以为每个用户设置一个唯一的名字,便于识别和区分各个连接。
- 监控和日志:在监控 Redis 连接时,通过客户端名字可以更容易地追踪和诊断问题。日志中包含客户端名字可以使日志更具可读性和可维护性。
- 权限管理:在一些场景下,可以根据客户端的名字进行权限管理。通过名字可以判断某个连接是否有权限执行特定操作,从而增加安全性。
缺点:
- 额外开销:每次连接都需要设置名字,这可能会增加一些额外的开销。而名字并不是必须的信息,在连接数很大的情况下,这可能会对性能产生一些影响。
- 隐私问题:客户端名字可能包含一些敏感信息,特别是在某些情况下,如果客户端名字是用户的用户名等个人信息。这可能引发隐私问题,需要谨慎处理。
- 不适合匿名连接:在一些场景下,可能存在匿名连接的需求。设置名字可能不适合匿名用户,因为匿名用户不希望暴露任何个人信息
二、数据库登录用户名
在Redis6版本中执行client list操作时,会看到对于的信息中多了2列,例如:
127.0.0.1:6479> client list
id=4 addr=127.0.0.1:54352 laddr=127.0.0.1:6479 fd=7 name= age=426 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=40928 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default redir=-1
其中多出两列的含义是:
user: default,客户端所属的用户。
redir: -1,重定向的标志,表示没有重定向。0: 表示客户端的连接已经被关闭或者重定向到其他节点。通常,当节点发生主从切换或集群中的槽发生迁移时,客户端可能会被重定向到新的节点。1: 表示客户端正在等待从节点对其进行复制。这通常发生在 Redis 集群中,当主节点变成从节点后,它会等待新的主节点将数据同步至此节点
其中我们可以发现增加了user标志。这是因为在Redis6版本中增加了访问权限控制列表功能(Access Control List,ACL),这个功能可以极大的提升Redis的安全性。
1、创建用户名
# 创建用户,>后面为明文密码
127.0.0.1:6479> ACL SETUSER testuser1 on >Test123.com
OK
# 列出用户
127.0.0.1:6479> ACL LIST
1) "user default on #515c217eb413b6aaf09de74bf42c85a6edc09ee7008c6ebedc2981b44bbc0fd3 ~* &* +@all"
2) "user testuser1 on #b6d18faf7ebcfdce9f8782a0aad13c14e2662fcc08072e2738bcb27d04b96188 &* -@all"
2、账密认证登录
127.0.0.1:6479> AUTH testuser1 Test123.com
OK
127.0.0.1:6479> client list
NOPERM this user has no permissions to run the 'client' command or its subcommand
因新建的用户没有查看client list的权限,因此另起一个会话用default用户查看连接情况
127.0.0.1:6479> client list
id=4 addr=127.0.0.1:54352 laddr=127.0.0.1:6479 fd=7 name= age=9319 idle=12 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=client user=testuser1 redir=-1
id=5 addr=127.0.0.1:56838 laddr=127.0.0.1:6479 fd=8 name= age=6773 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=40928 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default redir=-1
127.0.0.1:6479>
可以看到id=4的连接是新创建的testuser1账号登录的了。
三、结语
关于Redis中客户端名及登录用户名的区别,先简单演示至此。但关于Redis的权限控制还有很多内容,后续会继续对如何进行账号管理及主要应用场景进行演示。