原文: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. The Last Practice

    Problem Description Tomorrow is contest day, Are you all ready?We have been training for 45 days, an ...

  2. [转]DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    在CSDN中发现这篇文章,讲解的比较详细,所以在这里备份一个.原文链接:http://blog.csdn.net/breaksoftware/article/details/8167641 DllMa ...

  3. 怒刷DP之 HDU 1257

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  4. codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析

    4600 [NOI2015]程序自动分析  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在实现 ...

  5. macOS10.12允许所有来源设置

    如何调出允许所有来源呢? 很简单一行命令搞定 调出允许所有来源 1.打开终端执行命令 sudo spctl --master-disable 2.你在打开偏好设置--> 安全与隐私   好了赶快 ...

  6. 博客不再更新,已转移到自己的小站iwenku.net

    博客不再更新,已转移到自己的小站iwenku.net,欢迎访问! 博客不再更新,已转移到自己的小站iwenku.net,欢迎访问! 博客不再更新,已转移到自己的小站iwenku.net,欢迎访问! 博 ...

  7. 深入浅出ExtJS 第四章 表单与输入控件

    4.1 制作表单 var form = new Ext.form.FormPanel({ title:'form', defaultType:'textfield', buttonAlign:'cen ...

  8. Ionic之顺带APP

    1:Ionic简介 官方:我们设计ionic来帮助 web 开发人员能够像开发网站一样开发出强大的移动APP应用. ionic是一个html5开发APP的框架,在开发运行效率可以说是最好的H5框架,把 ...

  9. Intent的4种传值方法总结

    xml 代码: <Button     android:id="@+id/button1"     android:layout_width="wrap_conte ...

  10. 二十二、android中application标签说明

    <application> <applicationandroid:allowClearUserData=["true" | "false"] ...