Redis 6.0新特性——ACLs
簡(jiǎn)介
Redis在6版本之前是沒(méi)有權限的概念的,所以所有連接的客戶(hù)端都可以對Redis里面的數據進(jìn)行操作,也可以使用所有高危命令,這樣就可能存在Redis直接down掉或者數據被全部清空的情況。
- 當執行
flushall
或者flashdb
的時(shí)候會(huì )清空掉數據庫里面的所有數據。 - 當執行
DEBUG SEGFAULT
的時(shí)候Redis進(jìn)程會(huì )直接down掉。如下圖所示:
在Redis 5以及之前的版本為了避免這種情況的出現,可以使用 rename-command
將高危命令禁用掉。
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command EVAL ""
rename-command SHUTDOWN ""
以上方法雖然可以解決掉高危命令帶來(lái)的問(wèn)題,但是只是使用了簡(jiǎn)單粗暴的方式,沒(méi)有做的比較細致。
ACL 權限
Redis ACL是Access Control List(訪(fǎng)問(wèn)控制列表)的縮寫(xiě),該功能允許根據可以執行的命令和可以訪(fǎng)問(wèn)的鍵來(lái)限制某些連接。它的工作方式是,在連接之后,要求客戶(hù)端進(jìn)行身份驗證,以提供用戶(hù)名和有效密碼:如果身份驗證階段成功,則連接與給定用戶(hù)關(guān)聯(lián),并且該用戶(hù)具有限制??梢詫edis進(jìn)行配置,以使新連接已過(guò)“默認”用戶(hù)進(jìn)行身份驗證(這是默認配置),因此,配置默認用戶(hù)具有的能力是,僅向連接提供特定功能子集的功能未明確認證。
為某個(gè)用戶(hù)設置權限可以使用下面命令:
ACL SETUSER test >passwd on allkey +set
setuser
...on
表示啟用此用戶(hù),off則是只定義一個(gè)不可用(unaccessable)的用戶(hù)。
>passwd
表示給當前用戶(hù)設置密碼,可以通過(guò)auth命令進(jìn)行登錄acl控制的用戶(hù)。
auth test passwd
+set
當前用戶(hù)擁有執行set命令的權限,與之相反的是 -set
表示取消指定用戶(hù)執行set命令的權限。
切換用戶(hù)之后只對指定的命令擁有執行權限。
acl 配置文件
一般情況下,我們使用命令行設置的acl權限只是保存在內存里面,當Redis進(jìn)程重啟之后我們設置的權限就不見(jiàn)了。那我們應該怎么辦呢,對于這種情況,官方也想到了,提供了acl的配置文件。在Redis的配置文件(redis.conf)中可以配置acl文件的位置:
aclfile /etc/redis/users.acl
那么acl里面到底保存的是什么呢?其實(shí)acl里面保存的就是命令 acl list
執行的結果。其中密碼的經(jīng)過(guò)加密了的也比較安全。
下圖是acl配置文件的樣例,是通過(guò)執行命令 acl save
生成的。
下圖是命令 acl list
執行的結果。
注意
acl 權限不會(huì )自動(dòng)寫(xiě)入到配置文件里面,在生成ACL配置文件的時(shí)候一定要注意執行夏明命令進(jìn)行持久化(需要先配置 aclfile
)
acl save
