关于redis的访问控制

保护模式

为了防止redis实例收到外部网络的攻击,redis在3.2.0版本之后加入了保护模式的概念。当保护模式有效时,保护模式下只响应本地回环接口(127.0.0.1/localhost/0.0.0.0)的访问,从其他地址仍然可以与服务器建立redis连接,但是执行命令会提示错误,并提示如何处理这种错误。

保护模式必须符合以下条件才会有效:

  • 没有bind任何ip,包括回环接口
  • 没有设置账号密码
  • 保护模式设置为yes protected-mode=yes

redis默认是开启保护模式的,这里模拟一下保护模式的效果。

模拟条件:

#不绑定任何ip----1
127.0.0.1:6370> config get bind
1) "bind"
2) ""
#不设置密码
127.0.0.1:6370> config get requirepass
1) "requirepass"
2) ""
#启动保护模式
127.0.0.1:6370> config get protected-mode
1) "protected-mode"
2) "yes"

指定ip连接:

[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

报错,并提供了四种从外网访问服务的解决办法。四种方法选择任意一种即可。

  • 通过命令CONFIG SET protected-mode no关闭保护模式
  • 修改配置文件protected-mode no重启服务
  • 重启服务,在启动命令中指定--protected-mode no,关闭保护模式
  • bind一个IP地址或者设置一个密码。

解决方法

以上四种解决方法中的前三种都是关闭保护模式,第四种是不关闭保护模式。下面我们针对这两种方式进行测试。

方式1 关闭保护模式

关闭保护模式的方式有3种。

方式1,使用redis-cli客户端,通过命令关闭保护模式,不需要重启服务。

#查看保护模式状态
localhost:6370> config get protected-mode
1) "protected-mode"
2) "yes"
#关闭保护模式
localhost:6370> config set protected-mode no
OK
#查看保护模式状态,确认修改成功
localhost:6370> config get protected-mode
1) "protected-mode"
2) "no"
#将当前配置重写进配置文件,防止下次重启失效。
localhost:6370> config rewrite
OK

方式2,修改reids.conf配置文件,需要重启服务。

#修改配置文件
vi redis.conf

#将protected-mode改为no
protected-mode no

#保存 重启服务

方式3,通过redis-server选项--protected-mode no关闭保护模式,重启服务。

redis-server /etc/redis/single-6370.conf --protected-mode no

测试结果通过:

[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(empty list or set)

方式2 绑定ip或者指定密码

  • 绑定ip

例如:redis服务器的ip为192.168.25.66,那么允许其他服务器通过这个ip访问redis的操作如下。注意,如果未绑定回环接口的,本地地址是访问不通的。

注意:如果需要访问所有的本地ip的话,可以直接绑定源地址0.0.0.0,0.0.0.0指的是本机上的所有IPV4地址。

#修改配置文件
$ vi redis.conf

#追加绑定ip,未绑定127.0.0.1不能从本地访问
bind 192.168.25.66
#绑定多个ip
#bind 127.0.0.1 192.168.25.66

#保存重启

查看已绑定的ip。

192.168.25.66:6370> config get bind
1) "bind"
2) "192.168.25.66"

测试结果通过:

[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(empty list or set)
  • 方式2,不绑定ip,指定密码

方法1,命令修改密码,不用重启服务。

192.168.25.66:6370> config get requirepass
1) "requirepass"
2) "foobared"
192.168.25.66:6370> config set requirepass newpwd
OK
192.168.25.66:6370> config rewrite
OK

方法2,修改配置文件,需要重启服务。

#修改配置文件redis.conf

#添加
requirepass foobared

#保存重启

测试结果通过:

[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> auth foobared
OK
192.168.25.66:6370> keys *
(empty list or set)

 

你可能感兴趣的:(redis)