網站首頁 編程語言 正文
前言
本篇文章基于的
Redis
的環境為:redis_version:7.0.5
文檔內容均為學習
Redis
官方文檔心得.
Redis
相信大家都或多或少都聽說過吧,作為內存數據庫的代表, 但是近些年Redis
被攻擊的典范也是越來越多,我們將如何防護Redis
安全呢? 跟著我們的腳本,來看看這篇文章吧.
對于Redis
而言,我們設置的方法大概有以下幾種
- 通過
redis.conf
設置。 - 在已經啟動的
Redis
中使用CONFIG SET
來設置。
如之前所述,安全方面歸根結底,總結一句話就是:最好的安全設置就是最小化權限。
那我們來看下,Redis
有哪些安全設置呢?
開放最小化很重要
作為Redis
服務器而言, 應該僅允許受信任的客戶端訪問,其他訪問都應該拒絕,因此也善用防火墻相當重要,當然這個防火墻不是在Redis
是做不了的,應該在Redis
所屬的機器進行設置。
若該Redis
是自建于本地實體機中,那么應該考慮防火墻軟件,例如: iptables
、firewalld
等。若是存在于各云廠商實例中(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
中,我們不僅僅要防外部入侵, 還要知道, 技術人員的誤操作也許破壞的更為嚴重, 始終需要記住, 權限最小化.不僅對外,也需要對內.
原文鏈接:https://juejin.cn/post/7164418309104861214
相關推薦
- 2022-02-26 C:\Users\用戶名\AppData\Roaming里面的文件可以刪除嗎?
- 2022-10-23 Android?Handler源碼深入探究_Android
- 2022-06-27 C#調用打印機實現打印_C#教程
- 2022-12-30 react?component?changing?uncontrolled?input報錯解決_Re
- 2022-09-10 ELK收集Tomcat日志的實現_Tomcat
- 2022-01-17 將字符串轉換成時間戳,yyyymmss到yyyy-mm-dd ,之后從時間戳轉換成時間格式字符串
- 2022-04-16 pycharm如何為函數插入文檔注釋_python
- 2022-06-29 Python中bytes和str的區別與聯系詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支