背景

在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一位,但是原生Redis版本在安全方面非常薄弱,很多地方不满足安全要求,如果暴露在公网上,极易受到恶意攻击,导致数据泄露和丢失。

本文主要是在原生开源软件Redis3.0基础上,系统的在安全特性方面进行的增强,很多增强点涉及了开源代码的修改,后续章节阐述的Redis缓存数据库的安全规范, 理论上适用于所有应用Redis的产品。

本系列共连载三篇,分九个章节,本文从敏感数据与加密保护,口令安全,日志审计三个章节阐述了Redis缓存数据库加固措施

敏感数据与加密保护

1.密码保存(重要)

安全问题:原生Redis服务端密码requirepass和masterauth是明文保存到redis.conf。

解决方案: 服务端密码采用PBKDF2加密后保存到redis.conf。

考虑到性能问题,每次认证都用PBKDF2会比较耗时,经过评审,采用在首次认证成功后,内存采用SHA256缓存,后续的请求优先使用SHA256校验。

2.支持秘钥替换(重要)

安全问题:涉及加解密的秘钥不能写死到代码中。

解决方案: 秘钥支持定期替换。

➤redis服务端redis-server:

配置文件增加配置项:cipher-dir

配置为redis_shared.key和root.key所在的文件夹的全路径,例如:cipher-dir /opt/redis/etc/cipher

➤redis客户端:redis-cli

添加参数-cipherdir,指向redis_shared.key和root.key所在的文件夹的全路径

例如:redis-cli -h 127.0.0.1 -cipherdir /opt/redis/etc/cipher -a sessionrdb@dbuser@Changeme_123 -p 32091

➤redis客户端SDK:jedis*.jar

同一个进程内,Jedis接口为string, dbname@user@pwd,因为第三方接口(类似Jdbc),无法加密。

3.密码传输(重要)

安全问题:原生Redis通过config get命令可能获取到服务端敏感信息。

解决方案:禁止将口令等敏感信息传送到客户端,因此需要禁掉config get requirepas/masterauth/requireuserpass等功能。

4.密码修改(重要)

安全问题:修改密码明文传输:config set masterauth pwd

解决方案:Redis内存保存明文密码问题: masterauth 使用AES128加密,密码采用AES128保存

口令安全

1.产品缺省启用数据库口令复杂度检查功能

安全问题:Redis修改密码没有复杂度检查。

解决方案:提供单独的Redis修改工具来修改密码,特别注意以下几点:

1.进行口令复杂度检查。

2.在输入错误的用户名或密码时,不能出现类似于“密码错误”、“用户名不存在”之类的过于明确的原因提示信息,以防止攻击者用于猜解系统用户名/口令。

3.修改密码要校验老密码。

4.修改数据库密码不能和用户名一样。

5.交互式密码修改时要隐藏密码。

6.在文档中建议通过交互式修改密码。

2.防暴力破解,配置账户登录失败尝试次数

安全问题:Redis原生版本存在暴力破解情况。

解决方案:最大失败次数:maxauthfailtimes(单位 次,有效范围(0,10万],默认值1万)

说明:该配置项只支持在启动时redis.conf配置,不支持动态修改,屏蔽掉对应config set。

不支持设置为0:表示不锁定任何IP。

3.配置账户锁定后自动解锁时间

鉴权失败锁定时间:authfaillocktime(单位分钟,有效范围[0~999],默认值10)

设置为0时,表示永久锁定。

说明: 该配置项只支持在启动时redis.conf配置,不支持动态修改,屏蔽掉对应config set。

4.查看锁定IP

问题:IP锁定后需要查看被锁定IP。

解决方案:

只有管理员可以查看已经锁定的IP列表,分隔符为英文冒号(:)
示例1:config get lockedips
返回:10.67.147.111;10.67.147.112;
示例2:config get lockedips
返回:10.67.147.111;
说明:不支持config set lockedips,如果强制执行,返回错误:ERR Unsupported CONFIG parameter: lockedips

5.手工锁定IP的解除

只有管理员可以执行命令解锁锁定的IP,只支持解锁单个IP或者解锁全部IP
解决方案:

示例1,解锁单个IP:config set unlockips 10.67.147.111
示例2,解锁所有IP:config set unlockips “all”
说明:不支持config get unlockips,如果强制执行,返回空,redis-cli提示:(empty list or set)
如果参数中的IP没有出现过异常,会返回解锁失败,例如:
(error) ERR Invalid argument '10.67.147.111' for CONFIG SET 'unlockips'

执行手动解锁,记录trace,例如:
例如:26 Dec 03:15:19.958 * 10.67.147.113 unlocked by 10.67.147.111:59417日志审计

6.安全审计

1.Redis自身支持日志记录到系统日志,如/var/log/localmessage。但需要通过在redis.conf进行如下配置:

syslog-enabled yes

syslog-ident redis

syslog-facility local0

2.客户端登录,记录客户端IP,账号等信息。

3.相关维护操作必须有详细的日志记录。

示例: 29118:S 26 Nov 11:19:29.100 * The readdbuser logged in successfully;10.145.93.119:52817;

7.操作日志转储

安全问题:官方版本Redis日志不会转储,长时间运行可能会把磁盘占满。

解决方案:单独运行tracemonitor进程(python版),定期管理Redis日志文件大小,主要是日志压缩和定期删除,避免占用过多磁盘。

说明:目前平台默认60秒检测一次,日志达到20M压缩,日志个数最大50个。

Redis缓存数据库安全加固指导(二)的更多相关文章

  1. Redis缓存数据库安全加固指导(一)

    背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...

  2. JAVA记录-redis缓存机制介绍(二)

    Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度 ...

  3. Redis缓存项目应用架构设计二

    一.概述 由于架构设计一里面如果多平台公用相同Key的缓存更改配置后需要多平台上传最新的缓存配置文件来更新,比较麻烦,更新了架构设计二实现了缓存配置的集中管理,不过这样有有了过于中心化的问题,后续在看 ...

  4. Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

    本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透.缓存击穿.缓存雪崩. 1.缓存穿透 一.概念 缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到 ...

  5. 【Azure Redis 缓存】Azure Redis 功能性讨论二

    继承上一次讨论了Azure Redis的可用性,可靠性,稳定性,安全性,监控方面的九大功能点.详情可回顾文章:[Azure Redis 缓存]Azure Redis功能性讨论 这次我们继续讨论Azur ...

  6. 完整SpringBoot Cache整合redis缓存(二)

    缓存注解概念 名称 解释 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 CacheManager 缓存管理器,管理 ...

  7. 十二:SpringBoot-基于Cache注解模式,管理Redis缓存

    SpringBoot-基于Cache注解模式,管理Redis缓存 1.Cache缓存简介 2.核心API说明 3.SpringBoot整合Cache 3.1 核心依赖 3.2 Cache缓存配置 3. ...

  8. SpringBoot缓存管理(二) 整合Redis缓存实现

    SpringBoot支持的缓存组件 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.spri ...

  9. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

随机推荐

  1. CAD使用DeleteXData删除数据(com接口)

    主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 c#代码实现如下 ...

  2. js检测是哪个浏览器

    项目中遇到在火狐浏览器下引入iframe页面,导致那个地方感觉掉下去一点,解决方案就是单独对火狐浏览器进行样式处理,需要检测浏览器类型,在网上找到此方法解决问题,也分享给大家 function get ...

  3. Bootstrap 12 栅格系统

    栅格系统简介 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多 12 列.它包含了易于使用的预定义类,还有强大的mix ...

  4. [Python3网络爬虫开发实战] 1.9.3-Scrapyd-Client的安装

    在将Scrapy代码部署到远程Scrapyd的时候,第一步就是要将代码打包为EGG文件,其次需要将EGG文件上传到远程主机.这个过程如果用程序来实现,也是完全可以的,但是我们并不需要做这些工作,因为S ...

  5. python多线程和多进程(一)

    一.多线程 Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装.绝大多数情况下,只需要使用thr ...

  6. Sublime text 3搭建Python开发环境及常用插件安装 转载

    Sublime text 3搭建Python开发环境及常用插件安装 一.环境准备 1.官方网站地址 2.Windows 10 3.Sublime Text 3 + 官网购买license(Just a ...

  7. UVA 1589 象棋

    题意: 给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军. 分析: 分情况处理, 车 马 炮, 红将情况跟车是一样的. 建一个数组board保 ...

  8. jz2440烧写方法笔记

    1,jz2440用dnw烧写普通程序的步骤是: ①选择将uboot烧写到nor flash或者是nand flash中 ②打开dnw,选择要烧写的程序,注意不是uboot,是你要烧写的程序,他将所有的 ...

  9. JQuery Easy UI 简介

    [什么是JQuery Easy UI?] jQuery EasyUI 是一组基于 jQuery 的 UI 插件集合,而 jQuery EasyUI 的目标就是帮助Web 开发者更轻松的打造出功能丰富并 ...

  10. Fiddler简介与Web抓包,远程抓包(IE、360、谷歌、火狐)

    Fiddler简介以及web抓包 一.Fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二 ...