redis 安全漏洞防御

一、端口安全(限制客户端ip以及修改密码)

  1. 置redis密码

    找到requirepass,设置新的密码
  2. 将 redis 启动在 127.0.0.1 上

    一般建议方案是将 redis 启动在 127.0.0.1 上
    但是这种方式不能跨服务器访问,一般方式是将 Redis 放到内网,防止公网检测。如果服务部署在公有云上,需要对 Redis 服务器设置防火墙
    redis设置防火墙本人还需要再找一些其它的资料
  3. 同时可以修改端口号:可修改也可不修改
    二、指令安全
    用户建立连接后可能执行 flushdb 之类的指令清空 Redis 内存数据库,虽然已经通过配置 bind 或者 requirepass 配置项阻断了恶意用户与线上 Redis 服务建立连接的可能,但是如果是自己不小心在线上 Redis 中执行了 flushdb 指令呢,这个是有可能出现的,就像 MySQL 中的误删除一样。
    为了规避这个问题,我们可以在 Redis 服务端配置文件中通过 rename-command 配置项对这种危险指令进行重命名:
  4. 指令重命名
rename flushdb flush_this_db
rename flushall flush_all_dbs
  1. 如果你觉得这些命令实在不安全,还可以通过如下方式将其彻底禁用:
rename flushdb ""
rename flushall ""

也可以在配置文件中添加如下语句

redis 漏洞 redis漏洞验证_redis 漏洞


三、 内存使用与写入频率限制

  1. 内存限制和淘汰策略
    先在 Redis 服务端配置文件 redis.conf 中通过 maxmemory 配置项配置 Redis 可用的服务器内存上限
# maxmemory <bytes>

这个配置项默认是注释起来的,说明没有做限制,随着 Redis 占用内存的飙升最终会导致服务器内存耗尽,进而导致部署在这台机器的其他服务,比如数据库、Web 应用等不可用。一般而言,如果这台机器只部署了 Redis 服务,可将其配置为系统内存总量的 80%,否则的话根据其他服务占用内存的情况酌情进行分配即可。
假如我们的机器只用来部署一个 Redis 实例,那么大概留个 1 GB 的内存资源来支撑系统本身的运行即可。
但是如果我们部署多个 Redis 实例,或者还要部署其他系统,那么就要好好计算一翻了;如果设置的最大可用内存过大了,就会导致 Redis 实例因为内存不足而崩溃了。

2. 配置maxmemory-policy 置了 maxmemory 后,一般还要配置 maxmemory-policy 配置项,用于设置 Redis 内存使用量到达上限后的内存清理策略,目前支持以下策略选项

  • noeviction:当 Redis 可用内存不足以存放新写入数据时,新写入操作会报错;
  • allkeys-lru:当 Redis 可用内存不足以存放新写入数据时,移除最近最少使用的 key;
  • allkeys-random:当 Redis 可用内存不足以存放新写入数据时,随机移除某个 key;
  • volatile-lru:当 Redis 可用内存不足以存放新写入数据时,在设置了过期时间的 key 中,移除最近最少使用的 key;
  • volatile-random:当 Redis 可用内存不足以存放新写入数据时,在设置了过期时间的 key 中,随机移除某个 key;
  • volatile-ttl:当 Redis 可用内存不足以存放新写入数据时,在设置了过期时间的 key 中,优先移除即将要过期的 key。
    通常,我们会选择基于 LRU 淘汰算法的内存清理策略,比如 allkeys-lru,关于 Redis LRU 淘汰算法,后面在 Redis 底层原理篇我会详细介绍。