原文:http://redis.io/topics/security

1.Redis的安全模式

       可信环境下的可信用户才可访问redis。这意味着,将redis服务器直接暴露在Internet或者不可信用户可直接访问Redis的tcp端口或Unix套接字的环境,是不安全的。

使用redis的web应用程序的常用场景是将redis作为数据库,缓存,消息系统,应用程序的前端用户查询redis来产生页面,或者运行需要的操作,被web应用程序用户所触发。这样的话,web应用程序需要对不可信用户(用户浏览器)访问redis进行处理。

对redis的非法访问经常通过使用ACL,验证用户输入和决定redis的哪些操作是禁止的等等措施来控制。

总的来说,redis着重于高性能和简单易用,在安全方面做得并不好。

2.网络安全

        除了可信用户之外,任何人都不能访问redis端口。用redis实现的应用程序才可直接访问服务器上运行的redis.

        通常情况下,一台直接暴露在Internet的计算机,例如一个虚拟化Linux实例(Linode,EC2,…),防火墙应防止外部用户访问它的redis端口。

用户仍可以通过本地接口来访问redis.

        在redis.conf配置文件增加下面这一行配置,即可把redis绑定在单个接口上。

                  bind 127.0.0.1

         如果不禁止外部访问redis的话,将会产生非常严重的后果。例如,外部的非法用户的一个FLUSHALL操作就可以删除redis的所有数据。

(我们也可以禁止掉Redis 禁用FLUSHALL FLUSHDB KEYS 命令等操作)

FLUSHALL FLUSHDB 命令会清空数据,而且从不失败,对于线上集群非常危险。

KEYS * 命令,当数据规模较大时使用,会严重影响Redis性能,也非常危险。

如果从根本上规避这些风险呢?

Redis提供了非常简单且有效的方法,直接在配置文件中设置禁用这些命令。设置非常简单,如下

 

需要注意的一点是,rename-command命名无法直接对线上集群生效。如果需要使用rename-command,必须重启集群。

所以建议一开始,就将该配置配置好。


rename-command FLUSHALL ""

rename-command FLUSHDB ""

rename-command KEYS ""

3.认证

        虽然redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。

    当授权方式启用时,redis将会拒绝来自非认证用户的任何查询。用户可以通过发送AUTH命令并带上密码给redis服务器来给自己授权。

    系统管理员在redis.conf文件里以明文方式设置密码。而且密码必须足够长来抵御暴力破解密码方式的攻击,这样设置密码做有两个原因:

(1)redis的查询速度是非常快的,外部用户一秒内可以尝试许多个密码。

(2)redis密码存储在redis服务器上的redis.conf文件以及用户的配置文件里,系统管理员没有必要记住密码,因为密码可以非常长的。

       认证层的目标是提供多一层的保护。如果防火墙或者用来保护redis的系统防御外部攻击失败的话,外部用户如果没有通过密码认证还是无法访问redis的。

       AUTH命令跟其他redis命令一样,是没有加密的,所以阻止不了攻击者在网络上窃取你的密码。

4.数据加密

Redis并不支持加密。为了能让在Internet或者不可信网络的用户访问redis,需要实现新增的保护层,例如SSL代理。

5.禁用指定的命令

在redis你可以禁用某些命令或者将命令重命名成难以猜测的名字,这样一般的用户就只能使用部分命令了。
例如,虚拟服务器提供商提供管理redis实例的服务,这样的话,普通用户就不能调用CONFIG命令来修改配置了,但能新增,删除redis实例的系统必须能修改配置。你可以重命名命令,也可以完全禁用该命令。Redis.conf文件支持这样的这样配置。
例如:
  rename-command CONFIGb840fc02d524045429941cc15f59e41cb7be6c52 在上面这个例子里,CONFIG命令重命名成一个毫无意义的名字。把命令重命名成空字符串即可将命令完全禁用,例如下面这个例子: rename-command CONFIG “” 6.外部用户精心构造的输入所触发的攻击 有一类攻击是攻击者即便没有访问redis权限也可以通过外部来触发的。这种攻击的一个方式是向redis插入数据,使得对redis内部实现的数据结构的操作达到一个变态的算法复杂度。
例如,攻击者通过表单提交若干哈希值相同的字符串到哈希表里,使O(1)的平均算法复杂度变成最差的O(n),redis服务器要花费比预期更多的cpu,最终导致无法提供服务。 为了防范这类特殊的攻击,redis的哈希函数使用per-excution的伪随机种子。Redis用qsort算法来实现SORT命令。目前这个算法还不是随机的,所以通过有意构造输入可能引发二次达到最糟糕情况的行为。

7.字符串转义和NoSQL注入 Redis的协议里并没有字符串转义的概念,在一般的情况下使用普通客户端库是无法实现NoSQL注入的。协议使用的是二进制安全的前缀长度字符串。通过EVAL,EVALSHA命令执行Lua脚本同样是安全的。应用程序应避免使用不明来源的字符串来写Lua脚本。 8.代码安全 典型版本的redis中,客户端是可以使用全部命令的,但是访问redis实例时是没有能力 控制运行着redis的系统的。 Redis使用好的编程方法来写代码,防止出现缓存溢出,格式错误和其他内存损坏问题。可是,使用CONFIG命令修改服务器配置的能力使得用户可以改变程序的工作目录和备份文件的名字。这也使得用户将RDB文件写在任意位置。这个安全问题容易引起不安全的代码的运行。 Redis并不需要root权限来运行。建议使用非特权用户运行redis.redis的作者正在调查给CONFIG命令增加一个新参数来防止CONFIG SET/GET dir和其他类似的运行时配置指令的可能性。这可以防止用户强制服务器在任意位置写备份文件。

NOSQL之【redis的安全策略】的更多相关文章

  1. 【NoSql】Redis

    [NoSql]Redis 一. 文档 1. 官网 2. Windows 安装包 3. C# Driver a. ServiceStack.Redis 最新版本是收费的 b. StackExchange ...

  2. NoSQL之Redis高级实用命令详解--安全和主从复制

    Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...

  3. NoSQL:redis缓存数据库

    一 Redis介绍 Redis和Memcached类似,也属于key-value nosql 数据库 Redis官网redis.io, 当前最新稳定版4.0.1 和Memcached类似,它支持存储的 ...

  4. No-sql之redis常用命令

    转自:http://blog.csdn.net/nicewuranran/article/details/51793760 No-SQL之Redis 介绍 Redis是一种基于内存存储的key-val ...

  5. NoSQL之Redis学习笔记

    一.NoSQL与Redis 1.什么是NoSQL? NoSQL=Not Only SQL ,泛指非关系型数据库.随着互联网的兴起,传统的关系型数据库已经暴露了很多问题,NoSQL数据库的产生就是为了解 ...

  6. 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)

    公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...

  7. NoSQL 之Redis的5大数据类型

    NoSQL 之Redis的5大数据类型 Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisO ...

  8. NoSQL 之 Redis配置与优化

    NoSQL 之 Redis配置与优化 1.关系数据库与非关系型数据库概述 2.关系数据库与非关系型数据库区别 3.非关系型数据库产生背景 4.Redis简介 5.Redis安装部署 6.Redis 命 ...

  9. NoSQL之Redis配置与优化

    NoSQL之Redis配置与优化 目录 NoSQL之Redis配置与优化 一.关系数据库和非关系数据库 1. 关系型数据库 2. 非关系型数据库 3. 非关系型数据库产生背景 4. 关系型数据库和非关 ...

随机推荐

  1. A4 打印长宽

    我是用下面的转换公式,将A4纸转为在屏幕中的分辨率 页边距: 0.75 inchA4: 8.27x11.69 inch打印机DPI:600DPI屏幕DPI  : 96DPIwidth = (8.27  ...

  2. C#实现Dll(OCX)控件自动注册的两种方法

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  3. 顺丰接口 api对接说明

    1       功能说明 物流轨迹查询-使用的物流单号和快递单号即可实现查询物流信息. 1.1   接口规则 (1).查询接口支持按照运单号查询(单个查询). (2).指定的物流运单号选择相应的快递公 ...

  4. 1.5.1 Analyzers,Tokenizers,Filters概述

    字段分析器(Analyzers)即用于文档索引也用于查询.一个分析器检查字段的文本,并生成一个token流.分析器可能是一个单独的类,也可能是一系列的tokenizer和filter的组合. 分词器把 ...

  5. Handsontable 学习笔记-Methods

    Handson: 亲自实践 先给出数据源和基本配置: var data =[ ["A1","B1","C1","D1"] ...

  6. SSAS中Cube的结构

    在SSAS(SQL Server Analysis Services)中构建Cube和编写MDX的时候,我们很容易被一些名词弄糊涂,比如:Dimension(维度),Measures Dimensio ...

  7. javaweb学习总结二十五(response对象的用法一)

    一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...

  8. ASP.NET多线程下使用HttpContext.Current

    本来要实现asp.net下使用tcp通讯方式向服务器获取数据,开始采用的方式是 参考: ASP.NET多线程下使用HttpContext.Current为null解决方案 http://www.cnb ...

  9. Linux 字符设备控制技术

    字符设备控制技术 一.字符设备控制理论 1.作用 大部分设备除了具有<读写设备>的能力,还应该有<控制设备>的能力.比如改变 波特率 2. 应用程序接口 在用户空间中使用 Io ...

  10. [转]美国的软件公司是什么样?---- 以Fog Creek为例

    作者: 阮一峰 日期: 2009年2月15日 Joel写过一篇文章,关于软件公司如何雇到优秀的程序员. 他说,软件公司的头等大事,就是找到第一流的人才.不同于其他行业,软件是一种纯智力产品,你有什么样 ...