Redis 安全

Redis 为了安全提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。为了保证网络安全,提供了 bind 功能,只允许 Redis 接收来自指定网卡的请求。以及对重要的命令使用 rename-command 进行重命名,让重要命令其他人难以猜测。

设置密码

Redis 设置密码主要有两种方式,分别通过命令(CONFIG SET)和修改配置文件的方式来设置密码。

使用 CONFIG 命令来设置密码

(1)通过执行 CONFIG GET requirepass 命令查看是否设置了密码验证,如下:

127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

注意,在默认情况下 requirepass 参数值为空的,表示无需通过密码验证就可以连接到 Redis 服务。

(2)通过执行 CONFIG SET requirepass 命令设置密码。如下:

127.0.0.1:6379> CONFIG set requirepass "aaaaaa"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "aaaaaa"

注意,执行完上述操作后,客户端要连接到 Redis 服务就需要密码验证。如果不验证就无法操作 Redis 数据库。如下所示:

127.0.0.1:6379> set key mySite www.hxstrive.net
# 报错无法操作,没有授权
(error) NOAUTH Authentication required.

使用AUTH命令验证密码:

127.0.0.1:6379> AUTH aaaaaa
OK
# 执行命令成功
127.0.0.1:6379> SET mySite www.hxstrive.net
OK
127.0.0.1:6379> GET mySite
"www.hxstrive.com"

注意,通过命令行设置的 Redis 密码并非永久有效,当您重启 Redis 服务后密码就会失效,所以一般不采用这种方式,也不推荐。

手动修改 redis.conf 配置文件

通过手动修改 Redis 配置文件来配置密码也非常的简单。

首先,您要在 Redis 的安装目录中找到 redis.windows.conf 配置文件(Linux 中配置文件为 redis.conf),然后编辑该配置文件,找到配置项 requirepass 并配置密码。如下所示:

# requirepass foobared
# 下面配置自己的密码,密码为:aaaaaa
requirepass aaaaaa

然后,使用更改后的配置文件重启服务器,依次执行以下命令:

# 停止服务
C:\Users\Administrator>redis-server.exe --service-stop
# 重启服务器
C:\Users\Administrator>redis-server.exe --service-start
# 重新登陆
C:\Users\Administrator>redis-cli.exe -h 127.0.0.1 -p 6379 -a aaaaaa
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 命令执行成功
127.0.0.1:6379>config get requirepass
1)"requirepass"
2)"aaaaaa"

注意,这种配置方式的密码永远有效。如果想取消密码设置,您需要将配置文件更改回原来的状态,然后再次重启服务器,即可取消。除了需要为 Redis 配置密码外,我们在使用 Redis 时也需要注意一些常见的安全风险以及防范措施,从而避免数据泄露和丢失,以及人为操作失误等。

命令重命名

Redis 有一些非常危险的命令,这些命令会对 Redis 的稳定以及数据安全造成非常严重的影响。比如 keys 指令会导致 Redis 卡顿,而 flushdb 和 flushall 会让 Redis 的所有数据全部清空。那么如何避免这些操作失误带来的灾难性后果呢?

Redis 在配置文件中提供了 rename-command 指令用于将某些危险的指令进行重命名,避免人为误操作。比如在配置文件的 security 模块增加以下内容:

################################## SECURITY ###################################
# ...
# rename-command CONFIG ""
rename-command keys hxstrive_keys

修改配置后,重启 Redis 服务器。此时,如果您还想执行 keys 命令,那就需要在命令行输入 hxstrive_keys。 当然也可以将指令 rename 成空字符串,这样就无法通过字符串来执行 keys 命令了。例如:

################################## SECURITY ###################################
# ...
# rename-command CONFIG ""
rename-command flushall ""

bind 功能

Redis 默认监听 *:6379。如果当前的服务器主机有外网地址,那么 Redis 的服务将会直接暴露在公网上,别有用心的人使用适当的探测工具就可以对 IP 地址进行端口扫描,从而威胁您的系统安全。

如果 Redis 的服务地址一旦可以被外网直接访问,其内部数据就彻底丧失了安全性。黑客们可以通过 Redis 执行 Lua 脚本拿到服务器权限,然后清空您的 Redis 数据库。因此务必在 Redis 的配置文件中绑定要监听的 IP 地址,避免类似的情况发生。如下所示:

################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
bind 193.168.1.1

注意,bind 配置不是用于监听连接 Redis 服务的客户端 IP,而是 Redis 服务绑定到本机的 IP 上。当你使用一个非 ifconfig 查看出的 ip 时,服务是启动不起来的,0.0.0.0 不是一个 ip,但是可以用于表示本机所有的 ipV4 地址,比如一般云服务器,执行 ifconfig 命令时包含了内网络 ip 和回环 127.0.0.1,服务绑定到 0.0.0.0 就意味着包含这两个ip。如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
   inet 172.18.0.8  ......

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
   inet 127.0.0.1  ......

注意,下面配置:

  • bind 127.0.0.1 只有本地可以访问 Redis

  • bind 172.18.0.8 (对应 eth0 网卡 - 本机内网IP) 只有通过该网卡进来的请求才能访问 Redis

  • bind 0.0.0.0  即上面两折都包含,所以当使用云服务器绑定的弹性外网 ip 来访问服务器上的 redis 时,都是通过 eth0 这个网卡的请求,所以都可以访问 redis 了。

注意:Redis 不支持 SSL 链接,这意味着客户端和服务器交互的数据不应该在公网上传输,否则会有被窃听的风险。如果必须要在公网上,可以考虑使用 SSL 代理。SSL 代理比较常见的有 ssh。Redis 官方也推荐了一种代理工具,也就是 spiped (点击了解)。 其功能虽然单一,但使用起来比较简单,易于理解。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号