193
技術社區[雲棲]
《Redis官方教程》-Redis安全
本節提供了Redis安全主題概述,包括控製訪問、代碼安全以及諸於惡意注入攻擊攔截等。
對於安全相關的交流可以在github上建一個issue;如果擔心溝通的安全,可以使用文末的GPG密鑰。
Redis一般安全模型
Reids被設計用於在信任的環境中訪問的被授權客戶端使用,這意味著將Redis直接暴露到internet上,或者直接被環境中的非授權的客戶端通過TCP端口訪問都不是一個好的主意。
例如,一個web應用使用Redis作為數據庫、緩存或者消息係統,前端生成頁麵、執行請求操作或者web應用用戶觸發操作均將訪問Redis。在這種情況下,web應用應對不受信任的客戶端的進行訪問控製。
這是一個具體的例子,但是,一般情況下,非授信訪問Redis必須被實現了ACLs層進行訪問控製:校驗用戶輸入以決定哪些操作可以被Redis實例執行。
總的來說,Redis並不為了提高安全優化,而是在高性能和易用性方麵進行優化。
網絡安全
除了網絡中信任的客戶端能夠訪問Redis端口,其他請求應拒絕訪問。因此運行Redis的服務器隻能被使用Redis實現應用程序的計算機訪問。
對於一台電腦直接暴露在互聯網的情況,如虛擬機(Linode…),應該使用防火牆阻止外部訪問Redis端口。客戶端應該通過環回接口訪問Reids.
注意可以在redis.conf文件添加一行如下配置綁定Redis到單個接口上:bind 127.0.0.1
由於Redis設計的初衷,如果不能成功阻止外部訪問Redis端口,會有很大的安全影響。外部攻擊者使用一個FLUSHALL命令就可以刪除整個數據集。
身份驗證功能
雖然Redis沒有實現訪問控製,但它提供了一個簡單的身份驗證功能,該功能是一個可選功能,可以通過編輯redis.conf文件打開。
身份驗證功能生效,Redis將拒絕所有未經身份認證的查詢請求。客戶端可以通過發送(AUTH 密碼)命令進行身份認證。
密碼被管理員明文配置在redis.conf文件中。它需要足夠長,防止被暴力破解。原因有兩點:
- Redis的查詢服務非常快,外部客戶端每秒可以進行多次密碼測試。
- 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內部組件的數據結構的實現算法太複雜。
例如,攻擊者可以通過WEB表單提交一串已知字符集,通過散列成相同的桶到散列表中將O(1)期望時間(平均時間)變成了O(N)的最壞情況,消耗了更多的CPU計算,最終導致拒絕訪問。
為了阻止這種攻擊,Redis對於散列函數使用了一個預執行的偽隨機數種子。
Redis使用了qsort 算法實現了SORT命令。當前,這個算法不是隨機的,因此存在因特定輸入觸發產品最壞情況的可能。
字符串轉義和NoSQL注入
Redis協議沒有字符串轉義的概念,所以在正常環境中使用正常的客戶端庫是無法注入的。協議使用前綴長度的字符串,且是完全二進製安全的。
使用EVAL和EVALSHA命令執行Lua腳本時也遵循相同的規則,因而這些命令也是安全的
然後,需要避免使用不被信任的來源的字符串組合Lus腳本這種奇怪的用例。
代碼安全
Redis的默認設置允許客戶端訪問所有的命令集,但是訪問實例不能導致控製運行Redis的係統的能力。
在內部,Redis使用眾所周知的實踐來寫安全的代碼,以阻止緩衝區溢出,格式化漏洞和內存損壞漏洞。
然而,使用CONFIG 命令控製服務配置的能力使得客戶端能改變程序的工作目錄和dump文件的名字,這會允許客戶端在隨機路徑寫RDB Redis文件,這是一個安全問題,容易導致用戶損害係統或運行不安全的代碼。
Redis不要求使用Root特權運行。鑒於此,推薦使用一個非特權用戶來運行Redis。目前,Redis作者正在調查添加一個新的配置參數來限製CONFIG SET/GET dir和其他類似運行時配置指令的可能性。這將阻止客戶端在任意位置強製寫Redis dump文件。
GPG密鑰
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.13 (Darwin)
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
vI1sAEeV6ZM/uc4CDI3E2TxEbQ==
密鑰指紋
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]
最後更新:2017-05-19 17:33:33