歡迎光臨
每天分享高質量文章

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

點選上方“Java技術驛站”,選擇“置頂公眾號”。

有內涵、有價值的文章第一時間送達!

精品專欄

 

最近安全事故瀕發啊,前幾天發生了《順豐高階運維工程師的刪庫事件》,今天又看到了 PHP 工程師線上執行了 Redis 危險命令導致某公司損失 400 萬。。

什麼樣的 Redis 命令會有如此威力,造成如此大的損失?

具體訊息如下:

據雲頭條報道,某公司技術部發生 2 起本年度 PO 級特大事故,造成公司資金損失 400 萬,原因如下:

由於 PHP 工程師直接操作上線 redis,執行 keys * wxdb(此處省略)cf8* 這樣的命令,導致redis鎖住,導致 CPU 飆升,引起所有支付鏈路卡住,等十幾秒結束後,所有的請求流量全部擠壓到了 rds 資料庫中,使資料庫產生了雪崩效應,發生了資料庫宕機事件。

該公司表示,如再犯類似事故,將直接開除,並表示之後會逐步收回運維部各項許可權。

看完這個訊息後,我心又一驚,為什麼這麼低階的問題還在犯?為什麼線上的危險命令沒有被禁用?這事件報道出來真是覺得很低階。。。

且不說是哪家公司,發生這樣的事故,不管是大公司還是小公司,我覺得都不應該,相關負責人應該引咎辭職!!!

對 Redis 稍微有點使用經驗的人都知道線上是不能執行 keys* 相關命令的,雖然其模糊匹配功能使用非常方便也很強大,在小資料量情況下使用沒什麼問題,資料量大會導致 Redis 鎖住及 CPU 飆升,在生產環境建議禁用或者重新命名!

還有哪些危險命令?

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 區域,如以下所示。

  1.  ################################## SECURITY ###################################

  2. # Require clients to issue AUTH before processing any other

  3. # commands.  This might be useful in environments in which you do not trust

  4. # others with access to the host running redis-server.

  5. #

  6. # This should stay commented out for backward compatibility and because most

  7. # people do not need auth (e.g. they run their own servers).

  8. #

  9. # Warning: since Redis is pretty fast an outside user can try up to

  10. # 150k passwords per second against a good box. This means that you should

  11. # use a very strong password otherwise it will be very easy to break.

  12. #

  13. # requirepass foobared

  14. # Command renaming.

  15. #

  16. # It is possible to change the name of dangerous commands in a shared

  17. # environment. For instance the CONFIG command may be renamed into something

  18. # hard to guess so that it will still be available for internal-use tools

  19. # but not available for general clients.

  20. #

  21. # Example:

  22. #

  23. # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

  24. #

  25. # It is also possible to completely kill a command by renaming it into

  26. # an empty string:

  27. #

  28. # rename-command CONFIG ""

  29. #

  30. # Please note that changing the name of commands that are logged into the

  31. # AOF file or transmitted to slaves may cause problems.

看說明,新增 rename-command 配置即可達到安全目的。

1)禁用命令

  1. rename-command KEYS     ""

  2. rename-command FLUSHALL ""

  3. rename-command FLUSHDB  ""

  4. rename-command CONFIG   ""

2)重新命名命令

  1. rename-command KEYS     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

  2. rename-command FLUSHALL "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

  3. rename-command FLUSHDB  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

  4. rename-command CONFIG   "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

上面的 XX 可以定義新命令名稱,或者用隨機字元代替。

經過以上的設定之後,危險命令就不會被客戶端執行了。

美團三面:一個執行緒OOM,行程裡其他執行緒還能執行麼?

設計樣式六大原則,你真的懂了嗎?

6 個實體詳解如何把 if-else 程式碼重構成高質量程式碼

Get史上最優雅的加密方式!沒有之一!

如何 “幹掉” if...else

淺談String的intern

END

我是 Java 技術驛站,感謝有你

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖