在眾多開源緩存技術(shù)中,redis無疑是目前功能最為強(qiáng)大,應(yīng)用最多的緩存技術(shù)之一,參考2018年國外數(shù)據(jù)庫技術(shù)權(quán)威網(wǎng)站DB-Engines關(guān)于key-value數(shù)據(jù)庫流行度排名,Redis暫列第一位,但是原生Redis版本在安全方面非常薄弱,很多地方不滿足安全要求,如果暴露在公網(wǎng)上,極易受到惡意×××,導(dǎo)致數(shù)據(jù)泄露和丟失。
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的大埔網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
本文主要是在原生開源軟件Redis3.0基礎(chǔ)上,系統(tǒng)的在安全特性方面進(jìn)行的增強(qiáng),很多增強(qiáng)點涉及了開源代碼的修改,后續(xù)章節(jié)闡述的Redis緩存數(shù)據(jù)庫的安全規(guī)范, 理論上適用于所有應(yīng)用Redis的產(chǎn)品。
本系列共連載三篇,分九個章節(jié),本文從合法監(jiān)聽接口,未公開接口,訪問通道控制三個章節(jié)闡述了Redis緩存數(shù)據(jù)庫加固措施
安全問題:Redis Server監(jiān)聽的端口默認(rèn)為6379,容易被掃描×××。
解決方案:修改為非默認(rèn)端口,并在端口矩陣中說明。
安全問題:Redis支持監(jiān)聽0.0.0.0。
解決方案:因為如果有多網(wǎng)卡,應(yīng)該將監(jiān)聽地址設(shè)置為只有數(shù)據(jù)庫客戶端需要連接的網(wǎng)卡地址。如果只允許本機(jī)訪問,應(yīng)該只監(jiān)聽127.0.0.1。
安全問題:官方RedisCluster方案缺省會增加一個集群端口,且是在客戶端端口偏移10000,這個問題非常隱蔽。
解決方案:在端口矩陣中對額外的這個集群端口有說明。修改源碼,新增一個redis.conf偏移量配置項cluster-port-increment,缺省配置+1,這樣可以做到端口范圍可控,避免沖突。
安全問題:Redis只有一個超戶,權(quán)限過大。
解決方案:權(quán)限最小化原則,增加配置項,角色區(qū)分超戶,普通用戶和只讀用戶三種。
普通用戶不能進(jìn)行的操作有:
安全問題:通過在redis-cli指定-a參數(shù),密碼會被ps出來,屬于敏感信息。
解決方案:修改Redis源碼,在main進(jìn)入后,立即隱藏掉密碼,避免被ps出來。(可參考開源MySQL代碼)
對于需在現(xiàn)網(wǎng)維護(hù)階段使用的命令/參數(shù)、端口等接入方式(包括但不限于產(chǎn)品的生產(chǎn)、調(diào)測、維護(hù)用途),需通過產(chǎn)品資料等向客戶或監(jiān)管機(jī)構(gòu)公開或受限公開。
安全問題: redis-cli訪問參數(shù)帶密碼敏感信息,會被ps出來,也容易被系統(tǒng)記錄操作日志。
解決方案:改為通過API方式(Python可以使用redis-py)來安全訪問,禁止通過sudo方式切換到dbuser賬號使用redis-cli。
重現(xiàn)條件:可以通過iptables禁掉redis端口來模擬重現(xiàn)。
安全問題:Redis原生認(rèn)證存在重放×××:只是簡單的交互一次auth xxx
解決方案:采用預(yù)共享秘鑰(對稱加密算法+隨機(jī)數(shù)的雙向認(rèn)證),同時在方案設(shè)計上做到最大限度兼容,讓客戶端改造成本最小,目前平臺配套目前支持客戶端有:Java,Python,C,Lua。
方案設(shè)計如下:
Redis認(rèn)證協(xié)議變更,其中auth命令區(qū)分兩種功能,通過首字母區(qū)分:
預(yù)共享秘鑰認(rèn)證時序圖
說明:Redis為文本協(xié)議, 安全隨機(jī)數(shù)長度固定為32字節(jié)的可顯示字符串,連接2個隨機(jī)數(shù)的分隔符為”@”。
主要認(rèn)證流程:
1.客戶端向服務(wù)端執(zhí)行命令: authRAND_C
1)首字母<表示是認(rèn)證第一階段。(便于服務(wù)端從協(xié)議層區(qū)分)
2)RAND_C表示客戶端生成安全隨機(jī)數(shù)。
2.服務(wù)端產(chǎn)生響應(yīng)錯誤回復(fù)1)獲取RAND_C,并生成RAND_S
2)產(chǎn)生TokenBA=AES128(RAND_S@RAND_C)
br/>1)獲取RAND_C,并生成RAND_S
2)產(chǎn)生TokenBA=AES128(RAND_S@RAND_C)
說明:錯誤描述為服務(wù)端生成的安全隨機(jī)數(shù)。
3.客戶端驗證1)驗證TokenBA是否合法
解密出RAND_S@RAND_C,看看RAND_C是否是自己生成的隨機(jī)數(shù)
br/>1)驗證TokenBA是否合法
解密出RAND_S@RAND_C,看看RAND_C是否是自己生成的隨機(jī)數(shù)
3)調(diào)用認(rèn)證接口: auth >TokenAB
4.服務(wù)端認(rèn)證
1) 驗證TokenAB是否合解密出RAND_C@RAND_S,看看RAND_S是否是自己生成的隨機(jī)數(shù)
br/>解密出RAND_C@RAND_S,看看RAND_S是否是自己生成的隨機(jī)數(shù)
安全問題:Redis沒有庫名,系統(tǒng)如果只通過用戶名+密碼,容易猜測和×××。
解決方案:通過認(rèn)證時帶上庫名, 因為每個服務(wù)的庫名都配置不同,增加×××復(fù)雜度, 認(rèn)證格式以dbname@dbuser@pwd區(qū)分。
安全問題:Redis也是一種數(shù)據(jù)庫服務(wù),一般一個進(jìn)程占用一個端口,集群還會額外多占用一個端口。
解決方案:在端口矩陣寫明系統(tǒng)申請的Redis端口范圍。
安全問題:原生Redis沒有限制客戶端認(rèn)證超時時間,存在慢×××。
解決方案:修改源碼,限制在60秒內(nèi)認(rèn)證成功,否則服務(wù)器將主動斷開連接。
說明: 控制完成客戶端認(rèn)證的時間上限。這可以防止無效客戶端長時間占用連接通道。
安全問題:增加SSL通信可以提高數(shù)據(jù)傳輸?shù)陌踩?br/>解決方案:
1.不改動官方源碼,通過在客戶端和服務(wù)端部署SSL Proxy,類似stunnel。
2.支持SSL可配置,涉及開源代碼修改。
說明:因為Redis屬于交互密集型,每秒處理幾萬次請求,支持SSL后性能會有比較大損失。
安全問題:目前Redis沒有ACL控制。
解決方案:
1. 目前基于平臺共享秘鑰,其中秘鑰是隨機(jī)生成,每套系統(tǒng)不一樣,間接也做到了IP范圍控制。
2. 通過iptables控制進(jìn)一步限制接入IP范圍。
3. 如果要具體控制到用戶+IP級別,類似Mysql認(rèn)證。作者antirez已經(jīng)意識到這個問題,有望在未來版本提供,鏈接如下:Multi users AUTH and ACLs for Redis
安全問題:官方推薦Java客戶端Jedis集群最新版還不支持認(rèn)證。
解決方案:增加認(rèn)證參數(shù),與服務(wù)端共享秘鑰認(rèn)證保持一致。
安全問題:Jedis認(rèn)證接口密碼為參數(shù)string。
解決方案:Jedis客戶端認(rèn)證新增一套char[]接口。
當(dāng)前題目:Redis緩存數(shù)據(jù)庫安全加固指導(dǎo)(一)
文章來源:http://aaarwkj.com/article12/gopogc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、微信公眾號、App開發(fā)、品牌網(wǎng)站設(shè)計、網(wǎng)站策劃、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)