Redis安全



Redis是撒?

Emote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的舒勇ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,默认端口是6379.

Redis与其他key-value缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份


优缺点

优点:

  • 性能极高–Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及Ordered Sets数据类型操作。
  • 原子–Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性–Redis还支持publish/subscribe,通知,key过期等等特性。

缺点:

  • 由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
  • 如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
  • 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。


Redis未授权访问的危害

redis 安全 redis安全版本_安全

Redis在默认情况下会绑定6379端口,如果我们未添加防火墙规则(避免未信任的ip访问),那么Redis服务很可能就会暴露在公网,如果没有设置密码(默认为空),就可能导致任意用户访问目标服务器,登录Redis数据库访问或篡改数据。

config命令可以进行文件读写和一些高危操作

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
  • 攻击者通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。
  • 比如攻击者可以直接将自己的ssh公钥写入到目标服务器/root/.ssh/authorized_keys下,进而可以使用对应的私钥直接登录目标服务器。


Redis安全加固

1、禁止高危命令(重启redis才能生效)

修改redis.conf文件,禁用远程修改DB文件地址。(防止攻击者将ssh公钥写入/root/.ssh/authorized_keys下)

rename-command FLUSHALL “”

rename-command CONFIG “”

rename-command EVAL “”

或者通过修改redis.conf文件,改变这些高危命令的名称

rename-command FLUSHALL “name1”

rename-command CONFIG “name2”

rename-command EVAL ”name3“

2、以低权限运行Redis服务(重启redis才能生效)

为Redis服务创建单独的用户和家目录,并且配置禁止登陆

groupadd -r redis && useradd -r -g redis redis //创建新的用户组redis,并将redis用户添加到redis用户组中

3、为Redis添加密码验证(重启redis才能生效)

修改redis.conf文件,添加requirepass mypassword

4、禁止外网访问Redis(重启redis才能生效)

修改redis.conf文件,添加或修改,使得Redis服务只在当前主机可用 bind 127.0.01

在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错。

5、修改默认端口

修改配置文件redis.conf文件,Port 6379

默认端口是6379,可以改变成其他端口(不要冲突就好)

6、保证authorized_keys文件的安全

为了保证安全,应该阻止其他用户添加新的公钥。

  • 将authorized_keys的权限设置为对拥有者只读,其他用户没有任何权限:chmod 400 ~/.ssh/authorized_keys
  • 为保证authorized_keys的权限不会被改掉,还需要设置该文件的immutable位权限:chattr +i ~/.ssh/authorized_keys
  • 然而,用户还可以重命名/.ssh,然后新建新的/.ssh目录和authorized_keys文件。要避免这种情况,需要重新设置~/.ssh的immutable权限:chattr +i ~/.ssh

小结:

所谓攻防既是对立又是统一的,从攻击的角度思考指定防御措施再好不过。为了防止攻击者远程登录redis数据库,那么我们可以添加密码验证、禁止外网访问Redis、修改默认端口、以低权限运行并配置禁止登录;为了防止攻击者将自己的ssh公钥写入/root/.ssh/authorized_keys,我们可以禁止高危命令的使用(置空或改名)、保证authorized_keys文件的安全性(设置只读权限、设置immutable位权限)。