最近安全事故瀕發啊,前段時間發生了《順豐高級運維工程師的刪庫事件》,今天又看到了 PHP 工程師在線執行了 Redis 危險命令致使某公司損失 400 萬。。
java
什麼樣的 Redis 命令會有如此威力,形成如此大的損失?面試
具體消息以下:redis
據云頭條報道,某公司技術部發生 2 起本年度 PO 級特大事故,形成公司資金損失 400 萬,緣由以下:數據庫
因爲 PHP 工程師直接操做上線 redis,執行 keys * wxdb(此處省略)cf8* 這樣的命令,致使redis鎖住,致使 CPU 飆升,引發全部支付鏈路卡住,等十幾秒結束後,全部的請求流量所有擠壓到了 rds 數據庫中,使數據庫產生了雪崩效應,發生了數據庫宕機事件。安全
該公司表示,如再犯相似事故,將直接開除,並表示以後會逐步收回運維部各項權限。bash
看完這個消息後,我心又一驚,爲何這麼低級的問題還在犯?爲何線上的危險命令沒有被禁用?這事件報道出來真是以爲很低級。。。架構
且不說是哪家公司,發生這樣的事故,無論是大公司仍是小公司,我以爲都不該該,相關負責人應該引咎辭職!!!運維
對 Redis 稍微有點使用經驗的人都知道線上是不能執行 keys *
相關命令的,雖然其模糊匹配功能使用很是方便也很強大,在小數據量狀況下使用沒什麼問題,數據量大會致使 Redis 鎖住及 CPU 飆升,在生產環境建議禁用或者重命名!ide
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。
學習
Redis 的危險命令主要有如下幾個:
keys
客戶端可查詢出全部存在的鍵。
flushdb
Delete all the keys of the currently selected DB. This command never fails.
刪除 Redis 中當前所在數據庫中的全部記錄,而且此命令從不會執行失敗。
flushall
Delete all the keys of all the existing databases, not just the currently selected one. This command never fails.
刪除 Redis 中全部數據庫中的全部記錄,不僅是當前所在數據庫,而且此命令從不會執行失敗。
config
客戶端可修改 Redis 配置。
看下 redis.conf
默認配置文件,找到 SECURITY
區域,如如下所示。
################################## SECURITY ###################################
# Require clients to issue AUTH <PASSWORD> before processing any other
# commands. This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
#
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
# requirepass foobared
# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
# rename-command CONFIG ""
#
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to slaves may cause problems.
複製代碼
看說明,添加 rename-command
配置便可達到安全目的。
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。
1)禁用命令
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
複製代碼
2)重命名命令
rename-command KEYS "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHALL "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHDB "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command CONFIG "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
複製代碼
上面的 XX 能夠定義新命令名稱,或者用隨機字符代替。
通過以上的設置以後,危險命令就不會被客戶端執行了。
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。