写点什么

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:522168

评论

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

如何设计数据中台

数据社

大数据 数据中台 数据仓库

如何通过样本数据推断其分布

张利东

Python

自定义构造python白名单__builtins__

么么哒

Python

“新基建”方兴未艾,Smartbi Mining如何为产业数字化转型赋能?

infoq小陈

HTML中实现合并单元格

JDoe

html

一款开源且具有交互视图界面的实时 Web 日志分析工具!

JackTian

开源 GoAccess 实时 Web 日志分析工具 交互式查看器

写代码没几天,遇到一堆报错,我该怎么办

刘早起😶

Python 程序员 程序人生

地铁上看书的老外引发的思考

小天同学

写作 读书 个人感想 日常思考

偏头疼告诉我的,我想告诉每一个人

zkback

团队与领导力健康检查 | 体检表

Bob Jiang

团队建设

为什么要学习 Markdown?究竟有什么用?

JackTian

markdown markdown语法 markdown编辑器

互联网省份数据大揭秘,看看哪些地方是互联网的戈壁滩?

非著名程序员

程序员 互联网 IT

最香远程开发解决方案!手把手教你配置VS Code远程开发工具,工作效率提升N倍

程序员柠檬

Linux 后台开发 vscode 后端

python实现·十大排序算法之基数排序(Radix Sort)

南风以南

Python 排序算法 基数排序

Python deepcopy一个优化

么么哒

Python

GitHub 上十个好用的软件

彭宏豪95

GitHub 效率 工具

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十一)JUnit概述

编程道与术

Java 编程 软件测试 TDD 单元测试

只用CSS实现响应式Full-Width img 2种方法

寇云

CSS css3

前端工程化之创建项目

春生

大前端 全栈工程师

做好领路人——写给技术新人的导师建议

南方

管理 新人

自定义列表样式

寇云

CSS css3

写给产品经理的信(5):谈谈项目管理(青铜-王者)

punkboy

产品 极客时间,项目管理 项目管理 产品经理 项目

机器学习项目是如何开发和部署的?

陆道峰

人工智能 学习

git | IDEA 中如何压缩提交(压缩commit后再push 图文演示)

YoungZY

开发者工具 IDEA 开发工具

券商也“网红”,证券行业IT服务运维发展按下“快进键”

博睿数据

运维 APM 证券 券商 行情

关于软件测试的三点思考

卓然

软件测试 测试 测试的价值 联现技术咖

这场大数据+AI Meetup,一次性安排了大数据当下热门话题

Apache Flink

大数据 flink 流计算 实时计算

Server Queue 提高 QPS

风含叶

Python kafka 后端 队列

纯CSS“返回顶部”特效

寇云

CSS css3

重学 Java 设计模式:实战原型模式

小傅哥

Java 设计模式 小傅哥 复杂代码优化 重构

为什么第三方联调应该先行?

大伟

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