一個致命的 Redis 命令,致使公司損失 400 萬!!



最近安全事故瀕發啊,前段時間發生了《順豐高級運維工程師的刪庫事件》,今天又看到了 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面試題。

相關文章
相關標籤/搜索