Redis 6.0 新特性 ACL 介紹

来源:https://www.cnblogs.com/weihanli/archive/2020/07/18/redis-acl-intro.html
-Advertisement-
Play Games

Redis 6.0 新特性 ACL 介紹 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是沒有用戶的概念的,其實沒有辦法很好的控制許可權,redis 6.0 開始支持用戶,可以給每個用戶分配不同的許可權來控制許可權。 ...


Redis 6.0 新特性 ACL 介紹

Intro

在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是沒有用戶的概念的,其實沒有辦法很好的控制許可權,redis 6.0 開始支持用戶,可以給每個用戶分配不同的許可權來控制許可權。

下麵我們就來介紹一下 Redis 6.0 中的 ACL 吧,下麵的示例可以通過 docker 運行了一個 redis-6.0 的容器來實驗的

運行一個 redis 6.0 的 docker 容器

因為我本地已經裝了一個 redis,6379 埠已經被禁用了,所以使用了 16379 埠

docker run -d --name=redis-server-6.0 -p 16379:6379 redis:6.0-alpine

創建成功之後就可以使用 redis-cli 連上去了

我是直接用的本地的 redis-cli,如果本地沒有也可以使用 docker 容器內部的 redis-cli,

docker exec -it redis-server-6.0 redis-cli

AUTH

在 redis 的之前版本中是有一個 “AUTH” 命令,但是之前的版本只是支持一個 Password,是沒有用戶的概念的,這就導致所有的客戶端相當於是使用同一個賬戶來操作 redis 的,redis 6.0 擴展了 AUTH 的語法:

AUTH <username> <password>

同時也相容了舊版本的 AUTH

AUTH <password>

使用這種方式時,也就是只提供密碼,相當於使用了一個預設的用戶 “default”,通過這樣的方式,實現了對低版本的相容

ACL

ACL 使用場景

在使用 ACL 之前,您可能會問自己,這個功能主要用來幹嘛,它能幫我實現什麼,ACL 可以幫助你實現下麵兩個主要目標:

  • 通過限制對命令和密鑰的訪問來提高安全性,以使不受信任的客戶端無法訪問,而受信任的客戶端僅具有對資料庫的最低訪問級別才能執行所需的工作。例如,某些客戶端可能僅能夠執行只讀命令,
  • 提高操作安全性,以防止由於軟體錯誤或人為錯誤而導致進程或人員訪問 Redis,從而損壞數據或配置。例如,沒有必要讓工作人員從 Redis 調用 FLUSHALL 命令。

ACL 的另一種典型用法與托管Redis實例有關。Redis通常由管理內部Redis基礎結構的內部公司團隊為其所擁有的其他內部客戶提供的一項托管服務,或者由雲提供商在軟體即服務設置中提供。
在這兩種設置中,我們都希望確保為客戶排除配置命令。過去,通過命令重命名來完成此操作的方法是一種技巧,它使我們可以長時間不用 ACL 生存,但使用體驗並不理想。

通過 ACL 命令來配置 ACL 規則

ACL是使用 DSL(domain specific language)定義的,該 DSL 描述了給定用戶能夠執行的操作。此類規則始終從左到右從第一個到最後一個實施,因為有時規則的順序對於理解用戶的實際能力很重要。

預設情況下,有一個用戶定義,稱為default。

我們可以使用 ACL LIST 命令來檢查當前啟用的 ACL 規則

127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* +@all"

參數說明:

參 數 說明
user 用戶
default 表示預設用戶名,或則自己定義的用戶名
on 表示是否啟用該用戶,預設為off(禁用)
#... 表示用戶密碼,nopass表示不需要密碼
~* 表示可以訪問的Key(正則匹配)
+@ 表示用戶的許可權,“+”表示授權許可權,有許可權操作或訪問,“-”表示還是沒有許可權; @為許可權分類,可以通過 ACL CAT 查詢支持的分類。+@all 表示所有許可權,nocommands 表示不給與任何命令的操作許可權

許可權對key的類型和命令的類型進行了分類,如有對數據類型進行分類:string、hash、list、set、sortedset,和對命令類型進行分類:connection、admin、dangerous。
執行 ACL CAT 可以查看支持的許可權分類列表

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"

-- 返回指定類別中的命令
> ACL CAT hash
 1) "hsetnx"
 2) "hset"
 3) "hlen"
 4) "hmget"
 5) "hincrbyfloat"
 6) "hgetall"
 7) "hvals"
 8) "hscan"
 9) "hkeys"
10) "hstrlen"
11) "hget"
12) "hdel"
13) "hexists"
14) "hincrby"
15) "hmset" 

配置用戶許可權

我們可以通過兩種主要方式創建和修改用戶:

  • 使用 ACL 命令及其 ACL SETUSER 子命令。
  • 修改伺服器配置(可以在其中定義用戶)並重新啟動伺服器,或者如果我們使用的是外部 ACL 文件,則只需發出 ACL LOAD 即可。
+<command>:將命令添加到用戶可以調用的命令列表中,如+@hash
-<command>: 將命令從用戶可以調用的命令列表中移除
+@<category>: 添加一類命令,如:@admin, @set, @hash ... 可以`ACL CAT` 查看具體的操作指令。特殊類別@all表示所有命令,包括當前在伺服器中存在的命令,以及將來將通過模塊載入的命令
-@<category>: 類似+@<category>,從客戶端可以調用的命令列表中刪除命令
+<command>|subcommand: 允許否則禁用特定子命令。註意,這種形式不允許像-DEBUG | SEGFAULT那樣,而只能以“ +”開頭
allcommands:+@all的別名,允許所有命令操作執行。註意,這意味著可以執行將來通過模塊系統載入的所有命令。
nocommands:-@all的別名,不允許所有命令操作執行。

使用 ACL SETUSER 命令

首先,讓我們嘗試最簡單的 ACL SETUSER 命令調用:

> ACL SETUSER alice
OK

在上面的示例中,我根本沒有指定任何規則。如果用戶不存在,這將使用just created的預設屬性來創建用戶。如果用戶已經存在,則上面的命令將不執行任何操作。

讓我們檢查一下預設的用戶狀態:

> ACL LIST
1) "user alice off -@all"
2) "user default on nopass ~* +@all"

剛創建的用戶“ alice”為:

處於關閉狀態,即已禁用。 AUTH 將不起作用。
無法訪問任何命令。請註意,預設情況下,該用戶是預設創建的,無法訪問任何命令,因此-@all可以忽略上面輸出中的,但是 ACL LIST 嘗試是顯式的,而不是隱式的。
最後,沒有用戶可以訪問的密鑰模式。
用戶也沒有設置密碼。

這樣的用戶是完全無用的。讓我們嘗試定義用戶,使其處於活動狀態,具有密碼,並且僅可以使用GET命令訪問以字元串“ cached:”開頭的鍵名稱。

> ACL SETUSER alice on >p1pp0 ~cached:* +get
OK

現在,用戶可以執行某些操作,但是會拒絕執行其他沒有許可權的操作:

> AUTH alice p1pp0
OK
> GET foo
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> GET cached:1234
(nil)
> SET cached:1234 zap
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

事情按預期進行。為了檢查用戶alice的配置(請記住用戶名區分大小寫),可以使用 ACL LIST的替代方法 ACL GETUSER

> ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "2d9c75..."
5) "commands"
6) "-@all +get"
7) "keys"
8) 1) "cached:*"

如果我們使用RESP3,則輸出的可讀性可能更高,因此將其作為地圖回覆返回:

> ACL GETUSER alice
1# "flags" => 1~ "on"
2# "passwords" => 1) "2d9c75..."
3# "commands" => "-@all +get"
4# "keys" => 1) "cached:*"

多次調用ACL SETUSER會發生什麼

瞭解多次調用 ACL SETUSER 會發生什麼非常重要。重要的是要知道,每個SETUSER調用都不會重置用戶,而只會將ACL規則應用於現有用戶。
僅在之前不知道的情況下才重置用戶:
在這種情況下,將使用歸零的ACL創建一個全新的用戶,即該用戶無法執行任何操作,被禁用,沒有密碼等等:為了安全起見,最佳預設值。

但是,以後的調用只會逐步修改用戶,因此例如以下調用順序將導致 myuser 能夠同時調用 GETSET

> ACL SETUSER myuser +set
OK
> ACL SETUSER myuser +get
OK

> ACL LIST
1) "user default on nopass ~* +@all"
2) "user myuser off -@all +set +get"

使用外部 ACL 文件

有兩種方法可以將用戶存儲在Redis配置中,一種是 redis.conf 中配置,一種是使用一個獨立的外部 acl 文件,這兩種方式不相容,只能選擇一種方式
通常外部文件的方式更靈活,推薦使用。

內部redis.conf和外部ACL文件中使用的格式是完全相同的,因此從一個切換到另一個很簡單

配置內容如下:

user <username> ... acl rules ...

來看一個示例:

user worker +@list +@connection ~jobs:* on >ffa9203c493aa99

當您要使用外部ACL文件時,需要指定名為的配置指令 aclfile,如下所示:

aclfile /etc/redis/users.acl

當僅在redis.conf 文件內部直接指定幾個用戶時,可以使用CONFIG REWRITE以便通過重寫將新的用戶配置存儲在文件中。

但是,外部ACL文件功能更強大。您可以執行以下操作:

  • 使用 ACL LOAD 重新載入外部 ACL 文件,通常在你手動修改了這個文件,希望 redis 重新載入的時候使用,需要註意的是要確保 acl 文件內容的正確性
  • 使用 ACL SAVE 將當前 ACL 配置保存到一個外部文件

More

redis 6.0 的 ACL 特性為我們帶來了更好的許可權控制方案,安全性更好,有需要的快來體驗一下吧

Reference


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引入 首先來看一個程式,分別列印4和-4的取反運算結果,代碼: public static void main(String[] args) { System.out.println(~4); System.out.println(~(-4));} 不妨思考一下結果,如果結果是-4和4的話,那請繼續 ...
  • 1、什麼是USB USB的全稱是Universal Serial Bus,通用串列匯流排。它的出現主要是為了簡化個人電腦與外圍設備的連接,增加易用性。USB支持熱插拔,並且是即插即用的,另外,它還具有很強的可擴展性,傳輸速度也很快,這些特性使支持USB介面的電子設備更易用、更大眾化。 本文將從USB ...
  • 一 動靜分離概述 1.1 動靜分離介紹 為了提高網站的響應速度,減輕程式伺服器(Tomcat,Jboss等)的負載,對於靜態資源,如圖片、js、css等文件,可以在反向代理伺服器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理伺服器就可以直接處理,而不用將請求轉發給後端伺服器。對於用戶請求的動態文件 ...
  • 通常tomcat作為應用伺服器,我們不建議也不應該讓tomcat直接面向客戶端提供服務;因此進入tomcat的訪問就只有其他反代伺服器的請求了;如果說tomcat使用其他反代伺服器對外提供服務,那麼對於https的訪問就應該由代理伺服器端來實現,從代理伺服器到tomcat的訪問,我們應該還是使用h... ...
  • 首先去mysql官網下載mysql的離線rpm安裝包(https://downloads.mysql.com/archives/community/) 上傳到/data/rpm/mysql8.0目錄下 因為Mysql依賴於mariadb,所以我們先用rpm -qa | grep mariadb 查找 ...
  • 路漫漫其修遠兮,吾將上下而求索,又到了周末,我繼續帶各位看官學習回顧Mysql知識。 上次說到了流程式控制制函數,那就從流程式控制制函數來繼續學習吧! #五.流程式控制制函數 #1.if函數:if else的效果 IF(條件表達式,成立返回1,不成立返回2) #與Java三元運算相同SELECT IF(10>5 ...
  • select * from T_A a (nolock) where a.xh not in (select xh from T_B) 方法1:效果甚微 select * from T_A a (nolock) where not exists (select xh from T_B where x ...
  • 本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 MySQL體繫結構 MySQL實例由一組後臺線程、一些記憶體塊和若幹服務線程組成。 後臺線程包括: 主線程:主要負責將臟緩存頁刷新到數據文件,執行purge操作,觸發檢查點,合併插入緩衝區等。 IO線程: in ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...