在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的權限控制還有很多內容,后續會繼續對如何進行賬號管理及主要應用場景進行演示。