Redis 6.0權限控制命令ACLs詳解


1. 前言

在使用 Redis 6.0 之前的版本時,通常會遇到如下問題:

 

●執行 FLUSHALL 命令,整個 Redis 數據庫就清空了

●執行 DEBUG SEGFAULT 命令,導致 Redis 崩潰

●執行 KEYS 命令,引起 Redis 的阻塞甚至宕機

......

針對以上問題,我們解決的辦法可能是使用 Redis 的 rename-command 將這些危險命令禁用或者重命名。也就是說,我們是有辦法防止上述情況發生的。

 

 

 

但是,對於另外一種情況:多個項目公用一套 Redis 集群,多項目的 KEY 實際上是共享的,這樣便存在安全風險。

 

我們如何解決多項目之間互相操作對方 KEY 的問題呢?

 

 

 

Redis 6.0 提供了一種新的特性 ACL ,可以方便的解決上述的各類問題。

 

 

 

Redis Flushall 命令用於清空整個 Redis 服務器的數據(刪除所有數據庫的所有 key )。

 

Debug Segfault 命令執行一個非法的內存訪問從而讓 Redis 崩潰,僅在開發時用於 BUG 調試。

 

 Keys 命令用於查找所有符合給定模式 pattern 的 key

 

 

 

redis.conf 中加入如下內容,禁用相應的命令

 

rename-command KEYS     ""

rename-command FLUSHALL ""

rename-command DEBUG    ""

 

 

 

2. 什么是 ACL

Redis ACL 是 Access Control List(訪問控制列表)的縮寫,該功能允許對訪問 Redis 的連接做一些可執行命令和可訪問的 KEY 的限制。

 

它的工作方式是,在連接之后,要求客戶端進行身份驗證,以提供用戶名和有效密碼:如果身份驗證成功,該客戶端連接與給定用戶綁定,並具有該用戶的訪問權限。

 

為了保證 Redis 向下兼容,Redis 6.0 中定義了一個默認的 “default” 用戶,該用戶擁有操作 Redis 的所有權限。也就是說,每個連接都能夠調用每個命令並訪問每個 KEY。同樣,使用 requirepass 設置訪問密碼的方式與舊版本也保持一致,只不過 Redis 6.0 的這個密碼僅對用戶 “default” 有效。

 

Redis AUTH 命令也在 Redis 6.0 中進行了擴展,現在支持兩個參數的訪問

AUTO <username> <password>

 

當按照舊版本的方式訪問時(在不輸入用戶名時,默認使用 default 用戶,做到向下兼容)

 

AUTO <password>   等價於   AUTO default <password>

 

 

2.1 什么時候使用 ACLs

在使用 ACL 前,我們應該考慮一下,使用 ACL 我們想要達到什么目的。

 

主要有下面兩種目的,我們可以通過使用 ACLs 來達成 :

1.希望通過限制對命令和 KEY 的訪問來提高安全性。以便不受信任的客戶端無法訪問,而受信任的客戶端僅具有滿足要求的最低操作權限。如:某些客戶端可能僅能執行只讀命令。

 

2.想提高操作安全性,以防止由於軟件或人為錯誤而導致非授權情況的操作,導致數據或配置的損壞。例如,不應該讓所有客戶端都能夠調用 FLUSHALL 命令。

 

 

3. ACL 規則

ACLS 是使用 DSL(Domain specific language,領域專用語言)來定義的。

 

可以通過兩種方式配置 ACL

 

在命令行通過 ACL 命令配置

開啟 Redis 配置文件中開啟 aclfile 配置項,通過配置文件的方式加載

redis.conf 默認配置中, 使用外部 aclfile 是不開啟的

我們通過配置來啟用:aclfile  /usr/local/redis6/users.acl

/usr/local/redis6/users.acl 即 acl 的配置文件

 

 

啟動或禁用用戶

● on  啟用。可以使用該用戶進行身份認證

● off  禁用。不能使用該用戶進行身份認證,但已通過身份認證的連接仍然可以使用。

 

 

啟用或禁用命令

●+<command>   <command> 命令添加到用戶可調用的命令列表中

●-<command>  從可調用的命令列表中移除 <command> 命令

●+@<category>  允許用戶調用 <category> 分類中的所有命令(可通過 ACL CAT 命令查看完成分類列表)

●-@<category>  禁止用戶調用 <category> 分類中的所有命令

●+<command>|subcommand  允許使用原本禁用的特定類別下的特定子命令

●+@all  允許調用所有命令,與使用 allcommands 效果相同。包括當前存在的命令以及將來通過模塊加載的命令

●-@all  禁止調用所有命令

 

 

允許或禁止訪問某些 KEY

●~<pattern> 添加符合條件的模式。如:  ~* 允許所有 KEY,使用 ~* allkeys 效果相同

●resetkeys 使用當前模式覆蓋所有允許的模式。如: ~foo:* ~bar:*  resetkeys ~objects:* ,最終客戶端只允許訪問匹配 ~object:* 模式的 KEY

 

 

為用戶配置有效密碼

●><password>  將密碼添加到用戶有效密碼列表中。例如:>password 將會把 password 添加到用戶的密碼列表中。該操作會清除用戶的 nopass 標記。每個用戶可由擁有多個有效密碼

●<<password>  將密碼從用戶有效密碼列表中移除。列表中不存在改密碼時,會報錯。

●#<hash>  將此 SHA-256 哈希值添加到用戶的有效密碼列表中。該哈希值將與 ACL 用戶輸入的密碼的哈希值進行比較。這將允許用戶將此哈希值存儲在 acl 配置文件中,而不是存儲明文密碼。僅接受 SHA-256 哈希值,因為密碼的哈希必須由 64 個字符長度的小寫的十六進制字符組成。

●!<hash>  從有效密碼列表中刪除該哈希值。(適用於不知道哈希值指定的密碼但又想從用戶中刪除密碼的情況)

●nopass  刪除用戶所有密碼,並將該用戶標記為不需要密碼。如果此指令引用於 default 用戶,則每個新的連接都將立即通過 default 用戶進行連接,而無需任何顯示的 AUTH 命令。

●resetpass  清除用戶可用密碼列表的數據,並清除 nopass 狀態。之后該用戶將沒有任何關聯的有效密碼,將不允許登錄,直到為該用戶設置了有效密碼或將用戶設置成 nopass 狀態

reset  重置用戶到初始狀態。該命令會執行以下操作:resetpassresetkeysoff-@ all

未使用 nopass 標記且沒有有效密碼列表的用戶,實際上是無法使用的。因為無法以該用戶的身份登錄。

 

 

 

4. ACL 常用命令

ACL LIST

檢查當前活動的 ACL 列表

 

 

127.0.0.1:6379> ACL LIST

1) "user default on nopass ~* +@all"

 

首次安裝后只有一個默認的 default 用戶,其具有如下狀態:

 

用戶名為 default

●用戶處於啟用狀態

●訪問不需要密碼

可以訪問所有 KEY

●可以執行所有命令

 

 

ACL SETUSER

ACL SETUSER <username> 用戶不存在,則按默認規則創建用戶。用戶存在,則該命令不執行任何操作。

 

ACL SETUSER <username> <rules> 用戶不存在,則按默認規則創建用戶,並增加 <rules> 。用戶存在則在原有規則上增加 <rules>

 

<username> 用戶名區分大小寫

// 創建一個名為 gcp 的用戶

127.0.0.1:6379> ACL SETUSER gcp

OK

 

// 查詢所有活動的 ACL

127.0.0.1:6379> ACL LIST

1) "user default on nopass ~* +@all"

2) "user gcp off -@all"

 

 

 

 

我們創建的 gcp 用戶默認規則為:

 

●處於關閉狀態

●無法執行任何命令

沒有匹配的訪問 KEY 的模式

●沒有有效的密碼

 我們為其配置一些 ACL 規則

 

// 用戶狀態設置為啟用,密碼為 password,允許訪問以 cached: 開頭的 KEY,允許執行 get 命令

127.0.0.1:6379> ACL SETUSER gcp on >password ~cached:* +get

OK

 

127.0.0.1:6379> ACL LIST

1) "user default on nopass ~* +@all"

2) "user gcp on #89e01536ac207279409d4de1e5253e01f4a1769e696db0d6062ca9b8f56767c8 ~cached:* -@all +get"

 

// set 一個以 cached: 開頭的 KEY 用來測試

127.0.0.1:6379> set cached:test test

OK

 

 

 

 

使用 AUTH 命令切換到 gcp 用戶下,進行測試

// 使用 AUTH 切換到 gcp 用戶下

127.0.0.1:6379> AUTH gcp password

OK

 

// 使用 set 命令設置不符合匹配規則的 KEY

127.0.0.1:6379> set a 1

(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

 

 

// 使用 set 命令設置符合匹配規則的 KEY

127.0.0.1:6379> set cached:aaa 1

(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

 

 

// 使用 get 命令獲取不符合匹配的 KEY

127.0.0.1:6379> get a

(error) NOPERM this user has no permissions to access one of the keys used as arguments

 

 

// 使用 get 命令獲取符合匹配規則的 KEY

127.0.0.1:6379> get cached:test

"test"

 

測試結果與我們配置的 ACL 規則相符。

 

 

 

ACL GETUSER <username>

ACL LIST 作用類似。ACL GETUSER 用來獲取指定用戶的 ACL 狀態信息

 

127.0.0.1:6379> ACL GETUSER default

1) "flags"      // 標記數組(啟用、可操作所有 KEY、可執行所有命令、無密碼)

2) 1) "on"

   2) "allkeys"

   3) "allcommands"

   4) "nopass"

3) "passwords" // 密碼

4) (empty array)

5) "commands" // 命令匹配規則

6) "+@all"

7) "keys" // KEY 的模式匹配規則

8) 1) "*"

 

 

127.0.0.1:6379> ACL GETUSER gcp

1) "flags"  

2) 1) "on"

3) "passwords"

4) 1) "89e01536ac207279409d4de1e5253e01f4a1769e696db0d6062ca9b8f56767c8"

5) "commands"

6) "-@all +get"

7) "keys"

8) 1) "cached:*"

 

 

 

 

 

ACL DELUSER

刪除用戶 ACL DELUSER <username>

 

 

 

// 創建一個測試用戶

127.0.0.1:6379> ACL SETUSER testuser

OK

127.0.0.1:6379> ACL LIST

1) "user default on nopass ~* +@all"

2) "user gcp on +@all"

3) "user testuser off -@all"

 

 

// 刪除用戶

127.0.0.1:6379> ACL DELUSER testuser

(integer) 1

 

// 查看結果

127.0.0.1:6379> ACL LIST

1) "user default on nopass ~* +@all"

2) "user gcp on +@all"

 

 

 

 

ACL USERS

查看 ACL 的所有用戶

 

127.0.0.1:6379> ACL USERS

1) "default"

2) "gcp"

 

 

ACL WHOAMI

查看當前操作的用戶

 

 

127.0.0.1:6379> ACL WHOAMI

"default"

 

 

ACL CAT

ACL CAT 顯示所有的 ACL 類別

ACL CAT <類別> 顯示指定類別中所有的 Redis 命令

 

 

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"

 

 

dangerous 為例,查看該類別包含的所有命令:

127.0.0.1:6379> ACL CAT dangerous

 1) "bgsave"

 2) "module"

 3) "replconf"

 4) "info"

 5) "role"

 6) "debug"

 7) "slaveof"

 8) "keys"

 9) "flushdb"

10) "bgrewriteaof"

11) "lastsave"

12) "acl"

13) "psync"

14) "client"

15) "latency"

16) "save"

17) "migrate"

18) "pfselftest"

19) "swapdb"

20) "restore-asking"

21) "sync"

22) "shutdown"

23) "monitor"

24) "slowlog"

25) "pfdebug"

26) "flushall"

27) "sort"

28) "config"

29) "replicaof"

30) "cluster"

31) "restore"

 

 

 

ACL SAVE

前提:redis 配置中啟用了 aclfile 選項

將當前所有的 ACL 存入 aclfile,覆蓋 aclfile 內容

 

 

 

ACL LOAD

前提:redis 配置中啟用了 aclfile 選項

acl 文件中加載定義的 acl 規則

 

 

該命令保證所有的規則都有效時才能執行成功:

 

如果 aclfile 文件中每一行都有效,則將所有內容加載到內存替換內存中現有的 ACL 規則

 

●如果文件中有一行或多行無效,則不會加載任何內容,繼續使用現有內存中的規則

 

 

 

 

 

ACL GENPASS

可以使用該命令來生成 Redis 密碼

該命令默認創建一個 256 bit 32 字節的偽隨機字符串,並將其轉換為 64 字節的字母+數字的字符串。如有有參數,則使用指定的位數長度

 

 

127.0.0.1:6379> ACL GENPASS

"e2ceb52e866908c2706e521b7d145eb78ec4b5806ef1fd0bcb4482687d2c82f7"

 

127.0.0.1:6379> ACL GENPASS 32

"fbcc163c"

 

127.0.0.1:6379> ACL GENPASS 64

"3ab469e7c659c19a"

 

 

ACL LOG

查看安全事件日志

 

該命令記錄如下 ACL 安全事件

 

無法通過 AUTH 身份驗證的

違背當前 ACL 規則,執行命令被拒絕

訪問當前 ACL 規則中不允許的鍵,被拒絕訪問

127.0.0.1:6379> ACL LOG

1)  1) "count"

    2) (integer) 1

    3) "reason"

    4) "auth"

    5) "context"

    6) "toplevel"

    7) "object"

    8) "AUTH"

    9) "username"

   10) "gcp"

   11) "age-seconds"

   12) "3076.3829999999998"

   13) "client-info"

   14) "id=4 addr=127.0.0.1:53462 fd=7 name= age=12138 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=40 qbuf-free=32728 obl=0 oll=0 omem=0 events=r cmd=auth user=default"

 

 使用 RESET 命令清空 LOG

 

127.0.0.1:6379> ACL LOG RESET

OK

 

 

127.0.0.1:6379> ACL LOG

(empty array)

 

 

ACL HELP

ACL 命令幫助

 

127.0.0.1:6379> ACL HELP

 1) ACL <subcommand> arg arg ... arg. Subcommands are:

 2) LOAD                             -- Reload users from the ACL file.

 3) SAVE                             -- Save the current config to the ACL file.

 4) LIST                             -- Show user details in config file format.

 5) USERS                            -- List all the registered usernames.

 6) SETUSER <username> [attribs ...] -- Create or modify a user.

 7) GETUSER <username>               -- Get the user details.

 8) DELUSER <username> [...]         -- Delete a list of users.

 9) CAT                              -- List available categories.

10) CAT <category>                   -- List commands inside category.

11) GENPASS [<bits>]                 -- Generate a secure user password.

12) WHOAMI                           -- Return the current connection username.

13) LOG [<count> | RESET]            -- Show the ACL log entries.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM