目錄
- redis漏洞
- 入侵特征
- 安全隱患
- redis安全規范
- 禁止root用戶啟動
- 限制redis文件目錄訪問權限
- 開啟密碼認證,設置復雜密碼
- 禁用或重命名危險命令
- 設置允許監聽地址,不要使用0.0.0.0
- 盡量修改默認端口6379
- 信任的內網運行,盡量避免有公網訪問
Redis漏洞
Redis 默認情況下,會綁定在 0.0.0.0:6379,這樣將會將 Redis 服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下可以利用 Redis 的相關方法,可以成功在 Redis 服務器上寫入公鑰,進而可以使用對應私鑰直接登錄目標服務器。
入侵特征
- Redis 可能執行過 FLUSHALL 方法,整個 Redis 數據庫被清空
- 在 Redis 數據庫中新建了一個名為 crackit(網上流傳的命令指令) 的鍵值對,內容為一個 SSH 公鑰。
- 在 /root/.ssh 文件夾下新建或者修改了 authorized_keys 文件,內容為 Redis 生成的 db 文件,包含上述公鑰,完成root權限獲取。
滿足以下條件Redis實例存在此安全隱患
- Redis使用root用戶啟動
- Redis未設置密碼或密碼過於簡單
- Redis允許任意地址連接,即bind 0.0.0.0
- Redis未重命名或禁用config, flushdb/flushall,[bg]save等命令
- 使用默認端口6379(非強制)
加強Redis的安全性,提供以下安全規范。
備注:如果修改redis配置文件redis.conf,並且重啟redis服務后生效。
Redis安全規范
禁止root用戶啟動redis
為 Redis 服務創建單獨的用戶和home目錄,使用普通用戶啟動,安全性往往高很多;
業務程序永久別用root用戶運行。
限制redis文件目錄訪問權限
設置redis的主目錄權限為700;如果redis配置文件獨立於redis主目錄,權限修改為600,因為Redis密碼明文存儲在配置文件中。
$chmod 700 /var/lib/redis #redis目錄 $chmod 600 /etc/redis/redis.conf #redis配置文件
開啟redis密碼,並設置高復雜度密碼
redis沒有實現訪問控制這個功能,但是它提供了一個輕量級的認證方式,可以編輯redis.conf配置來啟用認證。
redis因查詢效率高,auth這種命令每秒能處理10w次以上,簡單的redis的密碼極容易為攻擊者暴破。
requirepass至少長度20位以上,為方便可使用一個特殊串sha256sum命令生成64位的無特殊字符串。
$echo "dfasdERQEWRQEW31341dfadsfadsf" | sha256sum af970b3691a0774b2a5adae1375e14cd9e5db3591564f0eb789c2324cc02362f -
1、初始化Redis密碼:
在配置文件中有個參數: requirepass 這個就是配置redis訪問密碼的參數;
比如 requirepass test123;
(Ps:需重啟Redis才能生效)
redis的查詢速度是非常快的,外部用戶一秒內可以嘗試多大150K個密碼;所以密碼要盡量長(對於DBA 沒有必要必須記住密碼);
2、不重啟Redis設置密碼:
在配置文件中配置requirepass的密碼(當redis重啟時密碼依然有效)。
redis 127.0.0.1:6379> config set requirepass ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
查詢密碼:
redis 127.0.0.1:6379> config get requirepass (error) ERR operation not permitted
密碼驗證:
redis 127.0.0.1:6379> auth ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815 OK
再次查詢:
redis 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815"
PS:如果配置文件中沒添加密碼 那么redis重啟后,密碼失效;
3、登陸有密碼的Redis:
在登錄的時候的時候輸入密碼:
redis-cli -p 6379 -a ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
先登陸后驗證:
redis-cli -p 6379 redis 127.0.0.1:6379> auth ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815 OK
AUTH命令跟其他redis命令一樣,是沒有加密的;阻止不了攻擊者在網絡上竊取你的密碼;
認證層的目標是提供多一層的保護。如果防火牆或者用來保護redis的系統防御外部攻擊失敗的話,外部用戶如果沒有通過密碼認證還是無法訪問redis的。
禁用或重命名危險命令
這個漏洞就利用config/save兩個命令完成攻擊 。 因redis無用戶權限限制,建議危險的命令,使用rename配置項進行禁用或重命名,這樣外部不了解重命名規則攻擊者,就不能執行這類命令。
以下示例:redis.config文件禁用FLUSHDB、FLUSHALL兩個命令;重命名CONFIG、SHUTDOWN命令,
添加一個特殊的后綴。 這樣redis啟動后,只能運行CONFIG_b9fc8327c4dee7命令,不能執行CONFIG命令。
# It is also possible to completely kill a command by renaming it into # an empty string: # rename-command CONFIG CONFIG_b9fc8327c4dee7 rename-command SHUTDOWN SHUTDOWN_b9fc8327c4dee7 rename-command FLUSHDB "" #禁用此命令 rename-command FLUSHALL "" #禁用此命令
配置redis僅監聽在本地地址
redis.conf配置文件:
bind 127.0.0.1 192.168.13.12
通常我都設置為bind 0.0.0.0,允許遠程連接,但這是不安全的。修改后重啟redis服務。
修改默認6379端口
redis.conf配置文件:
port 6666
默認端口為6379。
信任的內網運行,盡量避免有公網訪問
redis自身只有一個密碼控制訪問,不能設置用戶權限和IP限制。理論把redis運行在一個信任的網絡環境中
其它
1. 監控redis安全狀態,cmdstat_auth cmdstat_flushdb/flushall監控報警。
2. Redis設計旨在提供高性能的KV服務,至少目前在權限訪問控制和數據持久化方面比較弱化。所以禁止在Redis中存儲或緩存敏感的明文數據。
3. 針對之前Redis版本,默認無bind和密碼設置存在很大安全風險;Redis3.2版本提出新特性protected mode(保護模式)。
如果Redis在啟動時,未開啟bind和密碼設置功能,只能通過回環地址本地訪問,如果嘗試遠程訪問redis,會提示以下錯誤:
DENIED Redis is running protected mode because protected mode is enabled,
no bind address was specified, no authentication password is requested to clients.
In this mode connections are only accepted from the loopback interface.
當然也可直接執行CONFIG SET protected-mode no,關閉保護模式。
4. redis cluster不支持密碼。
redis相關命令
可執行文件 | 作用 |
redis-server | 啟動redis |
redis-cli | redis命令行工具 |
redis-benchmark | 基准測試工具 |
redis-check-aof | AOF持久化文件檢測工具和修復工具 |
redis-check-dump | RDB持久化文件檢測工具和修復工具 |
redis-sentinel | 啟動redis-sentinel |
最常用到的是redis-cli
redis-cli -help 查看參數
遠程連接
redis-cli -h HOST -p PORT -a Password 如: redis-cli -h 127.0.0.1 -p 6379 -a test123
執行命令
redis-cli -h HOST -p PORT COMMAND 如: $redis-cli -h 127.0.0.1-p 6379 get hello "world"
關於命令這篇總結的比較好:https://www.cnblogs.com/kongzhongqijing/p/6867960.html