歡迎光臨
每天分享高質量文章

Redis 資料庫安全手冊

Redis是一個高效能的key-value資料庫,這兩年可謂火的不行。而Redis的流行也帶來一系列安全問題,不少攻擊者都透過Redis發起攻擊。本文將講解這方面的內容,包括Redis提供的訪問控制和程式碼安全問題,以及可以由惡意輸入和其他類似的手段觸發的攻擊。


Redis通用安全模組

Redis被設計成只能由可信環境的可信機器訪問。這意味著將它直接暴露在網際網路或者其他可以由不可信機器透過TCP或者UNIX SCOKET直接連線的環境中。


例如,在通常的WEB應用程式使用Redis作為資料庫,cache,或者訊息系統。WEB應用程式的客戶端將查詢Redis生成頁面或執行請求或由使用者觸發。在這個例子中,WEB應用連結了Redis和不可信的客戶端。


這是一個特定的例子,但是一般來說,不授信的Redis連結應該被監控,驗證使用者輸入,再決定執行什麼樣的操作。因為,Redis追求的不是最大的安全性,而是簡潔與高效。


網路安全


Redis連結應該對每個受信的客戶端開放。所以,伺服器執行的Redis應該只被使用Redis應用的計算機連線。在大多數直接暴露在網際網路的單個計算機,例如,虛擬化的LINUX實體(LINODE,EC2,…..)


Redis埠應該被防火牆阻止來自外部的訪問。客戶端應該仍然能透過伺服器的本地迴環介面訪問Redis。註意,透過在Redis.CONF新增下麵一句就可以系結本地迴環,阻止外網訪問了。


bind 127.0.0.1


因為Redis的特性,沒有對外網訪問進行限制會是一個很重大的安全問題。例如一條簡單的FLUSHALL命令就能被攻擊者用來刪除整個資料設定。


身份驗證機制


如果你們不想使用訪問限制的話,Redis提供了一個身份驗證功能,可以透過編輯Redis.CONF檔案來實現它。


如果開啟了身份驗證功能,Redis將拒絕所有的未身份驗證的客戶端的所有操作。客戶端可以傳送AUTH命令+密碼來驗證自己。

密碼是由系統管理員在Redis。CONFIG檔案中設定的明文密碼,為了防止暴力破解攻擊他應該足夠長。原因有兩個:


Redis的執行效率非常快,外部裝置每秒可以測試相當數量的密碼 Redis的密碼是儲存在Redis.conf檔案和內部客戶端的配置中的,因此不需要管理員記住。所以可以使用相當長的密碼。


身份驗證的標的是提供第二層的安全保障。這樣當防火牆或者其他第一層的系統安全設定失效的話,一個外部裝置在沒有密碼的情況下仍然不能訪問redia。


AUTH命令像其他的redia命令一樣是不加密傳輸的,所以他不能阻止攻擊者在內網的竊聽。


資料加密支援


Redis不支援加密。為了受信的客戶端可以以加密形式透過網際網路可以採用加密協議(SSL)傳輸資料。


禁用特定的命令


禁用Redis的一些命令是可行的,或者將他們改名。這樣來自客戶端的請求就只能執行有限的命令。


例如,虛擬的伺服器提供商可能提供託管的Redis服務。在這種情況下,普通使用者不應該能夠呼叫Redis的配置命令來修改該配置實體,但提供和刪除服務的系統能夠有這樣的許可權。


在這種情況下,從命令表中重新命名命令或者完全隱藏命令是可能的。這個功能可用在Redis.conf配置檔案裡做為一個宣告。例如:


rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52


在上面的例子裡,CONFIG命令被更名為一個更為陌生的名字。它也完全可以被重新命名成空字串,例如:


rename-command CONFIG ""


由精密的輸入觸發的攻擊


還有一類攻擊,攻擊者即使沒有獲得資料庫的訪問許可權也可以從外部發起攻擊。一個此類攻擊的例子是透過Redis的內部函式向Redis裡插入資料。


攻擊者可以透過一個web表單將一組字串提交到一個hash的同一個堆疊,引起時間複雜度從O(1)到O(n) ,消耗更多的CPU資源,最終導致DOS攻擊。為了防止這種特定的攻擊方式,Redis為每個執行請求隨機分配hash。


Redis使用快速排序演演算法來執行SORT命令。目前,這個演演算法不是隨機的,所以透過對輸入的精細控制可能觸發命令的二次執行。


字串轉義和NOSQL註入


Redis協議裡面沒有字串轉義相關的內容,所以在通常情況下是不存在註入的。Redis協議使用的是字首長度的字串,完全二進位制,保證安全性。LUA指令碼執行EVAL和EVALSHA命令時遵循相同的規則,因此這些命令也是安全的。


然而這回事一個非常奇怪的用例,應用程式應該避免使用LUA指令碼獲取來自非信任源的字串。


程式碼安全性


在經典的Redis 設定裡,客戶端可以執行所有的命令集,但是獲得的用例應該永遠不能導致有控制Redis所在系統的能力。內在的,Redis使用眾所周知的安全程式碼規範來防止緩衝區上限溢位,格式錯誤和其它記憶體損壞問題。然而,客戶端擁有控制使用伺服器配置命令CONFIG的能力使得其能夠改變程式的工作目錄和轉儲檔案的名稱。這允許客戶端寫RDB Redis在隨機路徑寫檔案。這是一個安全問題,容易導致客戶端有Redis執行非法程式碼的能力。


Redis不需要root許可權執行,也不建議以root許可權執行。Redis的作者正在調查新增一條新的配置引數來防止CONFIG SET/GET 目錄和其他類似的執行時配置的指令的可能性。這會阻止客戶端強制服務器在任意位置寫Redis轉儲檔案。


GPG key


安全研究人員可以在Github提交問題,當你感覺這個安全問題真的很重要,在檔案的末尾加上GPG標識。


-----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 sub 4096R/3B34D15F 2013-11-07 [expires: 2063-10-26]

英文出處:redis.io

譯文出處:FREEBUF-ubuntu
譯文連結:
http://www.freebuf.com/articles/system/60654.html

贊(0)

分享創造快樂