前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >reids 规避危险指令

reids 规避危险指令

作者头像
用户3147702
发布2022-06-27 12:57:24
4390
发布2022-06-27 12:57:24
举报
文章被收录于专栏:小脑斧科技博客

1. 概述

据云头条报道,某公司技术部发生 2 起本年度 PO 级特大事故,造成公司资金损失 400 万,原因如下: 由于 PHP 工程师直接操作上线 redis,执行 keys wxdb(此处省略)cf8 这样的命令,导致redis锁住,导致 CPU 飙升,引起所有支付链路卡住,等十几秒结束后,所有的请求流量全部挤压到了 rds 数据库中,使数据库产生了雪崩效应,发生了数据库宕机事件 该公司表示,如再犯类似事故,将直接开除,并表示之后会逐步收回运维部各项权限

看了上面的新闻,不禁感到一惊,线上 redis 竟然因为一条指令锁住全库,这究竟是什么原因,又该如何避免呢? 本篇日志就来详细说明。

2. redis 危险指令

2.1. keys

keys 指令可以查询出所有存在的键,keys 相关命令可以进行模糊匹配,是非常方便和强大的工具。 但由于 redis 是单进程模型,如果数据量巨大,keys 命令的查询效率就显得太低了,从而会导致 Redis 锁住、CPU 飙升,这也就是上面新闻中问题的发生原因。 因此,线上 Redis 集群禁用 keys 命令是必须的。

2.2. flushdb

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

2.3. flushall

这个命令是用来删除 Redis 中所有数据库中的所有记录,不只是当前所在数据库。 和 flushdb 一样,这个命令也是不会执行失败的。

2.4. config

config 命令让客户端可以修改 redis 配置,可想而知,这是非常危险的。

3. 禁用危险指令

redis 并没有提供禁用任何指令的配置或方法,但是 redis 允许我们在配置文件中将任何指令重命名为其他名字,通过这个手段,我们就可以实现禁用指令的效果了。

代码语言:javascript
复制
################################## 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.

redis.conf 的 SECURITY 中有上述说明,我们看到了 rename-command 的用法:

代码语言:javascript
复制
rename-command KEYS     ""
rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""

这样我们就可以实现命令的禁用了。 当然我们也可以通过配置这些危险指令为其他指令,让运维人员在关键时刻仍然可以使用这些命令:

代码语言:javascript
复制
rename-command FLUSHALL a31907b21c437f46808ea49322c91d23a
rename-command FLUSHDB  qf69aZbLAX3cf3ednHM3SOlbpH71yEXLA
rename-command CONFIG   FRaqbC8wSA1XvpFVjCRGryWtIIZS2TRvp
rename-command KEYS     eIiGXix4A2DreBBsQwY6YHkidcDjoYA2D

再次执行上述命令就会出现:

4. Unknown command ’flushall’ reading the append only file

如上配置后,启动 redis 可能会报出这个错误。 这是因为 AOF 持久化方式需要使用 flushall 命令,安全起见,只能在配置文件中关闭 AOF 了:

代码语言:javascript
复制
appendonly no

5. 参考资料

https://gist.github.com/DDmitrid/0bf3ebcc41d1a5d23cf8727d5ff52f28。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. redis 危险指令
    • 2.1. keys
      • 2.2. flushdb
        • 2.3. flushall
          • 2.4. config
          • 3. 禁用危险指令
          • 4. Unknown command ’flushall’ reading the append only file
          • 5. 参考资料
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档