redis客户端命令及安全策略

redis连接命令

Redis 连接命令是主要用于验证 Redis 服务器的连接状态,比如验证客户端与 Redis 服务器是否连接成功,以及检查服务器运行状态,以及是否断开当前连接等。

我们知道,只有当客户端与服务器正常连接后才能够实现彼此的交互、通信。Redis 通过“Redis序列化协议”(简称“RESP”),实现客户端与服务端之间的连接通信,该协议主要包括两个部分:网络模型和序列化协议。

  • 网络模型主要负责数据交互的组织方式;
  • 序列化协议则实现了数据的序列化;

由此可知,客户端与服务端交互的数据是以序列后的协议数据进行传输的。

下面是一个简单的请求/响应示意图,如下所示:
redis客户端与服务器交互


Redis连接命令列表

命令	说明
AUTH password	验证密码是否正确
ECHO message	打印字符串
PING	查看服务是否运行正常
QUIT	关闭当前连接
SELECT index	切换到指定的数据库

连接命令应用

1) 建立连接

在确认 Redis 已经成功配置之后,开启一个客户端与服务器的连接,执行以下命令:

C:\Users\Administrator>redis-cli
127.0.0.1:6379>

2) 验证连接

下面看一组实例演示:

#通过配置文件或者或者config命令配置客户端连接密码
redis 127.0.0.1:6379> CONFIG SET requirepass 123456
OK
#验证给定的密码和配置文件密码是否一致
redis 127.0.0.1:6379> AUTH 123456
OK
#检测客户端与服务器是否连接正常
redis 127.0.0.1:6379> PING
PONG
#切换到2库
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> ECHO "hello www.catroom.com.cn"
"hello www.catroom.com.cn"
#中断连接
127.0.0.1:6379> QUIT
C:\Users\Administrator>

上述示例,通过AUTH命令验证密码,从而证明了客户端已经连接到了 Redis 服务,然后我们使用 PING 命令来检测服务器运行是否正常。


Redis客户端命令

Redis 提供了一些操作客户端(client)的命令,比如查询所有已连接到服务器的客户端数量,控制客户端的连接状态(关闭或者挂起)等。通过客户命令我们可以轻松的实现对客户端的管理、控制。

Redis 服务器通过监听 TCP 端口的方式来接受客户端的连接。当一个连接建立后,Redis 会自动执行以下过程:

  • 首先客户端 socket 被设置为非阻塞模式,这是因为 Redis 在网络事件处理上采用了非阻塞式 IO(即 IO 多路复用模型);
  • 其次设置 socket 的 TCP_NODELAY 属性,从而禁用 Nagle 算法;
  • 最后创建一个可读的文件事件,用它来监听客户端 socket 的数据发送。

Redis 使用命令的格式向客户端输入数据,这个数据量是非常小的。当向客户端输入命令后,我们希望能快速的得到服务器的应答,也就是低延时性,但如果开启了Nagle算法就会出现频繁延时的现象,导致用户体验极差。

TCP_NODELAY 控制是否开启 Nagle 算法,该算法可以提高广域网传输效率,减少分组的报文个数,适合传输体量较大的数据。

Redis IO多路复用

Redis 的底层是一个单线程模型,单线程指的是使用一个线程来处理所有的网络事件请求,这样就避免了多进程或者多线程切换导致的 CPU 消耗,而且也不用考虑各种锁的问题。

Redis 为了充分利用单线程,加快服务器的处理速度,它采用 IO 多路复用模型来处理客户端与服务端的连接,这种模型有三种实现方式,分别是 select、poll、epoll。Redis 正是采用 epoll 的方式来监控多个 IO 事件。当客户端空闲时,线程处于阻塞状态;当一个或多个 IO 事件触发时(客户端发起网路连接请求),线程就会从阻塞状态唤醒,并同时使用epoll来轮询触发事件,并依次提交给线程处理。

注意:“多路”指的是多个网络连接,“复用”指的是复用同一个线程。多路 IO 复用技术可以让单个线程高效的处理多个连接请求。

客户端最大连接数

在 Redis 配置文件中,有一个maxclients的配置项,它指定了连接到 Redis 服务器的最大客户端数量。其默认值是 10000。配置项如下所示:

127.0.0.1:6379> config get maxclients
"maxclients"
"10000"

#更改最大连接数量
127.0.0.1:6379> config set maxclients 20000
OK
127.0.0.1:6379> config get maxclients
"maxclients"
"20000"

常用命令

命令	说明
CLIENT LIST	以列表的形式返回所有连接到 Redis 服务器的客户端。
CLIENT SETNAME	设置当前连接的名称。
CLIENT GETNAME	获取通过 CLIENT SETNAME 命令设置的服务名称。
CLIENT PAUSE	挂起客户端连接,将所有客户端挂起指定的时间(以毫秒为计算)。
CLIENT KILL	关闭客户端连接。
CLIENT ID	返回当前客户端 ID。
CLIENT REPLY	控制发送到当前连接的回复,可选值包括 on|off|skip。

命令应用

下面看一组简单的使用示例,如下所示:

127.0.0.1:6379> CLIENT ID
(integer) 2557
127.0.0.1:6379> CLIENT LIST
id=2556 addr=127.0.0.1:64684 fd=30 name= age=2422 idle=339 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=2557 addr=127.0.0.1:49502 fd=43 name= age=537 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> CLIENT REPLY ON
OK
127.0.0.1:6379> CLIENT SETNAME "www.catroom.com.cn"
OK
127.0.0.1:6379> CLIENT GETNAME
"www.catroom.com.cn"
127.0.0.1:6379> CLIENT KILL 127.0.0.1:49502
OK

redis安全策略

Redis 提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。Redis 密码设置主要有两种方式:一种是使用CINFIG命令来设置密码;另外一种则是手动修改 Redis 的配置文件。虽然看似前者更为简单,其实两种方式各有特点。本节将对它们进行介绍。

命令配置密码

通过执行以下命令查看是否设置了密码验证:

127.0.0.1:6379> CONFIG get requirepass
"requirepass"
""

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

下面执行以下命令设置密码。如下所示:

127.0.0.1:6379> CONFIG set requirepass "www.catroom.com.cn"
OK
127.0.0.1:6379> CONFIG get requirepass
"requirepass"
"www.catroom.com.cn"

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

127.0.0.1:6379> set key name www.catroom.com.cn
#报错无法操作
(error) NOAUTH Authentication required.
使用AUTH命令验证密码:

127.0.0.1:6379> AUTH www.catroom.com.cn
OK
#执行命令成功
127.0.0.1:6379> SET name www.catroom.com.cn
OK
127.0.0.1:6379> GET name
www.catroom.com.cn

注意:通过命令行设置的密码并非永久有效,当您重启服务后密码就会失效,所以一般不采用这种方式。下面介绍一种永久有效的修改方式,也就是手动配置密码。

手动配置密码

手动修改配置密码也非常的简单,首先,您要在 Redis 的安装目录中找到 redis.windows.conf 配置文件,然后打开该文件,并使用 Ctrl+F 搜索 requirepass 关键字,找到配置项并配置密码,如下所示:

# requirepass foobared
requirepass www.catroom.com.cn //配置自己的密码

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

#首先停止服务:
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 www.catroom.com.cn
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)"www.catroom.com.cn"

手动配置无须验证密码,只需要重新启动 Redis 服务器。这种配置方式,密码永远有效。如果想取消密码设置,您需要将配置文件更改回原来的状态,然后再次重启服务器,即可取消。

除了需要为 Redis 配置密码外,我们在使用 Redis 时也需要注意一些常见的安全风险以及防范措施,从而避免数据泄露和丢失,以及人为操作失误等。

指令安全

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

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

rename-command keys 123keys123

如果您还想执行 keys 命令,那就需要在命令行输入123keys123。 当然也可以将指令 rename 成空字符串,这样就无法通过字符串来执行 keys 命令了。

rename-command flushall ""

端口安全

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

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

bind 193.168.1.1 #绑定外网ip地址

不仅如此,还可以增加 Redis 的密码访问限制,客户端必须使用 auth 命令传入正确的密码才可以访问 Redis。

requirepass yourspassword

这样即使地址暴露出去了,普通黑客也无法对 Redis 服务器进行任何指令操作。

密码配置也会影响到主从复制。要求从机必须配置与主服务相同的密码才可以进行主从复制。

masterauth yourspassword

SSH代理

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