1. 程式人生 > >Redis安全注意事項

Redis安全注意事項

本文簡要介紹 Redis 安全相關的話題, 包括: Redis訪問控制機制、Redis原始碼安全性, 外部輸入可能觸發的惡意攻擊, 以及其他相關問題。

如果要反饋安全問題, 請到 GitHub 上提出 issue, 當然, 如果需要私密通訊, 請使用文末提供的 GPG key。

Redis 總體安全模型

Redis 設想的執行環境, 是與受信客戶端在內網中進行通訊. 也就是說, Redis 例項不應該直接暴露到公網上, 也不應該讓不受信的客戶機直連到 Redis 的 TCP埠/或UNIX socket。

比如, 可以將 Redis 作為web系統的 database, cache, 或者 messaging system。 使用者只能與web進行互動, 由WEB應用來進行查詢或執行其他操作。

在這種情況下, web應用作為橋頭堡, 連線 Redis, 避免Redis與不受信任的客戶端(如瀏覽器)進行直接互動。

這只是一中特定場景, 但總體說來, 不受信任的客戶端與 Redis 之間, 必須有一層 ACL(訪問控制層)實現, 用於鑑權和校驗使用者輸入, 並決定是否對 Redis 例項執行操作。

總的來說, Redis 並沒有為安全問題做過多設計, 最主要的原因是為了保證高效能, 以及使用簡便。

網路安全問題

除了受信網路的客戶端, 其他客戶端發起的網路請求需要被攔截, 所以執行 Redis 服務的系統, 應該只允許使用 Redis 的那些應用程式直連。

如果使用的是 Linux虛擬機器(Linode, EC2, 等等), 因為這些機器可能直接暴露在公網上, 所以需要防火牆來保護 Redis 埠, 阻止外部訪問。而本地的客戶端則通過迴環地址(loopback, 127..

.*)來訪問Redis。

當然, 也可以將 Redis 埠直接繫結到本機的某塊網絡卡/IP上, 在 redis.conf 配置檔案中增加如下配置即可:

bind 127.0.0.1

假如不對外部訪問做隔離, 可能會帶來嚴重的安全隱患. 例如, 攻擊者只要執行一個 FLUSHALL 命令, 就能讓Redis的所有資料Over。

保護模式(Protected mode)

杯具的是, 很多 Redis 例項都沒有拒絕外部網路訪問。很多具有公網IP的例項就這樣暴露了. 基於這種情況, 從 Redis 3.2.0 版本開始, 如果使用預設配置(繫結到所有網絡卡), 並且沒有密碼驗證保護, 則會進入一種特殊的模式, 稱為 保護模式(Protected mode)

. 在保護模式下, Redis 只允許本地迴環地址訪問。 其他地址的客戶端在連線時, 會收到錯誤資訊, 其中描述了具體原因以及如何配置。

我們希望保護模式能有效降低 Redis 例項的安全問題, 當然, 系統管理員也可以禁用保護模式, 或者手動繫結到所有IP。

身份驗證功能

雖然 Redis 沒有實現訪問控制, 但也提供了一個小小的 身份驗證層(authorization layer), 通過 redis.conf 檔案來開啟。

如果啟用了 身份驗證, Redis 會拒絕所有未經身份驗證的客戶端請求。客戶端可以通過 AUTH 命令+密碼 的方式執行身份驗證。

因為密碼以明文的方式設定在 redis.conf 檔案中。所以密碼應該足夠長, 以防止暴力破解, 原因如下:

  • Redis 的查詢效率非常高。客戶端每秒可以執行很多次密碼驗證。
  • 密碼儲存在 redis.conf 中, 所以管理員不用記憶密碼, 需要的時候直接拷貝即可, 因此設定很長的密碼並沒有什麼影響。

身份驗證層的目的, 是提供可選的一個冗餘層. 如果防火牆失效, 或者未能有效保護 Redis, 只要外部人員不知道密碼, 依然不能訪問 Redis 例項。

和其他 Redis 命令一樣, AUTH 命令也是不進行加密傳輸的, 所以不能防止網路竊聽, 假若網路情況特別不安全的話。

資料加密支援

因為 Redis 不支援加密. 想要在網際網路/或不可信網路上實現加密傳輸, 就需要額外的保護層, 例如SSL代理。我們推薦使用 spiped

禁用特定命令

可以將某些 Redis 命令禁用, 或者重新命名, 這樣一般的客戶端就不能執行某些危險的命令了。

例如, 虛擬服務提供商, 可能會同時給客戶提供 Redis 例項管理服務. 這時候, 就不允許客戶自己呼叫 CONFIG 命令來修改例項配置, 但服務提供商自己應該能夠建立和銷燬這些例項。

這種情況下, 可以通過重新命名, 或者在命令表中隱藏這些命令。該特性可以通過 redis.conf 配置檔案指定. 如:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

此處將 CONFIG 命令重新命名為另一個非常複雜的名字. 當然, 也可以將命令重新命名為空串 "", 以禁用某些命令:

rename-command CONFIG ""

精心構造的外部輸入攻擊

即使黑客沒有密碼, 也可能攻擊到 Redis. 例如, 黑客有可能利用 Redis內部演算法和資料結構的漏洞, 最壞情況下, 甚至可以將資料插入到Redis庫中。

例如, 可以通過web表單, 將 hash 值取模之後相同的一大批字串提交到 hash table 中, 這樣就可能將時間複雜度為 O(1) 的雜湊操作, 降級為 O(N) 的最壞情況, 導致 CPU 資源耗盡, 形成拒絕服務攻擊(Denial of Service, Dos)。

為了防止這類攻擊, Redis 每次啟動, 都使用不同的偽隨機數種子(pseudo-random seed)來執行 hash 運算。

Redis 的 SORT 命令使用了 qsort 演算法. 目前為止, 該演算法不是隨機的, 如果攻擊者精心構造一組特定的輸入, 在最壞情況下, 可能會造成平方級的時間消耗。

字串轉義和NoSQL注入

Redis 協議中沒有字串轉義(escaping)的概念, 所以正常情況下, 不可能通過客戶端進行注入. Redis 協議使用的是 prefixed-length 的字串, 是二進位制安全的。

EVALEVALSHA 命令執行的Lua指令碼, 也遵循同樣的規則, 因此這些命令都是安全的。

但實際情況可能比較複雜, 應用程式應該避免將不受信任來源的字串, 當做Lua指令碼來執行。

程式碼安全

在一般的 Redis 配置中, 客戶端可以執行 command set 中的所有命令, 對例項的訪問不太可對 Redis 宿主機的行為造成影響。

Redis內部使用了各種著名的程式碼安全最佳實踐, 以阻止緩衝區溢位(buffer overflow), 格式錯誤(format bug), 或者其他記憶體洩露問題(memory corruption). 但是, 控制伺服器配置的 CONFIG 命令, 有可能修改伺服器的工作目錄(working dir), 以及 dump 檔案的名稱. 這就允許客戶端將 RDB Redis 檔案寫入任何路徑, 也就造成了 安全問題, 通過啟動 Redis 服務的賬戶許可權, 來執行某些操作, 以及某些危險的程式碼, 甚至有可能造成系統宕機(譯者注: 如佔滿某些目錄/磁碟空間等等)。

Redis 不應該使用 root 許可權來啟動。建議使用非特權的專有賬戶 redis. Redis 作者目前正在嘗試, 已決定是否有必要增加新的配置引數, 來阻止 CONFIG SET/GET dir 和類似的執行時配置命令. 這能有效阻止客戶端將伺服器的 dump 檔案寫到其他目錄。

GPG金鑰(GPG key)

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.13 (Darwin)

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
vI1sAEeV6ZM/uc4CDI3E2TxEbQ==

金鑰指紋(Key fingerprint)

pub   4096R/0E5C88D6 2013-11-07 [expires: 2063-10-26]
      Key fingerprint = E5F3 DA80 35F0 2EC1 47F9  020F 3181 3728 0E5C 88D6
      uid                  Salvatore Sanfilippo <[email protected]>
      sub   4096R/3B34D15F 2013-11-07 [expires: 2063-10-26]

翻譯日期: 2017年11月30日

相關推薦

Redis安全注意事項

本文簡要介紹 Redis 安全相關的話題, 包括: Redis訪問控制機制、Redis原始碼安全性, 外部輸入可能觸發的惡意攻擊, 以及其他相關問題。 如果要反饋安全問題, 請到 GitHub 上提出 issue, 當然, 如果需要私密通訊, 請使用文末提供

阿里雲 Linux(CentOS)中Redis配置注意事項

1,執行的Redis伺服器提示找不到該命令: 執行ln -s /root/redis-2.8.17/src/redis-server / usr / bin / redis-server,為redis-server建立軟連線,其中/root/redis-2.8.17/src/為我redis安裝目

java web專案安全注意事項

1.弱口令漏洞 解決方案:最好使用至少6位的數字、字母及特殊字元組合作為密碼。資料庫不要儲存明文密碼,應儲存MD5加密後的密文,由於目前普通的MD5加密已經可以被破解,最好可以多重MD5加密,或者多種加密方式疊加組合。 2.未使用使用者名稱及密碼登入後臺可直接輸入後臺URL

開發Microsoft Teams選項卡應用安全注意事項

我們都知道,為了方便廣大的開發人員快速開發Microsoft Teams選項卡應用,微軟提供了一個JS SDK,你可以通過這裡 https://docs.microsoft.com/en-us/javascript/api/overview/msteams-client?view=msteams-client

Python--Redis實戰:第四章:資料安全與效能保障:第8節:關於效能方面的注意事項

習慣了關係資料庫的使用者在剛開始使用Redis的時候,通常會因為Redis帶來的上百倍的效能提升而感到欣喜若狂,卻沒有認識到Redis效能實際上還可以進一步的提高。雖然上一節介紹的非事務型流水線可以儘可能地減少應用程式和Redis之間的通訊往返次數,但是對於一個已

Redis 設定 Key/value 的規則定義和注意事項(附工具類)

對於redis的儲存key/value鍵值對,經過多次踩坑之後,我們總結了一套規則;這篇文章主要講解定義key/value鍵值對時的定義規則和注意事項。 前面一篇文章講了如何定義Redis的客戶端和Dubbo整合儲存器;當我們真正開始開發的時候,就會突然發現,有點不知道如何去定義Redis的K

Redis設定Key/value的規則定義和注意事項(附工具類)

對於redis的儲存key/value鍵值對,經過多次踩坑之後,我們總結了一套規則;這篇文章主要講解定義key/value鍵值對時的定義規則和注意事項。 前面一篇文章講了如何定義Redis的客戶端和Dubbo整合儲存器;當我們真正開始開發的時候,就會突然發現,有點不知道如何去定義Redis的K

Web 安全開發注意事項

一、背景 最近開發公司的WEB專案,商密技術研究部領導推出了一套測試規範,規範中包括web端安全測試掃描,掃描結果不盡如人意,因此蒐集及整理如下web安全開發事項。 二、編碼安全策略 簡述:不要相信任何來自客戶端提交的資料,比如URL和引數,HTTP頭部、javascript或者其他嵌入程式碼提交的資料

FORM表單安全之使用隱藏域(type="hidden")的注意事項

最近我測試了一些帶有表單中帶有隱藏域的一些網站,發現一個比較普遍的BUG! 一、BUG表述 表單程式碼如下 <form id='' action='' method=''> <input type='text' name='' value=''

網頁安全漏洞注意事項

管理平臺的安全對一個系統來說很重要,為了防止黑客攻擊,需要注意一下問題: 1.訪問連結注入問題,此種問題的特點是,不法分子通過修改訪問連結達到某些目的,比如盜取使用者cookie. 解決辦法是:過濾訪問連結中的特殊字元,如果訪問連結中包含如下非法字元則阻止其訪問. ; 

使用Redis的五個注意事項(命名)

轉載:https://www.cnblogs.com/ajianbeyourself/p/4472788.html 閱讀目錄 1.使用key值字首來作名稱空間 2.建立一個類似 ”registry” 的key用於標記key使用情況 3.注意垃圾回收

Redis 4.0 叢集搭建完美方案及注意事項

一、部署Redis叢集環境準備1.準備6臺redis伺服器(預設配置)2.配置redis叢集1)在每臺redis伺服器做叢集配置然後重啟服務IP 規劃:redis 伺服器 ip 地址及埠規劃– redisA 192.168.4.51 6351    – redisB 192.

redis的pipeline機制解析與注意事項

redis的pipeline機制 主要的兩個底層函式: 1.redisvAppendCommand將命令拷貝到context的obuf裡 2.redisGetReply: 1)從reply佇列裡面返回最前面的reply,如果佇列為空,繼續後面的操作 2)如果發現obuf中

Redis之Pipeline使用注意事項

參考內容:http://www.redis.cn/topics/pipelining.html 重要說明: 使用管道傳送命令時,伺服器將被迫回覆一個佇列答覆,佔用很多記憶體。所以,如果你需要傳送大量的命令,最好是把他們按照合理數量分批次的處理,例如10K的命令,讀回覆

redis的使用注意事項和問題總結

redis單機版注意和問題: 1、redis使用命令列操作時,查詢結果中的中文會顯示為16進位制的字串,解決方案: 使用命令 redis-cli –raw就能正常顯示中文,如下圖所示: redis

關於redis使用的一些注意事項

1.首先redis使用預設無密碼,如果想要有密碼就必修修改配置檔案redis.conf(或者redis.windows.conf、redis.windows-service.conf,選擇一個感覺都一樣)。開啟配置檔案找到requirepass,把前面#號去掉(不要留空格)

阿里雲部署redis3.2.100叢集注意事項redis cluster

由於安裝時忘記截圖,只有文字描述了 三臺雲伺服器 兩臺windows 一臺linux 6個redis服務 3主3從 在安全組要開放埠:如6379,伺服器中也要將埠暴露出來 叢集對外的總端 埠+10000,如16379也要開放出來 bind的設定 bind 0.0.0

tomcat8 nginx 叢集 tomcat-redis-session-manager 使用注意事項

最近有個專案需要tomcat叢集,使用的方案是: 1)nginx做tomcat負載均衡; 2)tomcatA和tomcatB做應用叢集; 3)tomcatA和tomcatB session統一存放到redis; 4)資料庫使用阿里雲RDS高可用資料庫(帶主備功能,讀寫分離) 關於sessio

Redis學習筆記(七)jedis超時重試機制注意事項

redis系列文章目錄 jedis客戶端在建立連線時會設定一個超時,並且會有重試機制。 問題起源 在使用jedis客戶端的時候,我測試了一下incr命令,該命令在執行過程中是原子的,所

sentinel搭建redis叢集的注意事項

一、protected-mode 預設情況下,redis node和sentinel的protected-mode都是yes,在搭建叢集時,若想從遠端連線redis叢集,需要將redis node和sentinel的protected-mode修改為no,若只修改redis