Redis 为了安全提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。为了保证网络安全,提供了 bind 功能,只允许 Redis 接收来自指定网卡的请求。以及对重要的命令使用 rename-command 进行重命名,让重要命令其他人难以猜测。
Redis 设置密码主要有两种方式,分别通过命令(CONFIG SET)和修改配置文件的方式来设置密码。
(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 配置文件来配置密码也非常的简单。
首先,您要在 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 ""
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 (点击了解)。 其功能虽然单一,但使用起来比较简单,易于理解。