首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0074. Redis 配置帳號密碼連線方式(ACL驗證) & Asp.net Core 上連線 Redis 正確的配置方式

日期:2024年 10月 05日

標籤: Redis Asp.net Core Web MVC Web Docker ACL Ubuntu

摘要:C# 學習筆記


應用所需:1. 已架設好 Redis 主機(本篇範例 7.4.0)
     2. Visual Studio 2022 Asp.net Core
範例檔案:本篇範例代碼
相關參考:0001. Ubuntu 上安裝 Docker 與各個容器、Asp.net Core網站
     0066. SignalR 橫向擴展部署 Server - Redis Backplane 解決方案
     Redis For Windows 下載頁面
解決問題:Redis 安裝後預設開放直接存取,本篇解決設定密碼與更進階的 ACL (Access Control List 存取控制列表)的配置方式,增加 Redis 存取安全性。
基本介紹:本篇分為四大部分。
第一部分:如何配置 Redis 密碼 驗證
第二部分:如何配置 Redis ACL 驗證
第三部分:持久化 Redis ACL 驗證
第四部分:.Net Core 正確連線 Redis






第一部分:如何配置 Redis 密碼 驗證

Step 1:Redis 已啟動

先確保本機已經安裝 Redis ,並且版本要 6.0 以上
※ ACL 在 Redis 6.0 以上才支援


Step 2:通常 Redis 連線

通常安裝完 Redis 後,進行連線不需要帳號密碼即可登入,如下,開啟連線只輸入 Host :


可以正常連線到 Redis Server
※沒有加密在內部網路使用不影響,對 Redis 若要對外開放會有安全性風險。


Step 3:配置 Redis 連線加密 - 停止服務

為了配置密碼,先將 Redis 停止


Step 4:配置 Redis 連線加密 - 啟用密碼

開啟以下檔案 redis.windows.conf,並且可以發現 requirepass 預設被註解

# requirepass foobared


※檔案可能版本不同,有可能會是 redis.conf


Step 5:配置 Redis 連線加密 - 啟用

requirepass 註解 # 移除,並且 foobared 是密碼

requirepass foobared




Step 6:配置 Redis 連線加密 - 關閉保護機制

為了啟用密碼,還需把保護機制關閉,預設是 yes ,改成 no,關閉。
※啟用的狀況下,即使配置密碼,用 127.0.0.1 連線也會視為安全的,直接連線,因此要關閉。

protected-mode no


預設值:


改成以下:


Step 8:配置 Redis 連線加密 - 啟用服務

完成後啟用 Redis 服務


Step 9:驗證 Redis 加密 - 無法直連

這時用 Redis 工具連線,會發現驗證失敗,無法直接連線


Step 10:驗證 Redis 加密 - 輸入密碼

輸入剛剛配置的密碼 foobared


Step 11:驗證 Redis 加密 - 成功

可以使用加密的方式連到 Redis 了


第二部分:如何配置 Redis ACL 驗證

Step 1:查看 ACL 當前資料

開啟 Windows 命令提式字元,並且輸入以下指令進入 Windows:

redis-cli -a foobared


然後輸入以下指令,查看 ACL 資料,可以得到當前只有預設值

ACL LIST



Step 2:ACL 欄位說明

關於預設值,我們可以拆解說明:

"user default on sanitize-payload #1b58ee375b42e41f0e48ef2ff27d10a5b1f6924a9acdcdba7cae868e7adce6bf ~* &* +@all"
user default default 是 Redis 的預設使用者名稱
on 表明該使用者已啟用(on)
sanitize-payload 增強安全性的選項,幫助保護 Redis 伺服器不受潛在的命令注入攻擊或敏感數據洩露的影響。
#1b58ee37……略 這是使用者的密碼雜湊值。實際的密碼在系統中存儲為哈希值,以防止直接暴露。
~* 可以訪問的鍵模式的符號。~* 表示這個使用者可以訪問所有鍵。
&* 指定這個使用者可以訪問的 Pub/Sub 頻道模式。 &* 表示可以訪問所有頻道。
+@all 指定允許執行的命令。@all 是一個命令集合,代表所有命令。


※ Default 權限就是 Administrator (管理員)

Step 3:添加 ACL 成員 - 只允許讀 Redis

我們輸入以下指令,只開放讀取權限 +@read 並且開啟 on

帳號 readonly
密碼 readonlypassword
ACL SETUSER readonly on >readonlypassword ~* &* +@read



Step 4:驗證 ACL - 工具連線

開啟工具進行連線,並起輸入帳號密碼

Step 5:驗證 ACL - 連線失敗

出現以下錯誤,沒有 Info 權限
會出現這個錯誤是因為此 Redis 工具 Another Redis Desktop Manager 連線成功時會先進行系統資訊的查詢 (Info)

Step 6:添加 ACL 成員權限

為了此工具可以訪問,我們添加 ACL 以下權限

ACL SETUSER readonly +INFO
ACL SETUSER readonly +SCAN
ACL SETUSER readonly +SELECT



Step 7:驗證 ACL - 再次連線

再次連線,可以發現 Another Redis Desktop Manager 沒有報錯,正常連線

Step 8:驗證 ACL - 驗證權限

選擇 New Key -> 隨便亂填

Step 9:驗證 ACL - 完成

可以發現無法添加,完成了 ACL 成員只可以讀 Redis ,無法更新 Redis 的值,完成帳戶權限的控制。
如果想要更詳細的配置可參考 Redis 官方的 ACL文件



第三部分:持久化 Redis ACL 驗證

Step 1:重啟 Redis

當重啟 Redis 後,並且查看 ACL 資料,會發現剛剛配置的資料被移除了
因為 Redis 在默認情況下不會自動保存 ACL(訪問控制列表)的設置到磁碟中,需要我們配置。

ACL LIST



Step 2:添加 ACL 檔案

持久化的第一步是手動添加 redis.acl 檔案(空白文字檔案,副檔名.acl)

redis.acl



Step 3:調整 ACL 配置

找到對應的 aclfile 的配置進行指向 ./ 表示此 Redis 執行檔案的目錄下

aclfile "./redis.acl"



Step 4:再次添加 ACL 帳號

再此啟動 Redis 後,進入 Redis-cli 添加帳號

ACL SETUSER testaccount on >1@#$=-09 ~* &* +@all



Step 5:檢查 redis.acl 檔案 - 完成

可以發現添加的 ACL 帳戶,會記錄於 redis.acl
完成了持久化的 ACL 帳戶,未來 Redis 重啟時 ACL 都會保存



第四部分:.Net Core 正確連線 Redis

Step 1:範例專案


範例檔案:連結,開啟後我們有以下 Json 配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "RedisDb": "127.0.0.1:6379,abortConnect=false,user=testaccount,password=1@#$=-09,defaultDatabase=0"
  }
}



Step 2:初始化配置 - 錯誤

如果在開啟 ACL 的情況下使用以下配置,會是 接傳遞連接字串
適合基本的連接需求,當你的連接設定僅限於主機和端口等基本信息時,這種方法是足夠的。

// 注入Redis連接字符串
var redisConnectionString = builder.Configuration.GetSection("ConnectionStrings:RedisDb").Value;
builder.Services.AddSingleton<IConnectionMultiplexer>(provider =>
{
    return ConnectionMultiplexer.Connect(redisConnectionString);
});


並且執行後可能會出現以下錯誤訊息:


Step 3:初始化配置 - 正確

如果在開啟 ACL 的情況下,正確應使用以下配置,會是 適用於更多的 Redis 配置選項

// 注入Redis連接字符串
var redisConnectionString = builder.Configuration.GetSection("ConnectionStrings:RedisDb").Value;
builder.Services.AddSingleton<IConnectionMultiplexer>(provider =>
{
    return ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(redisConnectionString));
});


用於 ACL 多種配置的連線字串,才能順利轉換連線字串執並執行: