1. 程式人生 > >一個致命的 Redis 命令,導致公司損失 400 萬

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

原文地址          血的教訓啊~要引以為戒

危險命令有哪些???

Redis 的危險命令主要有以下幾個:

  • keys

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

  • 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 配置即可達到安全目的。

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 可以定義新命令名稱,或者用隨機字元代替。

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