1. 程式人生 > 其它 >六、redis6 ACL(Access Control List)訪問控制權限

六、redis6 ACL(Access Control List)訪問控制權限

介紹:

在Redis6之前的版本,我們只能使用requirepass引數給default使用者配置登入密碼,同一個redis叢集的所有開發都共享default使用者,難免會出現誤操作把別人的key刪掉或者資料洩露的情況,那之前我們也可以使用rename command的方式給一些危險函式重新命名或禁用,但是這樣也防止不了自己的key被其他人訪問。

因此Redis6版本推出了ACL(Access Control List)訪問控制權限的功能,基於此功能,我們可以設定多個使用者,並且給每個使用者單獨設定命令許可權和資料許可權。 為了保證向下相容,Redis6保留了default使用者和使用requirepass的方式給default使用者設定密碼,預設情況下default使用者擁有Redis最大許可權,我們使用redis
-cli連線時如果沒有指定使用者名稱,使用者也是預設default。鼓掌! 我們可以在配置檔案中或者命令列中設定ACL,如果使用配置config檔案的話需要重啟服務,使用配置aclfile檔案或者命令列授權的話無需重啟Redis服務但需要及時將許可權持久化到磁碟,否則下次重啟的時候無法恢復該許可權。
概述

配置檔案模式:

配置ACL的方式有兩種,一種是在config檔案中直接配置,另一種是在外部aclfile中配置。配置的命令是一樣的,但是兩種方式只能選擇其中一種,我們之前使用requirepass給default使用者設定密碼 預設就是使用config的方式,執行config rewrite重寫配置後會自動在config檔案最下面新增一行記錄配置default的密碼和許可權

conf檔案模式:

使用redis.conf檔案配置default和其他使用者的ACL許可權:

1.在config檔案中配置default使用者的密碼
requirepass  wang!321

2.在config檔案中新增DSL命令配置使用者ACL許可權

3.在config檔案中註釋aclfile的路徑配置(預設註釋)
# aclfile /etc/redis/users.acl

4.重啟redis服務
systemctl restart redis
步驟

在config檔案中配置requirepass,預設是給default使用者建立密碼

重啟後進入命令列執行config rewrite寫入配置

127.0.0.1:6379> config rewrite

因此我們可以直接在config配置檔案中使用上面default使用者ACL這行DSL命令設定使用者許可權,或者我們也可以配置外部aclfile配置許可權。

配置aclfile需要先將config中配置的DSL註釋或刪除,因為Redis不允許兩種ACL管理方式同時使用,否則在啟動redis的時候會報錯誤

外部ACLFILE模式:

使用外部aclfile檔案配置Default和其他使用者的ACL許可權:

1.註釋redis.conf中所有已授權的ACL命令,如:
#user  default  on  #8d23545asfwefew22  ~*  +@all

2.在config檔案中註釋default使用者的密碼,因為開啟aclfile之後,requirepass的密碼就失效了
redis.conf
#requirepass wang!321

3.在config檔案中配置aclfile的路徑,然後建立改檔案,否則重啟redis會報找到該檔案
aclfile /etc/redis/users.acl

touch /etc/redis/users.acl

4.在外部aclfile檔案中新增DSL命令配置使用者ACL許可權,如
user  default  on  #8d23545asfwefew22  ~*  +@all

5.重啟redis 或使用 aclfile load命令載入許可權
systemctl restart redis
或在命令列執行:aclflie load
步驟

開啟aclfile之後不再推薦在redis.conf檔案中通過requirepass配置default的密碼,因為它不再生效,同時開啟aclfile之後也不能使用redis-cli -a xxx登陸,必須使用redis-cli --user xxx --pass yyy來登陸:

對比conf和aclfile模式:

在redis.conf和aclfile模式中配置DSL 官方更推薦使用aclfile,因為如果在redis,conf中配置了許可權之後需要重啟redis服務才能將配置的許可權載入至redis服務中來,但如果使用aclfile模式,可以呼叫acl load命令將aclfile中配置的ACL許可權熱載入進環境中,類似於Mysql中的flush privileges。

redis.conf user.acl
配置方式 DSL DSL
載入ACL配置 重啟redis acl load命令
持久化ACL配置 config rewrite命令 acl save命令

命令列模式

介紹

在配置檔案中配置的ACL許可權,需要執行ACL LOAD或者重啟Redis服務才能生效

在命令列下配置ACL,在命令列模式下配置的許可權無需重啟服務即可生效。我們也可以在命令列模式下配置ACL並將其持久化到aclfile或者config檔案中(這取決於配置檔案中選擇的是config模式還是外部aclfile模式),一旦將許可權持久化到aclfile或cofig檔案中,下次重啟就會自動載入該許可權,如果忘記持久化,一旦服務宕機或重啟,該許可權就會丟失。

持久化config模式:config rewrite

持久化aclfile模式:acl save

ACL規則:ACL規則可以在redis.conf檔案以及users.acl檔案中配置DSL,也可以在命令列中通過ACL命令配置。

啟用和禁用使用者

on:啟用使用者:可以以該使用者身份進行認證。

off:禁用使用者:不再可以使用此使用者進行身份驗證,但是已經通過身份驗證的連線仍然可以使用

允許和禁止呼叫命令

+<command>:將命令新增到使用者可以呼叫的命令列表中。
-<command>:將命令從使用者可以呼叫的命令列表中移除。
+@<category>:允許使用者呼叫 <category> 類別中的所有命令,有效類別為@admin,@set,@sortedset等,可通過呼叫ACL CAT命令檢視完整列表。特殊類別@all表示所有命令,包括當前和未來版本中存在的所有命令。
-@<category>:禁止使用者呼叫<category> 類別中的所有命令。
+<command>|subcommand:允許使用已禁用命令的特定子命令。
allcommands:+@all的別名。包括當前存在的命令以及將來通過模組載入的所有命令。
nocommands:-@all的別名,禁止呼叫所有命令。

允許或禁止訪問某些Key
~<pattern>:新增可以在命令中提及的鍵模式。例如~*和* allkeys 允許所有鍵。
* resetkeys:使用當前模式覆蓋所有允許的模式。如: ~foo:* ~bar:* resetkeys ~objects:* ,客戶端只能訪問匹配 object:* 模式的 KEY。
為使用者配置有效密碼
><password>:將此密碼新增到使用者的有效密碼列表中。例如,>mypass將“mypass”新增到有效密碼列表中。該命令會清除使用者的nopass標記。每個使用者可以有任意數量的有效密碼。
<<password>:從有效密碼列表中刪除此密碼。若該使用者的有效密碼列表中沒有此密碼則會返回錯誤資訊。
#<hash>:將此SHA-256雜湊值新增到使用者的有效密碼列表中。該雜湊值將與為ACL使用者輸入的密碼的雜湊值進行比較。允許使用者將雜湊儲存在users.acl檔案中,而不是儲存明文密碼。僅接受SHA-256雜湊值,因為密碼雜湊必須為64個字元且小寫的十六進位制字元。
!<hash>:從有效密碼列表中刪除該雜湊值。當不知道雜湊值對應的明文是什麼時很有用。
nopass:移除該使用者已設定的所有密碼,並將該使用者標記為nopass無密碼狀態:任何密碼都可以登入。resetpass命令可以清除nopass這種狀態。
resetpass:情況該使用者的所有密碼列表。而且移除nopass狀態。resetpass之後使用者沒有關聯的密碼同時也無法使用無密碼登入,因此resetpass之後必須新增密碼或改為nopass狀態才能正常登入。
reset:重置使用者狀態為初始狀態。執行以下操作resetpass,resetkeys,off,-@all。

常用命令:

127.0.0.1::6379> acl help          #幫助文件

127.0.0.1::6379> acl list          #檢視當前活動的ACL,預設情況下,有一個“default”使用者 

127.0.0.1::6379> acl users          #返回所有使用者名稱

127.0.0.1::6379> acl whoami        #返回所有使用者名稱

127.0.0.1::6379> acl cat          #檢視命令類別,用於授權

127.0.0.1::6379> acl cat list          #顯示所有指定類別下的所有命令

127.0.0.1::6379> acl setuser        #建立或修改使用者屬性,username區分大小寫

127.0.0.1::6379> acl getuser        #檢視使用者的ACL許可權

127.0.0.1::6379> acl deluser        #刪除指定的使用者

127.0.0.1::6379> acl save        #持久化

127.0.0.1::6379> acl load         #載入aclfile中的許可權

127.0.0.1::6379> acl genpass         #隨機返回sha256密碼,我們可以直接使用該密文配置ACL密碼

127.0.0.1::6379> acl genpass 64         #隨機返回sha256密碼,我們可以直接使用該密文配置ACL密碼

127.0.0.1::6379> acl log        #檢視ACL安全日誌

127.0.0.1::6379> auth <username> <password>        #auth命令切換使用者