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在默认情况下会绑定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位权限)。