且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

一个致命的Redis命令,导致公司损失400万!!

更新时间:2021-11-09 00:51:54

最近安全事故濒发啊,前几天发生了“ 顺丰高级运维工程师的删库事件 ”,今天又看到了PHP工程师在线执行了Redis危险命令导致某公司损失400万..

什么样的Redis命令会有如此威力,造成如此大的损失?

具体消息如下:

据云头条报道,某公司技术部发生2起本年度PO级特大事故,造成公司资金损失400万,原因如下:

由于PHP工程师直接操作上线redis,执行键* wxdb(此处省略)cf8 *这样的命令,导致redis锁住,导致CPU飙升,引起所有支付链路卡住,等十几秒结束后,所有的请求流量全部挤压到了rds数据库中,使数据库产生了雪崩效应,发生了数据库宕机事件。

该公司表示,如再犯类似事故,将直接开除,并表示之后会逐步收回运维部各项权限。

看完这个消息后,我心又一惊,为什么这么低级的问题还在犯?为什么线上的危险命令没有被禁用?这事件报道出来真是觉得很低级......

且不说是哪家公司,发生这样的事故,不管是大公司还是小公司,我觉得都不应该,相关负责人应该引咎辞职!

对Redis稍微有点使用经验的人都知道线上是不能执行keys *相关命令的,虽然其模糊匹配功能使用非常方便也很强大,在小数据量情况下使用没什么问题,数据量大会导致Redis锁住及CPU飙升,在生产环境建议禁用或者重命名!

还有哪些危险命令?

Redis的危险命令主要有以下几个:

  • 按键

客户端可查询出所有存在的键。

  • flushdb
删除当前所选数据库的所有键。此命令永远不会失败。

删除Redis中当前所在数据库中的所有记录,并且此命令从不会执行失败。

  • flushall
删除所有现有数据库的所有键,而不仅仅是当前选定的数据库。此命令永远不会失败。

删除Redis中所有数据库中的所有记录,不只是当前所在数据库,并且此命令从不会执行失败。

  • 配置

客户端可修改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可以定义新命令名称,或者用随机字符代替。

经过以上的设置之后,危险命令就不会被客户端执行了。

程序员学习交流群:878249276,欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提
升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!