Redis安全性

本文从以下几个方面提供了一个关于Redis安全主题的介绍:Redis提供的访问控制机制、代码安全问题以及外部恶意输入触发的攻击等类似的主题。

出于安全考虑的联系人,请在GitHub上打开issue,或者当你觉得保护通信安全非常重要时,可以使用本文末尾提供的GPG密钥。

Redis常规安全模式

Redis被设计成在被信任的环境中被信任的客户端才可以访问。这意味着将Redis实例直接暴露在互联网中或者一个不可信的客户端可以直接访问Redis的TCP端口或者UNIX套接字的环境中并不是一个好主意。

比如说,在一个常规的使用Redis作为数据库、缓存或是消息系统的web应用上下文中,网站前端客户端会查询Redis来生成页面,或者执行所请求的操作,或者是被web应用程序的用户触发。

在这种场景中,web应用程序需要处理处于Redis和不可信客户端(访问web应用程序的用户浏览器)之间的访问请求。

这是一个特殊的例子,但是总体来说,不可信的访问请求应该被实现了ACLs的中间层处理掉,通过校验用户输入来决定可以对Redis实例执行什么操作。

总的来说,Redis没有为了实现最大安全性而进行优化,而是为了最好的性能和易用性。

网络安全

Redis端口不应该对所有人都开放,而应该是只有网络中被信任的客户端才可以访问Redis端口,因此运行着Redis的服务器应该只能被用Redis实现应用程序的计算机直接访问。

一般情况下,一台直接暴露在互联网中的计算机,比如一台虚拟的Linux机器,防火墙应该阻止外部请求访问Redis端口。客户端仍然可以可以使用loopback接口来访问Redis。

通过在redis.conf文件中增加这样一行配置就可以把Redis绑定到单个接口上:

bind 127.0.0.1

由于Redis本身的特性,一旦不能阻止外部不可信的请求,将会产生巨大的安全隐患。比如说,一个简单的FLUSHALL命令就可以被外部攻击者用来删除Redis上的全部数据集。

保护模式

然而不幸的是很多用户都没有保护他们的Redis实例以防止外部网络攻击。很多实例都通过公开的IP被简单暴露在网络中。正式由于这个原因,从Redis3.2.0开始,如果Redis只是使用了默认的配置,不需要密码就可以访问它,那么它将进入一个被称为保护模式的特殊模式。在这个模式中,Redis只会响应loopback接口的查询请求,二队连接至其它地址的客户端返回一个错误,在这个错误信息里会解释需要如何正确地配置Redis。

我们如此迫切地期望这种受保护的模式来减少安全问题,这些问题是由于未被保护的Redis实例执行没有正确管理的请求引起的。然而系统管理员还是会忽视Redis给出的错误提示并且禁用保护模式或者是手动绑定所有接口。

认证特性

虽然Redis没有尝试实现访问控制机制,但是它提供了一个轻量级的认证方式,该认证可以通过编辑redis.conf文件来启用。

开启认证层后,Redis将会拒绝所有未认证客户端的请求。一个客户端可以通过发送AUTH命令和密码来通过认证。

密码是系统管理员在redis.conf文件中以明文形式配置的。密码应该足够的长以便可以防止暴力破解,这样做有两个原因:

  • Redis响应请求的速度是很快的。一个外部客户端每秒钟可以测试很多不同的密码。
  • Redis密码被存储在客户端内置的配置文件redis.conf中,因此系统管理员不需要记住密码,因此密码可以非常长。

认证层的目标是提供多一层的保护。如果外部攻击者攻破了防火墙或者其它保护Redis的系统,如果没有认证密码,外部客户端还是无法访问Redis实例。

和其它Redis命令一样,AUTH命令发送时也是没有加密的,因此它并不能防止有足够网络访问权限的攻击者进行窃听。

支持数据加密

Redis并不支持加密。

Data encryption support

Redis does not support encryption. In order to implement setups where trusted parties can access a Redis instance over the internet or other untrusted networks, an additional layer of protection should be implemented, such as an SSL proxy. We recommendspiped.

results matching ""

    No results matching ""