redis 安全漏洞防禦
阿新 • • 發佈:2021-02-13
技術標籤:Javaredisjavaredisredis安全
redis 安全漏洞防禦
一、埠安全(限制客戶端ip以及修改密碼)
- 置redis密碼
找到requirepass,設定新的密碼 - 將 redis 啟動在 127.0.0.1 上
一般建議方案是將 redis 啟動在 127.0.0.1 上
但是這種方式不能跨伺服器訪問,一般方式是將 Redis 放到內網,防止公網檢測。如果服務部署在公有云上,需要對 Redis 伺服器設定防火牆
redis設定防火牆本人還需要再找一些其它的資料 - 同時可以修改埠號:可修改也可不修改
二、指令安全
使用者建立連線後可能執行 flushdb 之類的指令清空 Redis 記憶體資料庫,雖然已經通過配置 bind 或者 requirepass 配置項阻斷了惡意使用者與線上 Redis 服務建立連線的可能,但是如果是自己不小心在線上 Redis 中執行了 flushdb 指令呢,這個是有可能出現的,就像 MySQL 中的誤刪除一樣。 - 指令重新命名
rename flushdb flush_this_db
rename flushall flush_all_dbs
- 如果你覺得這些命令實在不安全,還可以通過如下方式將其徹底禁用:
rename flushdb ""
rename flushall ""
也可以在配置檔案中新增如下語句
三、 記憶體使用與寫入頻率限制
- 記憶體限制和淘汰策略
先在 Redis 服務端配置檔案 redis.conf 中通過 maxmemory 配置項配置 Redis 可用的伺服器記憶體上限
# maxmemory <bytes>
這個配置項預設是註釋起來的,說明沒有做限制,隨著 Redis 佔用記憶體的飆升最終會導致伺服器記憶體耗盡,進而導致部署在這臺機器的其他服務,比如資料庫、Web 應用等不可用。一般而言,如果這臺機器只部署了 Redis 服務,可將其配置為系統記憶體總量的 80%,否則的話根據其他服務佔用記憶體的情況酌情進行分配即可。
假如我們的機器只用來部署一個 Redis 例項,那麼大概留個 1 GB 的記憶體資源來支撐系統本身的執行即可。
但是如果我們部署多個 Redis 例項,或者還要部署其他系統,那麼就要好好計算一翻了;如果設定的最大可用記憶體過大了,就會導致 Redis 例項因為記憶體不足而崩潰了。
2. 配置maxmemory-policy
置了 maxmemory 後,一般還要配置 maxmemory-policy 配置項,用於設定 Redis 記憶體使用量到達上限後的記憶體清理策略,目前支援以下策略選項
- noeviction:當 Redis 可用記憶體不足以存放新寫入資料時,新寫入操作會報錯;
- allkeys-lru:當 Redis 可用記憶體不足以存放新寫入資料時,移除最近最少使用的 key;
- allkeys-random:當 Redis 可用記憶體不足以存放新寫入資料時,隨機移除某個 key;
- volatile-lru:當 Redis 可用記憶體不足以存放新寫入資料時,在設定了過期時間的 key 中,移除最近最少使用的 key;
- volatile-random:當 Redis 可用記憶體不足以存放新寫入資料時,在設定了過期時間的 key 中,隨機移除某個 key;
- volatile-ttl:當 Redis 可用記憶體不足以存放新寫入資料時,在設定了過期時間的 key 中,優先移除即將要過期的 key。
通常,我們會選擇基於 LRU 淘汰演算法的記憶體清理策略,比如 allkeys-lru,關於 Redis LRU 淘汰演算法,後面在 Redis 底層原理篇我會詳細介紹。