redis 安全

原文:http://redis.io/topics/security

 

1.     Redis的安全模式

       可信環境下的可信用戶纔可訪問redis。這意味着,將redis服務器直接暴露在Internet或者不可信用戶可直接訪問Redis的tcp端口或Unix套接字的環境,是不安全的。

使用redis的web應用程序的常用場景是將redis作爲數據庫,緩存,消息系統,應用程序的前端用戶查詢redis來產生頁面,或者運行需要的操作,被web應用程序用戶所觸發。這樣的話,web應用程序需要對不可信用戶(用戶瀏覽器)訪問redis進行處理。

對redis的非法訪問經常通過使用ACL,驗證用戶輸入和決定redis的哪些操作是禁止的等等措施來控制。

總的來說,redis着重於高性能和簡單易用,在安全方面做得並不好。

 

2.     網絡安全

        除了可信用戶之外,任何人都不能訪問redis端口。用redis實現的應用程序纔可直接訪問服務器上運行的redis.

        通常情況下,一臺直接暴露在Internet的計算機,例如一個虛擬化Linux實例(Linode,EC2,…),防火牆應防止外部用戶訪問它的redis端口。

用戶仍可以通過本地接口來訪問redis.

        在redis.conf配置文件增加下面這一行配置,即可把redis綁定在單個接口上。

                  bind 127.0.0.1

         如果不禁止外部訪問redis的話,將會產生非常嚴重的後果。例如,外部的非法用戶的一個FLUSHALL操作就可以刪除redis的所有數據。

 

 

3.     認證

        雖然redis沒有實現訪問控制這個功能,但是它提供了一個輕量級的認證方式,可以編輯redis.conf配置來啓用認證。

當授權方式啓用時,redis將會拒絕來自非認證用戶的任何查詢。用戶可以通過發送AUTH命令並帶上密碼給redis服務器來給自己授權。

系統管理員在redis.conf文件裏以明文方式設置密碼。而且密碼必須足夠長來抵禦暴力破解密碼方式的攻擊,這樣設置密碼做有兩個原因:

(1)    redis的查詢速度是非常快的,外部用戶一秒內可以嘗試許多個密碼。

(2)    redis密碼存儲在redis服務器上的redis.conf文件以及用戶的配置文件裏,系統管理員沒有必要記住密碼,因爲密碼可以非常長的。

       認證層的目標是提供多一層的保護。如果防火牆或者用來保護redis的系統防禦外部攻擊失敗的話,外部用戶如果沒有通過密碼認證還是無法訪問redis的。

       AUTH命令跟其他redis命令一樣,是沒有加密的,所以阻止不了攻擊者在網絡上竊取你的密碼。

 

4.     數據加密

Redis並不支持加密。爲了能讓在Internet或者不可信網絡的用戶訪問redis,需要實現新增的保護層,例如SSL代理。

 

 

5.     禁用指定的命令

在redis你可以禁用某些命令或者將命令重命名成難以猜測的名字,這樣一般的用戶就

只能使用部分命令了。

例如,虛擬服務器提供商提供管理redis實例的服務,這樣的話,普通用戶就不能調用CONFIG命令來修改配置了,但能新增,刪除redis實例的系統必須能修改配置。

你可以重命名命令,也可以完全禁用該命令。Redis.conf文件支持這樣的這樣配置。例如:

rename-command CONFIGb840fc02d524045429941cc15f59e41cb7be6c52

在上面這個例子裏,CONFIG命令重命名成一個毫無意義的名字。把命令重命名成空字符串即可將命令完全禁用,例如下面這個例子:

rename-command CONFIG “”

 

 

6.  外部用戶精心構造的輸入所觸發的攻擊

有一類攻擊是攻擊者即便沒有訪問redis權限也可以通過外部來觸發的。這種攻擊的一

個方式是向redis插入數據,使得對redis內部實現的數據結構的操作達到一個變態的算法複雜度。例如,攻擊者通過表單提交若干哈希值相同的字符串到哈希表裏,使O(1)的平均算法複雜度變成最差的O(n),redis服務器要花費比預期更多的cpu,最終導致無法提供服務。

    爲了防範這類特殊的攻擊,redis的哈希函數使用per-excution的僞隨機種子。Redis用qsort算法來實現SORT命令。目前這個算法還不是隨機的,所以通過有意構造輸入可能引發二次達到最糟糕情況的行爲。

 

7.     字符串轉義和NoSQL注入

Redis的協議裏並沒有字符串轉義的概念,在一般的情況下使用普通客戶端庫是無法實

現NoSQL注入的。協議使用的是二進制安全的前綴長度字符串。

   通過EVAL,EVALSHA命令執行Lua腳本同樣是安全的。

   應用程序應避免使用不明來源的字符串來寫Lua腳本。

 

8.     代碼安全

典型版本的redis中,客戶端是可以使用全部命令的,但是訪問redis實例時是沒有能力

控制運行着redis的系統的。

Redis使用好的編程方法來寫代碼,防止出現緩存溢出,格式錯誤和其他內存損壞問題。可是,使用CONFIG命令修改服務器配置的能力使得用戶可以改變程序的工作目錄和備份文件的名字。這也使得用戶將RDB文件寫在任意位置。這個安全問題容易引起不安全的代碼的運行。

Redis並不需要root權限來運行。建議使用非特權用戶運行redis.redis的作者正在調查給CONFIG命令增加一個新參數來防止CONFIG SET/GET dir和其他類似的運行時配置指令的可能性。這可以防止用戶強制服務器在任意位置寫備份文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章