0%

Redis机器产线优化

随着公司Redis使用规模越来越大,redis安全也展现出来了,所以我们经过分析研究做出如下总结。

Redis在部署时,需要满足一下条件则会变得更加安全:

禁止root用户启动redis

为 Redis 服务创建单独的用户和home目录,使用普通用户启动,安全性往往高很多。

Redis版本升级

产线使用Redis版本不应落后于最新稳定版两个大版本以上,目前我们建议使用6.2.1并不低于4.0.0。

禁用或重命名高风险命令

config, shutdown, flushdb/flushall,bgsave/save

1
2
3
4
rename-command CONFIG CONFIG_b840fc02d5240454
rename-command FLUSHDB "" #禁用此命令
rename-command FLUSHALL "" #禁用此命令
rename-command SAVE "" #可以选用BGSAVE替代

风险项:如果rdb和aof包含了rename之前的命令,会导致无法启动。另源码中有些会写死,例如sentinel在修改配置时使用了config命令,可能会导致sentinel无法工作

开启redis密码,并设置高复杂度密码

redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。

redis因查询效率高,auth这种命令每秒能处理10w次以上,简单的redis的密码极容易为攻击者暴破。
requirepass至少长度20位以上,为方便可使用一个特殊串sha256sum命令生成64位的无特殊字符串。

1
2
$echo "dfasdERQEWRQEW31341dfadsfadsf" | sha256sum
af970b3691a0774b2a5adae1375e14cd9e5db3591564f0eb789c2324cc02362f -

配置redis监听本地地址

redis.conf配置文件:
bind 127.0.0.1 192.168.13.12

如果服务器有公网地址,通过配置内网访问地址,限制只能通过内网访问到redis。 如果只有本机服务访问redis,则配置127.0.0.1以限制其他机器访问Redis。

修改redis默认端口

避免使用redis官方端口6379 7000,因为官方端口可以让黑客快速识别Redis服务。

采用容器部署

通过容器部署可以隔离redis和服务器,可以不再考虑启动账户和文件权限问题。使用容器部署可能会对Redis带来极小的性能损耗。

以下为Redis被攻击的详细步骤

1
2
3
4
5
6
7
8
1. 恶意扫描6379端口(redis 默认端口), 确定包含redis服务, 并试图ssh登录,  因为Redis服务器并无攻击者public key, 登录失败
2. 使用redis 客户端连接redis服务器, 执行redis命令(del, flushdb, flushall)清除所有redis数据
3. 使用“config dir” 命令将 redis 数据备份路径至 /root/.ssh/
4. 使用“config filename”指定 RDB(redis定时备份) 备份文件名称为authorized_keys
5. 设置crackit key, 将value设置为恶意访问者的公钥
6. 执行bgsave, save动作触发RDB数据备份,将攻击者公钥存储在authorized_keys
7. 攻击者ssh到redis 服务器成功

根据以上攻击方式,我们只要在任意环节做了限制,通过Redis获取服务器权限都无法实现。
因此我们做如下建议:

  1. 部署新服务尽量满足以上条件。
  2. 如果现有服务不方便重新部署时,通过禁用或重命名高风险命令这项快速打断攻击路径也是很好的选择。