分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
先確保本機已經安裝 Redis ,並且版本要 6.0 以上
※ ACL 在 Redis 6.0 以上才支援
通常安裝完 Redis 後,進行連線不需要帳號密碼即可登入,如下,開啟連線只輸入 Host :
可以正常連線到 Redis Server
※沒有加密在內部網路使用不影響,對 Redis 若要對外開放會有安全性風險。
為了配置密碼,先將 Redis 停止
開啟以下檔案 redis.windows.conf,並且可以發現 requirepass 預設被註解
# requirepass foobared
※檔案可能版本不同,有可能會是 redis.conf
將 requirepass 註解 # 移除,並且 foobared 是密碼
requirepass foobared
為了啟用密碼,還需把保護機制關閉,預設是 yes ,改成 no,關閉。
※啟用的狀況下,即使配置密碼,用 127.0.0.1 連線也會視為安全的,直接連線,因此要關閉。
protected-mode no
預設值:
改成以下:
完成後啟用 Redis 服務
這時用 Redis 工具連線,會發現驗證失敗,無法直接連線
輸入剛剛配置的密碼 foobared
可以使用加密的方式連到 Redis 了
開啟 Windows 命令提式字元,並且輸入以下指令進入 Windows:
redis-cli -a foobared
然後輸入以下指令,查看 ACL 資料,可以得到當前只有預設值
ACL LIST
關於預設值,我們可以拆解說明:
"user default on sanitize-payload #1b58ee375b42e41f0e48ef2ff27d10a5b1f6924a9acdcdba7cae868e7adce6bf ~* &* +@all"
user default | : | default 是 Redis 的預設使用者名稱 |
on | : | 表明該使用者已啟用(on) |
sanitize-payload | : | 增強安全性的選項,幫助保護 Redis 伺服器不受潛在的命令注入攻擊或敏感數據洩露的影響。 |
#1b58ee37……略 | : | 這是使用者的密碼雜湊值。實際的密碼在系統中存儲為哈希值,以防止直接暴露。 |
~* | : | 可以訪問的鍵模式的符號。~* 表示這個使用者可以訪問所有鍵。 |
&* | : | 指定這個使用者可以訪問的 Pub/Sub 頻道模式。 &* 表示可以訪問所有頻道。 |
+@all | : | 指定允許執行的命令。@all 是一個命令集合,代表所有命令。 |
※ Default 權限就是 Administrator (管理員)
我們輸入以下指令,只開放讀取權限 +@read 並且開啟 on
帳號 | : | readonly |
密碼 | : | readonlypassword |
ACL SETUSER readonly on >readonlypassword ~* &* +@read
開啟工具進行連線,並起輸入帳號密碼
出現以下錯誤,沒有 Info 權限
會出現這個錯誤是因為此 Redis 工具 Another Redis Desktop Manager 連線成功時會先進行系統資訊的查詢 (Info)
為了此工具可以訪問,我們添加 ACL 以下權限
ACL SETUSER readonly +INFO
ACL SETUSER readonly +SCAN
ACL SETUSER readonly +SELECT
再次連線,可以發現 Another Redis Desktop Manager 沒有報錯,正常連線
選擇 New Key -> 隨便亂填
可以發現無法添加,完成了 ACL 成員只可以讀 Redis ,無法更新 Redis 的值,完成帳戶權限的控制。
如果想要更詳細的配置可參考 Redis 官方的 ACL文件
當重啟 Redis 後,並且查看 ACL 資料,會發現剛剛配置的資料被移除了
因為 Redis 在默認情況下不會自動保存 ACL(訪問控制列表)的設置到磁碟中,需要我們配置。
ACL LIST
持久化的第一步是手動添加 redis.acl 檔案(空白文字檔案,副檔名.acl)
redis.acl
找到對應的 aclfile 的配置進行指向 ./ 表示此 Redis 執行檔案的目錄下
aclfile "./redis.acl"
再此啟動 Redis 後,進入 Redis-cli 添加帳號
ACL SETUSER testaccount on >1@#$=-09 ~* &* +@all
可以發現添加的 ACL 帳戶,會記錄於 redis.acl
完成了持久化的 ACL 帳戶,未來 Redis 重啟時 ACL 都會保存
範例檔案:連結,開啟後我們有以下 Json 配置:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"RedisDb": "127.0.0.1:6379,abortConnect=false,user=testaccount,password=1@#$=-09,defaultDatabase=0"
}
}
如果在開啟 ACL 的情況下使用以下配置,會是 接傳遞連接字串 。
適合基本的連接需求,當你的連接設定僅限於主機和端口等基本信息時,這種方法是足夠的。
// 注入Redis連接字符串
var redisConnectionString = builder.Configuration.GetSection("ConnectionStrings:RedisDb").Value;
builder.Services.AddSingleton<IConnectionMultiplexer>(provider =>
{
return ConnectionMultiplexer.Connect(redisConnectionString);
});
並且執行後可能會出現以下錯誤訊息:
如果在開啟 ACL 的情況下,正確應使用以下配置,會是 適用於更多的 Redis 配置選項 。
// 注入Redis連接字符串
var redisConnectionString = builder.Configuration.GetSection("ConnectionStrings:RedisDb").Value;
builder.Services.AddSingleton<IConnectionMultiplexer>(provider =>
{
return ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(redisConnectionString));
});
用於 ACL 多種配置的連線字串,才能順利轉換連線字串執並執行: