Redis 6.0 新特性 ACL 介紹

Redis 6.0 新特性 ACL 介紹

Intro

在 Redis 6.0 中引入了 ACL(Access Control List) 的支持捣域,在此前的版本中 Redis 中是沒有用戶的概念的所宰,其實(shí)沒有辦法很好的控制權(quán)限,redis 6.0 開始支持用戶厘熟,可以給每個(gè)用戶分配不同的權(quán)限來控制權(quán)限。

下面我們就來介紹一下 Redis 6.0 中的 ACL 吧,下面的示例可以通過 docker 運(yùn)行了一個(gè) redis-6.0 的容器來實(shí)驗(yàn)的

運(yùn)行一個(gè) redis 6.0 的 docker 容器

因?yàn)槲冶镜匾呀?jīng)裝了一個(gè) redis屎媳,6379 端口已經(jīng)被禁用了夺溢,所以使用了 16379 端口

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

創(chuàng)建成功之后就可以使用 redis-cli 連上去了

image

我是直接用的本地的 redis-cli,如果本地沒有也可以使用 docker 容器內(nèi)部的 redis-cli烛谊,

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

AUTH

在 redis 的之前版本中是有一個(gè) “AUTH” 命令风响,但是之前的版本只是支持一個(gè) Password,是沒有用戶的概念的丹禀,這就導(dǎo)致所有的客戶端相當(dāng)于是使用同一個(gè)賬戶來操作 redis 的状勤,redis 6.0 擴(kuò)展了 AUTH 的語法:

AUTH <username> <password>

同時(shí)也兼容了舊版本的 AUTH

AUTH <password>

使用這種方式時(shí),也就是只提供密碼双泪,相當(dāng)于使用了一個(gè)默認(rèn)的用戶 “default”持搜,通過這樣的方式,實(shí)現(xiàn)了對(duì)低版本的兼容

ACL

ACL 使用場(chǎng)景

在使用 ACL 之前焙矛,您可能會(huì)問自己葫盼,這個(gè)功能主要用來干嘛,它能幫我實(shí)現(xiàn)什么村斟,ACL 可以幫助你實(shí)現(xiàn)下面兩個(gè)主要目標(biāo):

  • 通過限制對(duì)命令和密鑰的訪問來提高安全性贫导,以使不受信任的客戶端無法訪問,而受信任的客戶端僅具有對(duì)數(shù)據(jù)庫的最低訪問級(jí)別才能執(zhí)行所需的工作蟆盹。例如孩灯,某些客戶端可能僅能夠執(zhí)行只讀命令,
  • 提高操作安全性逾滥,以防止由于軟件錯(cuò)誤或人為錯(cuò)誤而導(dǎo)致進(jìn)程或人員訪問 Redis峰档,從而損壞數(shù)據(jù)或配置。例如匣距,沒有必要讓工作人員從 Redis 調(diào)用 FLUSHALL 命令面哥。

ACL 的另一種典型用法與托管Redis實(shí)例有關(guān)。Redis通常由管理內(nèi)部Redis基礎(chǔ)結(jié)構(gòu)的內(nèi)部公司團(tuán)隊(duì)為其所擁有的其他內(nèi)部客戶提供的一項(xiàng)托管服務(wù)毅待,或者由云提供商在軟件即服務(wù)設(shè)置中提供尚卫。
在這兩種設(shè)置中,我們都希望確保為客戶排除配置命令尸红。過去吱涉,通過命令重命名來完成此操作的方法是一種技巧,它使我們可以長時(shí)間不用 ACL 生存外里,但使用體驗(yàn)并不理想怎爵。

通過 ACL 命令來配置 ACL 規(guī)則

ACL是使用 DSL(domain specific language)定義的慌植,該 DSL 描述了給定用戶能夠執(zhí)行的操作吧兔。此類規(guī)則始終從左到右從第一個(gè)到最后一個(gè)實(shí)施,因?yàn)橛袝r(shí)規(guī)則的順序?qū)τ诶斫庥脩舻膶?shí)際能力很重要官扣。

默認(rèn)情況下,有一個(gè)用戶定義芙委,稱為default逞敷。

我們可以使用 ACL LIST 命令來檢查當(dāng)前啟用的 ACL 規(guī)則

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

參數(shù)說明:

參 數(shù) 說明
user 用戶
default 表示默認(rèn)用戶名,或則自己定義的用戶名
on 表示是否啟用該用戶灌侣,默認(rèn)為off(禁用)
#... 表示用戶密碼推捐,nopass表示不需要密碼
~* 表示可以訪問的Key(正則匹配)
+@ 表示用戶的權(quán)限,“+”表示授權(quán)權(quán)限侧啼,有權(quán)限操作或訪問牛柒,“-”表示還是沒有權(quán)限; @為權(quán)限分類痊乾,可以通過 ACL CAT 查詢支持的分類皮壁。+@all 表示所有權(quán)限,nocommands 表示不給與任何命令的操作權(quán)限

權(quán)限對(duì)key的類型和命令的類型進(jìn)行了分類哪审,如有對(duì)數(shù)據(jù)類型進(jìn)行分類:string闪彼、hash、list协饲、set、sortedset缴川,和對(duì)命令類型進(jìn)行分類:connection茉稠、admin、dangerous把夸。
執(zhí)行 ACL CAT 可以查看支持的權(quán)限分類列表

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" 

配置用戶權(quán)限

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

  • 使用 ACL 命令及其 ACL SETUSER 子命令而线。
  • 修改服務(wù)器配置(可以在其中定義用戶)并重新啟動(dòng)服務(wù)器,或者如果我們使用的是外部 ACL 文件恋日,則只需發(fā)出 ACL LOAD 即可膀篮。
+<command>:將命令添加到用戶可以調(diào)用的命令列表中,如+@hash
-<command>: 將命令從用戶可以調(diào)用的命令列表中移除
+@<category>: 添加一類命令岂膳,如:@admin, @set, @hash ... 可以`ACL CAT` 查看具體的操作指令誓竿。特殊類別@all表示所有命令,包括當(dāng)前在服務(wù)器中存在的命令谈截,以及將來將通過模塊加載的命令
-@<category>: 類似+@<category>筷屡,從客戶端可以調(diào)用的命令列表中刪除命令
+<command>|subcommand: 允許否則禁用特定子命令。注意簸喂,這種形式不允許像-DEBUG | SEGFAULT那樣毙死,而只能以“ +”開頭
allcommands:+@all的別名,允許所有命令操作執(zhí)行喻鳄。注意扼倘,這意味著可以執(zhí)行將來通過模塊系統(tǒng)加載的所有命令。
nocommands:-@all的別名除呵,不允許所有命令操作執(zhí)行再菊。

使用 ACL SETUSER 命令

首先爪喘,讓我們嘗試最簡單的 ACL SETUSER 命令調(diào)用:

> ACL SETUSER alice
OK

在上面的示例中,我根本沒有指定任何規(guī)則袄简。如果用戶不存在腥放,這將使用just created的默認(rèn)屬性來創(chuàng)建用戶。如果用戶已經(jīng)存在绿语,則上面的命令將不執(zhí)行任何操作秃症。

讓我們檢查一下默認(rèn)的用戶狀態(tài):

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

剛創(chuàng)建的用戶“ alice”為:

處于關(guān)閉狀態(tài),即已禁用吕粹。 AUTH 將不起作用种柑。
無法訪問任何命令。請(qǐng)注意匹耕,默認(rèn)情況下聚请,該用戶是默認(rèn)創(chuàng)建的,無法訪問任何命令稳其,因此-@all可以忽略上面輸出中的驶赏,但是 ACL LIST 嘗試是顯式的,而不是隱式的既鞠。
最后煤傍,沒有用戶可以訪問的密鑰模式。
用戶也沒有設(shè)置密碼嘱蛋。

這樣的用戶是完全無用的蚯姆。讓我們嘗試定義用戶,使其處于活動(dòng)狀態(tài)洒敏,具有密碼龄恋,并且僅可以使用GET命令訪問以字符串“ cached:”開頭的鍵名稱。

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

現(xiàn)在凶伙,用戶可以執(zhí)行某些操作郭毕,但是會(huì)拒絕執(zhí)行其他沒有權(quán)限的操作:

> 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

事情按預(yù)期進(jìn)行。為了檢查用戶alice的配置(請(qǐng)記住用戶名區(qū)分大小寫)函荣,可以使用 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铣卡,則輸出的可讀性可能更高,因此將其作為地圖回復(fù)返回:

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

多次調(diào)用ACL SETUSER會(huì)發(fā)生什么

了解多次調(diào)用 ACL SETUSER 會(huì)發(fā)生什么非常重要偏竟。重要的是要知道煮落,每個(gè)SETUSER調(diào)用都不會(huì)重置用戶,而只會(huì)將ACL規(guī)則應(yīng)用于現(xiàn)有用戶踊谋。
僅在之前不知道的情況下才重置用戶:
在這種情況下蝉仇,將使用歸零的ACL創(chuàng)建一個(gè)全新的用戶,即該用戶無法執(zhí)行任何操作,被禁用轿衔,沒有密碼等等:為了安全起見沉迹,最佳默認(rèn)值。

但是害驹,以后的調(diào)用只會(huì)逐步修改用戶鞭呕,因此例如以下調(diào)用順序?qū)?dǎo)致 myuser 能夠同時(shí)調(diào)用 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 文件

有兩種方法可以將用戶存儲(chǔ)在Redis配置中,一種是 redis.conf 中配置宛官,一種是使用一個(gè)獨(dú)立的外部 acl 文件葫松,這兩種方式不兼容,只能選擇一種方式
通常外部文件的方式更靈活底洗,推薦使用腋么。

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

配置內(nèi)容如下:

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

來看一個(gè)示例:

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

當(dāng)您要使用外部ACL文件時(shí)亥揖,需要指定名為的配置指令 aclfile珊擂,如下所示:

aclfile /etc/redis/users.acl

當(dāng)僅在redis.conf 文件內(nèi)部直接指定幾個(gè)用戶時(shí),可以使用CONFIG REWRITE以便通過重寫將新的用戶配置存儲(chǔ)在文件中费变。

但是摧扇,外部ACL文件功能更強(qiáng)大。您可以執(zhí)行以下操作:

  • 使用 ACL LOAD 重新加載外部 ACL 文件挚歧,通常在你手動(dòng)修改了這個(gè)文件扳剿,希望 redis 重新加載的時(shí)候使用,需要注意的是要確保 acl 文件內(nèi)容的正確性
  • 使用 ACL SAVE 將當(dāng)前 ACL 配置保存到一個(gè)外部文件

More

redis 6.0 的 ACL 特性為我們帶來了更好的權(quán)限控制方案昼激,安全性更好,有需要的快來體驗(yàn)一下吧

Reference

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锡搜,一起剝皮案震驚了整個(gè)濱河市橙困,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耕餐,老刑警劉巖凡傅,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肠缔,居然都是意外死亡夏跷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門明未,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽华,“玉大人,你說我怎么就攤上這事趟妥∶ㄌ” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亲雪。 經(jīng)常有香客問我勇凭,道長,這世上最難降的妖魔是什么义辕? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任虾标,我火速辦了婚禮,結(jié)果婚禮上灌砖,老公的妹妹穿的比我還像新娘璧函。我一直安慰自己,他們只是感情好周崭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布柳譬。 她就那樣靜靜地躺著,像睡著了一般续镇。 火紅的嫁衣襯著肌膚如雪美澳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天摸航,我揣著相機(jī)與錄音制跟,去河邊找鬼。 笑死酱虎,一個(gè)胖子當(dāng)著我的面吹牛雨膨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播读串,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聊记,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了恢暖?” 一聲冷哼從身側(cè)響起排监,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杰捂,沒想到半個(gè)月后舆床,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫁佳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年挨队,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒿往。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盛垦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓤漏,到底是詐尸還是另有隱情情臭,我是刑警寧澤省撑,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站俯在,受9級(jí)特大地震影響竟秫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跷乐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一肥败、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愕提,春花似錦馒稍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至如输,卻和暖如春鼓黔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背不见。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工澳化, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稳吮。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓缎谷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灶似。 傳聞我的和親對(duì)象是個(gè)殘疾皇子列林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354