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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

最近安全事故濒发啊,前几天发生了《顺丰高级运维工程师的删库事件》,今天又看到了 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 <PASSWORD> 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 可以定义新命令名称,或者用随机字符代替。

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


原文发布时间为:2018-09-28

本文作者: Java技术驿站

本文来自云栖社区合作伙伴“ Java技术驿站”,了解相关信息可以关注“ Java技术驿站”。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
13天前
|
NoSQL Redis 数据库
Redis的全局命令及相关误区
Redis的全局命令及相关误区
21 0
|
21天前
|
NoSQL Redis 数据库
Redis中的常用命令有哪些?
Redis常用命令包括:PING测试连接,ECHO回显,SELECT切换数据库,QUIT关闭连接;KEYS查找key,EXISTS检查存在,DEL删除key,EXPIRE设置过期时间,TTL查看剩余生存时间,TYPE检测数据类型;STRING操作如SET/GET/MSET/MGET,INCR/DECR增减计数;HASH命令如HSET/HGET/HMSET/HMGET/HGETALL管理字段;LIST操作如LPUSH/RPUSH/LPOP/RPOP/LRANGE;
9 0
|
27天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
23 0
|
2月前
|
缓存 NoSQL 数据处理
Redis事务悄然而至:命令的背后故事
Redis事务悄然而至:命令的背后故事
26 0
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
60 0
|
4天前
|
存储 NoSQL Java
Redis 命令
Redis 命令
35 0
|
15天前
|
NoSQL Redis 数据库
通过migrate命令实现两个redis实例之间的数据迁移
通过migrate命令实现两个redis实例之间的数据迁移
|
1月前
|
NoSQL Redis 索引
[Redis]——Redis命令手册set、list、sortedset
[Redis]——Redis命令手册set、list、sortedset
|
2月前
|
存储 消息中间件 NoSQL
Redis相关命令详解及其原理
Redis相关命令详解及其原理
60 0
|
2月前
|
NoSQL Redis
redis五大数据类型及其常用命令(详细)
redis五大数据类型及其常用命令(详细)
21 0

热门文章

最新文章