likes
comments
collection

Redis数据库安全之旅

作者站长头像
站长
· 阅读数 17

本篇文章基于的Redis 的环境为: redis_version:7.0.5

文档内容均为学习Redis 官方文档心得.

前端小弟现丑了!

前言

Redis相信大家都或多或少都听说过吧,作为内存数据库的代表, 但是近些年Redis 被攻击的典范也是越来越多,我们将如何防护Redis 安全呢? 跟着我们的脚本,来看看这篇文章吧.

对于Redis而言,我们设置的方法大概有以下几种

  • 通过redis.conf 设置。
  • 在已经启动的Redis 中使用CONFIG SET 来设置。

如之前所述,安全方面归根结底,总结一句话就是:最好的安全设置就是最小化权限。

那我们来看下,Redis 有哪些安全设置呢?

开放最小化很重要

作为Redis 服务器而言, 应该仅允许受信任的客户端访问,其他访问都应该拒绝,因此也善用防火墙相当重要,当然这个防火墙不是在Redis 是做不了的,应该在Redis 所属的机器进行设置。

若该Redis 是自建于本地实体机中,那么应该考虑防火墙软件,例如: iptablesfirewalld 等。若是存在于各云厂商实例中(ECS ),那么应该善用云厂商提供的防火墙。

那我们Redis 在这一步就什么也不能做了么? 不是的,在Redis 配置中,有一个配置参数为bind ,该参数选项是将Redis对相应的网卡监听,若配置如下:

bind 127.0.0.1

则监听在本地的回环地址上,若该值为空,则监听所有的网卡(3.2版本提供的功能)。

若想监听在多个网卡上的话,ip 地址直接可以使用空格分开即可,例如:

bind 127.0.0.1 10.0.2.15

则该配置则是监听到127.0.0.1 以及 10.0.2.15 网卡上。

在已经启动的Redis 中,想查看Redis 监听到哪些网卡上,除了查看所属机器的网路状态外,还可以通过CONFIG GET bind 来获取。

除此之外,Redis还为我们提供了"保护模式",即配置: protected-mode ,默认为yes 。请不要关闭它,因为它能够检测到启动后的Redis 是否安全,其检测策略为:当Redis 没有设置密码的时候,从外部进行访问,这就会触发它的保护模式,即向访问用户提示信息: Redis is running in protected mode because protected mode is enabled and no password is set for the default user.

当然网上很多博客提供的最快解决如上问题的方法是关闭其保护模式,请不要这么做.

认证不可少

接上一段落,若Redis 想从外部进行访问,除了关闭保护模式以外,还可以设置Redis 密码. 在Redis 中,通过配置requirepass 来设置密码,不过设置密码应当注意一下,Redis 密码不应该设置为若密码,建议设置为复杂密码.

原因如下:

  • 客户端在校验身份的时候,使用的是auth 命令,可以理解为是Redis 的普通命令,即能够被无限执行,换言之有被爆破的可能.
  • redis-cli可以通过加载客户端的redis.conf 文件来校验服务器, 不需要管理员记住密码.

如上所属,客户端在校验身份的时候,发送的是auth 命令,该命令可以理解为Redis 的普通命令,是没有被加密的, 若请求报文被监听了,也有泄密的可能. 所以尽可能的使用加密进行通信,即: SSL/TLS.

防止管理员误操作也很重要

Redis中有一些非常危险的命令,例如: FLUSHALL ,FLUSHDB ,该命令前者是清空所有的数据,后则是清空当前库的数据, 在日常工作中,如果误操作了,那后果不堪设想. 还有一些命令,运行后可能会导致系统阻塞,非常不建议使用,例如:KEYS ,HGETALL等.

基于上述情况,禁用某些命令来保证系统安全是非常有必要的, 好在Redis给我们提供了方法. 若想禁用某些命令,可以在其服务器redis.conf 配置文件中,使用rename-command 指令,例如:

rename-command FLUSHALL ""
rename-command FLUSHDB ""

若设置为空的话,则是禁止使用命令.修改配置,启动服务器后,若再使用这些命令,即会报错: ERR unknown command .

若并非想禁用命令,而是想重命名命令,那么将空字符串修改为重命名后的命令即可,例如:

rename-command KEYS FINDALL

设置后,即可使用FINDALL 来代替KEYS , 案例如下:

127.0.0.1:6379> set juejinNmae pdudo
OK
127.0.0.1:6379> FINDALL *
1) "juejinNmae"
127.0.0.1:6379> 

担心网络被监听? 开启TLS之旅吧

开启ssl/tls 后势必会降低Redis 的吞吐量,所以是否采用该配置主要还是看业务情况,若业务想要避免被抓包等,适合开启该设置,若仅在某一内网使用,那就没必要的.

Redis 6.0 以后启用了SSL/TLS ,但是注意, 若想使用SSL/TLS 的话,在编译的时候需要指定make BUILD_TLS=yes , 这里需要注意的是, 客户端和服务器都需要编译才行.

这里简单举个例子如何启动Redis吧.

证书生成

openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

数据库启动

redis-server --tls-port 6379 --port 0  --tls-cert-file ca.crt --tls-key-file ca.key  --tls-ca-cert-file ca.crt

客户端连接

redis-cli --tls --cert ca.crt --key ca.key  --cacert ca.crt

在使用SSL/TLS 后,我们需要禁用非TLS 端口并且开启SSL/TLS 端口后,可以直接设置:

port 0
tls-port 6379

这样的话,通过6379 连接,默认情况下是走的SSL/TLS

总结

安全一直是大家比较关心的话题,在Redis 中,我们不仅仅要防外部入侵, 还要知道, 技术人员的误操作也许破坏的更为严重, 始终需要记住, 权限最小化.不仅对外,也需要对内.

好了,今天的文章就介绍到这里吧. 快动动你的小手来试试吧.

本文正在参加「技术专题19期 漫谈数据库技术」活动 ”