Redis 6.0 新特性 ACL 介绍
Redis 6.0 新特性 ACL 介紹
Intro
在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是沒(méi)有用戶的概念的,其實(shí)沒(méi)有辦法很好的控制權(quán)限,redis 6.0 開始支持用戶,可以給每個(gè)用戶分配不同的權(quán)限來(lái)控制權(quán)限。
下面我們就來(lái)介紹一下 Redis 6.0 中的 ACL 吧,下面的示例可以通過(guò) docker 運(yùn)行了一個(gè) redis-6.0 的容器來(lái)實(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 連上去了
我是直接用的本地的 redis-cli,如果本地沒(méi)有也可以使用 docker 容器內(nèi)部的 redis-cli,
docker?exec?-it?redis-server-6.0?redis-cliAUTH
在 redis 的之前版本中是有一個(gè) “AUTH” 命令,但是之前的版本只是支持一個(gè) Password,是沒(méi)有用戶的概念的,這就導(dǎo)致所有的客戶端相當(dāng)于是使用同一個(gè)賬戶來(lái)操作 redis 的,redis 6.0 擴(kuò)展了 AUTH 的語(yǔ)法:
AUTH?<username>?<password>同時(shí)也兼容了舊版本的 AUTH
AUTH?<password>使用這種方式時(shí),也就是只提供密碼,相當(dāng)于使用了一個(gè)默認(rèn)的用戶 “default”,通過(guò)這樣的方式,實(shí)現(xiàn)了對(duì)低版本的兼容
ACL
ACL 使用場(chǎng)景
在使用 ACL 之前,您可能會(huì)問(wèn)自己,這個(gè)功能主要用來(lái)干嘛,它能幫我實(shí)現(xiàn)什么,ACL 可以幫助你實(shí)現(xiàn)下面兩個(gè)主要目標(biāo):
通過(guò)限制對(duì)命令和密鑰的訪問(wèn)來(lái)提高安全性,以使不受信任的客戶端無(wú)法訪問(wèn),而受信任的客戶端僅具有對(duì)數(shù)據(jù)庫(kù)的最低訪問(wèn)級(jí)別才能執(zhí)行所需的工作。例如,某些客戶端可能僅能夠執(zhí)行只讀命令,
提高操作安全性,以防止由于軟件錯(cuò)誤或人為錯(cuò)誤而導(dǎo)致進(jìn)程或人員訪問(wèn) Redis,從而損壞數(shù)據(jù)或配置。例如,沒(méi)有必要讓工作人員從 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è)置中,我們都希望確保為客戶排除配置命令。過(guò)去,通過(guò)命令重命名來(lái)完成此操作的方法是一種技巧,它使我們可以長(zhǎng)時(shí)間不用 ACL 生存,但使用體驗(yàn)并不理想。
通過(guò) ACL 命令來(lái)配置 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 命令來(lái)檢查當(dāng)前啟用的 ACL 規(guī)則
127.0.0.1:6379>?ACL?LIST 1)?"user?default?on?nopass?~*?+@all"參數(shù)說(shuō)明:
| user | 用戶 |
| default | 表示默認(rèn)用戶名,或則自己定義的用戶名 |
| on | 表示是否啟用該用戶,默認(rèn)為off(禁用) |
| #... | 表示用戶密碼,nopass表示不需要密碼 |
| ~* | 表示可以訪問(wèn)的Key(正則匹配) |
| +@ | 表示用戶的權(quán)限,“+”表示授權(quán)權(quán)限,有權(quán)限操作或訪問(wèn),“-”表示還是沒(méi)有權(quán)限;@為權(quán)限分類,可以通過(guò) 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?CAT1)?"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?hash1)?"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)限
我們可以通過(guò)兩種主要方式創(chuàng)建和修改用戶:
使用 ACL 命令及其 ACL SETUSER 子命令。
修改服務(wù)器配置(可以在其中定義用戶)并重新啟動(dòng)服務(wù)器,或者如果我們使用的是外部 ACL 文件,則只需發(fā)出 ACL LOAD 即可。
使用 ACL SETUSER 命令
首先,讓我們嘗試最簡(jiǎn)單的 ACL SETUSER 命令調(diào)用:
>?ACL?SETUSER?alice OK在上面的示例中,我根本沒(méi)有指定任何規(guī)則。如果用戶不存在,這將使用just created的默認(rèn)屬性來(lái)創(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 將不起作用。無(wú)法訪問(wèn)任何命令。請(qǐng)注意,默認(rèn)情況下,該用戶是默認(rèn)創(chuàng)建的,無(wú)法訪問(wèn)任何命令,因此-@all可以忽略上面輸出中的,但是 ACL LIST 嘗試是顯式的,而不是隱式的。最后,沒(méi)有用戶可以訪問(wèn)的密鑰模式。用戶也沒(méi)有設(shè)置密碼。
這樣的用戶是完全無(wú)用的。讓我們嘗試定義用戶,使其處于活動(dòng)狀態(tài),具有密碼,并且僅可以使用GET命令訪問(wèn)以字符串“ cached:”開頭的鍵名稱。
>?ACL?SETUSER?alice?on?>p1pp0?~cached:*?+get OK現(xiàn)在,用戶可以執(zhí)行某些操作,但是會(huì)拒絕執(zhí)行其他沒(méi)有權(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è)全新的用戶,即該用戶無(wú)法執(zhí)行任何操作,被禁用,沒(méi)有密碼等等:為了安全起見,最佳默認(rèn)值。
但是,以后的調(diào)用只會(huì)逐步修改用戶,因此例如以下調(diào)用順序?qū)?dǎo)致 myuser 能夠同時(shí)調(diào)用 GET 和 SET:
>?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è)很簡(jiǎn)單
配置內(nèi)容如下:
user?<username>?...?acl?rules?...來(lái)看一個(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以便通過(guò)重寫將新的用戶配置存儲(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 特性為我們帶來(lái)了更好的權(quán)限控制方案,安全性更好,有需要的快來(lái)體驗(yàn)一下吧
Reference
https://redis.io/topics/acl
https://redis.io/commands/auth
https://www.cnblogs.com/zhoujinyi/p/13222464.html
總結(jié)
以上是生活随笔為你收集整理的Redis 6.0 新特性 ACL 介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Logging with Elastic
- 下一篇: 在 MySQL 中使用码农很忙 IP 地