写点什么

Redis 缓存数据库安全加固指导(二)

  • 2019-10-21
  • 本文字数:2181 字

    阅读完需:约 7 分钟

Redis缓存数据库安全加固指导(二)

在众多开源缓存技术中,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 yessyslog-ident redissyslog-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 个。


本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/oNZmP-vH52mPK8AVBEAZ7A


2019-10-21 23:521659

评论

发布
暂无评论
发现更多内容

前端自动化测试及 Karma 介绍

devpoint

单元测试 自动化测试 Karma 8月日更

CSS的设计模式(一)OOCSS

Augus

CSS 8月日更

Go 语言, 一文彻底搞懂 iota 实现原理

微客鸟窝

Go 语言 8月日更

缓存函数的简单使用

编程三昧

JavaScript 8月日更

手撸二叉树之根据二叉树创建字符串

HelloWorld杰少

数据结构与算法 8月日更

硬盘空间免费扩容了2TB!!!

Jackpop

Vue进阶(五十二):vue-cli 脚手架 webpack.dev.conf.js 配置文件详解

No Silver Bullet

Vue 8月日更

程序员必备!5款小众高效的开发神器

Jackpop

大数据技术不能被平台滥用,必须维护消费者的合法权益

石头IT视角

白手起家之注册中心zookeeper

卢卡多多

ZooKeeper原理 8月日更

Ansible 变量

耳东@Erdong

变量 ansible 8月日更

Netty如何解决粘包以及拆包问题

慕枫技术笔记

后端 Netty

在线HTML5,CSS3,VueJS,jQuery运行测试练习工具

入门小站

工具

vue入门:router路由简介与使用

小鲍侃java

8月日更

10 个超棒的 JavaScript 简写技巧

前端依依

程序员 大前端 js 代码规范

网络攻防学习笔记 Day111

穿过生命散发芬芳

网络安全 8月日更

【设计模式】访问者模式

Andy阿辉

C# 后端 设计模式 8月日更

人工智能下的音频还能这样玩!!!!

Python研究者

8月日更

Vue进阶(五十一): vue-cli 脚手架 webpack.base.conf.js 配置文件讲解

No Silver Bullet

Vue 8月日更

低品质的勤奋者

箭上有毒

8月日更

iOS开发:开发过程中单例模式的使用

三掌柜

8月日更 8月

管道(Channel)的读取与写入「让我们一起Golang」

Regan Yue

协程 Go 语言 8月日更 管道

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

今晚早点睡

源码

Flink生态提供的其它工具(十一)

Databri_AI

sql flink CEP

金九银十旗开得胜!秋招字节正式批4面,顺利拿到offer

编程susu

Java 编程 程序员 面试 编程开发

【Flutter 专题】61 图解基本 Button 按钮小结 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

开源应用中心 | 做项目,不敏捷?快来部署这款灵活的项目管理系统

销售 小姐姐 给买家打分系统,用 Python Django 又整了一个花活

梦想橡皮擦

8月日更

Linux之bc命令

入门小站

Linux

腾讯良心了?!!!

Jackpop

帮小姐姐打分系统的模型创建,滚雪球学 Python 第三轮第 11 篇

梦想橡皮擦

8月日更

Redis缓存数据库安全加固指导(二)_文化 & 方法_中间件小哥_InfoQ精选文章