Redis数据库安全手册

Redis是一个高性能的key-value数据库,这两年可谓火的不行。而Redis的流行也带来一系列安全问题,不少攻击者都通过Redis发起攻击。本文将讲解这方面的内容,包括Redis提供的访问控制和代码安全问题,以及可以由恶意输入和其他类似的手段触发的攻击。

Redis通用安全模块

Redis被设计成只能由可信环境的可信机器访问。这意味着将它直接暴露在互联网或者其他可以由不可信机器通过TCP或者UNIX SCOKET直接连接的环境中。

例如,在通常的WEB应用程序使用Redis作为数据库,cache,或者消息系统。WEB应用程序的客户端将查询Redis生成页面或执行请求或由用户触发。在这个例子中,WEB应用链接了Redis和不可信的客户端。

这是一个特定的例子,但是一般来说,不授信的Redis链接应该被监控,验证用户输入,再决定执行什么样的操作。因为,Redis追求的不是最大的安全性,而是简洁与高效。

网络安全

Redis链接应该对每个受信的客户端开放。所以,服务器运行的Redis应该只被使用Redis应用的计算机连接。在大多数直接暴露在互联网的单个计算机,例如,虚拟化的LINUX实例(LINODE,EC2,.....)

Redis端口应该被防火墙阻止来自外部的访问。客户端应该仍然能通过服务器的本地回环接口访问Redis。注意,通过在Redis.CONF添加下面一句就可以绑定本地回环,阻止外网访问了。

bind 127.0.0.1

因为Redis的特性,没有对外网访问进行限制会是一个很重大的安全问题。例如一条简单的FLUSHALL命令就能被攻击者用来删除整个数据设置。

身份验证机制

如果你们不想使用访问限制的话,Redis提供了一个身份验证功能,可以通过编辑Redis.CONF文件来实现它。

如果开启了身份验证功能,Redis将拒绝所有的未身份验证的客户端的所有操作。客户端可以发送AUTH命令+密码来验证自己。

密码是由系统管理员在Redis。CONFIG文件中设置的明文密码,为了防止暴力破解攻击他应该足够长。原因有两个:

Redis的执行效率非常快,外部设备每秒可以测试相当数量的密码

Redis的密码是存储在Redis.conf文件和内部客户端的配置中的,因此不需要管理员记住。所以可以使用相当长的密码。

身份验证的目标是提供第二层的安全保障。这样当防火墙或者其他第一层的系统安全设置失效的话,一个外部设备在没有密码的情况下仍然不能访问redia。

AUTH命令像其他的redia命令一样是不加密传输的,所以他不能阻止攻击者在内网的窃听。

数据加密支持

Redis不支持加密。为了受信的客户端可以以加密形式通过互联网可以采用加密协议(SSL)传输数据。

禁用特定的命令

禁用Redis的一些命令是可行的,或者将他们改名。这样来自客户端的请求就只能执行有限的命令。

例如,虚拟的服务器提供商可能提供托管的Redis服务。在这种情况下,普通用户不应该能够调用Redis的配置命令来修改该配置实例,但提供和删除服务的系统能够有这样的权限。

在这种情况下,从命令表中重命名命令或者完全隐藏命令是可能的。这个功能可用在Redis.conf配置文件里做为一个声明。例如:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

在上面的例子里,CONFIG命令被更名为一个更为陌生的名字。它也完全可以被重命名成空字符串,例如:

rename-command CONFIG ""

由精密的输入触发的攻击

还有一类攻击,攻击者即使没有获得数据库的访问权限也可以从外部发起攻击。一个此类攻击的例子是通过Redis的内部函数向Redis里插入数据。

攻击者可以通过一个web表单将一组字符串提交到一个hash的同一个堆栈,引起时间复杂度从O(1)到O(n) ,消耗更多的CPU资源,最终导致DOS攻击。为了防止这种特定的攻击方式,Redis为每个执行请求随机分配hash。

Redis使用快速排序算法来执行SORT命令。目前,这个算法不是随机的,所以通过对输入的精细控制可能触发命令的二次执行。

字符串转义和NOSQL注入

Redis协议里面没有字符串转义相关的内容,所以在通常情况下是不存在注入的。Redis协议使用的是前缀长度的字符串,完全二进制,保证安全性。LUA脚本执行EVAL和EVALSHA命令时遵循相同的规则,因此这些命令也是安全的。

然而这回事一个非常奇怪的用例,应用程序应该避免使用LUA脚本获取来自非信任源的字符串。

代码安全性

在经典的Redis 设置里,客户端可以执行所有的命令集,但是获得的用例应该永远不能导致有控制Redis所在系统的能力。内在的,Redis使用众所周知的安全代码规范来防止缓冲区溢出,格式错误和其它内存损坏问题。然而,客户端拥有控制使用服务器配置命令CONFIG的能力使得其能够改变程序的工作目录和转储文件的名称。这允许客户端写RDB Redis在随机路径写文件。这是一个安全问题,容易导致客户端有Redis运行非法代码的能力。

Redis不需要root权限运行,也不建议以root权限运行。Redis的作者正在调查添加一条新的配置参数来防止CONFIG SET/GET 目录和其他类似的运行时配置的指令的可能性。这会阻止客户端强制服务器在任意位置写Redis转储文件。

GPG key

安全研究人员可以在Github提交问题,当你感觉这个安全问题真的很重要,在文档的末尾加上GPG标识。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2015-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

23- vue django restful framework 打造生鲜超市 - 通过docker实现sentry搭建错误日志监控系统

Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 线上演示地址: http://vueshop.mt...

38110
来自专栏java一日一条

JVM 开发者必看:傻瓜式编译 OpenJDK 7

LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇...

1012
来自专栏杨建荣的学习笔记

PostgreSQL主备环境搭建

PG学习初体验--源码安装和简单命令(r8笔记第97天) 记得在2年前写过一篇PostgreSQL的文章,当时处于兴趣,本来想在工作中接一下PG的业务,最后因为...

4606
来自专栏实用工具入门教程

如何部署邮件服务

邮件服务器是一种应用程序,它使我们能够以电子邮件的形式在组织的不同用户之间或在其外部发送消息,而不依赖于他们所连接的网络。我们将在邮件服务器中使用的基本术语是:...

5803
来自专栏北京马哥教育

能当主力,能入虚拟机,还能随时打包带走,Linux 就是这么强大

这里介绍一下自己管理自己的Linux桌面的一点经验吧,我觉得还是有不少可取之处的。先来说一下大多数人管理Linux桌面的方法有哪些不方便的地方吧:

2570
来自专栏PHP在线

3种web会话管理的方式

http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道是哪个客户端地址发过来的,但是对于我们的应用来...

1883
来自专栏JAVA高级架构

高并发解决方案--负载均衡

2262
来自专栏Rainbond开源「容器云平台」

好雨云帮每周更新日志(2017.02.27-2017.03.12)

1173
来自专栏Java工程师日常干货

【SpringBoot专题】监控健康状况前言监控插件:actuatorSpring Boot Admin:可视化后台管理系统总结

想一想,我们以前是如何监控一个Java应用的监控状况的?一般而言,我们会在Linux服务器上通过一些命令,比如通过jstat来统计堆内存的使用情况/垃圾回收的情...

6732
来自专栏子勰随笔

SDK开发经验之自动构建

2189

扫码关注云+社区

领取腾讯云代金券