首頁 > 軟體

Redis資料庫安全詳解

2022-11-13 14:01:22

前言

本篇文章基於的Redis 的環境為: redis_version:7.0.5

檔案內容均為學習Redis 官方檔案心得.

Redis相信大家都或多或少都聽說過吧,作為記憶體資料庫的代表, 但是近些年Redis 被攻擊的典範也是越來越多,我們將如何防護Redis 安全呢? 跟著我們的指令碼,來看看這篇文章吧.

對於Redis而言,我們設定的方法大概有以下幾種

  • 通過redis.conf 設定。
  • 在已經啟動的Redis 中使用CONFIG SET 來設定。

如之前所述,安全方面歸根結底,總結一句話就是:最好的安全設定就是最小化許可權。

那我們來看下,Redis 有哪些安全設定呢?

開放最小化很重要

作為Redis 伺服器而言, 應該僅允許受信任的使用者端存取,其他存取都應該拒絕,因此也善用防火牆相當重要,當然這個防火牆不是在Redis 是做不了的,應該在Redis 所屬的機器進行設定。

若該Redis 是自建於本地實體機中,那麼應該考慮防火牆軟體,例如: iptablesfirewalld 等。若是存在於各雲廠商範例中(ECS ),那麼應該善用雲廠商提供的防火牆。

那我們Redis 在這一步就什麼也不能做了麼? 不是的,在Redis 設定中,有一個設定引數為bind ,該引數選項是將Redis對相應的網路卡監聽,若設定如下:

bind 127.0.0.1

則監聽在原生的迴環地址上,若該值為空,則監聽所有的網路卡(3.2版本提供的功能)。

若想監聽在多個網路卡上的話,ip 地址直接可以使用空格分開即可,例如:

bind 127.0.0.1 10.0.2.15

則該設定則是監聽到127.0.0.1 以及 10.0.2.15 網路卡上。

在已經啟動的Redis 中,想檢視Redis 監聽到哪些網路卡上,除了檢視所屬機器的網路狀態外,還可以通過CONFIG GET bind 來獲取。

除此之外,Redis還為我們提供了"保護模式",即設定: protected-mode ,預設為yes 。請不要關閉它,因為它能夠檢測到啟動後的Redis 是否安全,其檢測策略為:當Redis 沒有設定密碼的時候,從外部進行存取,這就會觸發它的保護模式,即向存取使用者提示資訊:

Redis is running in protected mode because protected mode is enabled and no password is set for the default user.

當然網上很多部落格提供的最快解決如上問題的方法是關閉其保護模式,請不要這麼做.

認證不可少

接上一段落,若Redis 想從外部進行存取,除了關閉保護模式以外,還可以設定Redis 密碼. 在Redis 中,通過設定requirepass 來設定密碼,不過設定密碼應當注意一下,Redis 密碼不應該設定為若密碼,建議設定為複雜密碼.

原因如下:

  • 使用者端在校驗身份的時候,使用的是auth 命令,可以理解為是Redis 的普通命令,即能夠被無限執行,換言之有被爆破的可能.
  • redis-cli可以通過載入使用者端的redis.conf 檔案來校驗伺服器, 不需要管理員記住密碼.

如上所屬,使用者端在校驗身份的時候,傳送的是auth 命令,該命令可以理解為Redis 的普通命令,是沒有被加密的, 若請求報文被監聽了,也有洩密的可能. 所以儘可能的使用加密進行通訊,即: SSL/TLS.

防止管理員誤操作也很重要

Redis中有一些非常危險的命令,例如: FLUSHALL ,FLUSHDB ,該命令前者是清空所有的資料,後則是清空當前庫的資料, 在日常工作中,如果誤操作了,那後果不堪設想. 還有一些命令,執行後可能會導致系統阻塞,非常不建議使用,例如:KEYS ,HGETALL等.

基於上述情況,禁用某些命令來保證系統安全是非常有必要的, 好在Redis給我們提供了方法. 若想禁用某些命令,可以在其伺服器redis.conf 組態檔中,使用rename-command 指令,例如:

rename-command FLUSHALL ""
rename-command FLUSHDB ""

若設定為空的話,則是禁止使用命令.修改設定,啟動伺服器後,若再使用這些命令,即會報錯: ERR unknown command .

若並非想禁用命令,而是想重新命名命令,那麼將空字串修改為重新命名後的命令即可,例如:

rename-command KEYS FINDALL

設定後,即可使用FINDALL 來代替KEYS , 案例如下:

127.0.0.1:6379> set juejinNmae pdudo
OK
127.0.0.1:6379> FINDALL *
1) "juejinNmae"
127.0.0.1:6379> 

擔心網路被監聽? 開啟TLS之旅吧

開啟ssl/tls 後勢必會降低Redis 的吞吐量,所以是否採用該設定主要還是看業務情況,若業務想要避免被抓包等,適合開啟該設定,若僅在某一內網使用,那就沒必要的.

Redis 6.0 以後啟用了SSL/TLS ,但是注意, 若想使用SSL/TLS 的話,在編譯的時候需要指定make BUILD_TLS=yes , 這裡需要注意的是, 使用者端和伺服器都需要編譯才行.

這裡簡單舉個例子如何啟動Redis吧.

證書生成

openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

資料庫啟動

redis-server --tls-port 6379 --port 0  --tls-cert-file ca.crt --tls-key-file ca.key  --tls-ca-cert-file ca.crt

使用者端連線

redis-cli --tls --cert ca.crt --key ca.key  --cacert ca.crt

在使用SSL/TLS 後,我們需要禁用非TLS 埠並且開啟SSL/TLS 埠後,可以直接設定:

port 0
tls-port 6379

這樣的話,通過6379 連線,預設情況下是走的SSL/TLS

總結

安全一直是大家比較關心的話題,在Redis 中,我們不僅僅要防外部入侵, 還要知道, 技術人員的誤操作也許破壞的更為嚴重, 始終需要記住, 許可權最小化.不僅對外,也需要對內.

以上就是Redis資料庫安全詳解的詳細內容,更多關於Redis資料庫安全的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com