2021腾讯数字生态大会直播预约通道开启!技术内容大爆发,开发者必看! 了解详情
写点什么

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

2019 年 10 月 21 日

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

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


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


本系列共连载三篇,分九个章节,本文从合法监听接口,未公开接口,访问通道控制三个章节阐述了 Redis 缓存数据库加固措施


一、合法监听接口

01 端口使用非默认端口

安全问题:Redis Server 监听的端口默认为 6379,容易被扫描攻击。


解决方案:修改为非默认端口,并在端口矩阵中说明。


02 监听地址不允许包括*

安全问题:Redis 支持监听 0.0.0.0。


解决方案:因为如果有多网卡,应该将监听地址设置为只有数据库客户端需要连接的网卡地址。如果只允许本机访问,应该只监听 127.0.0.1。


03 隐蔽的 RedisCluster 端口

安全问题:官方 RedisCluster 方案缺省会增加一个集群端口,且是在客户端端口偏移 10000,这个问题非常隐蔽。


解决方案:在端口矩阵中对额外的这个集群端口有说明。修改源码,新增一个 redis.conf 偏移量配置项 cluster-port-increment,缺省配置+1,这样可以做到端口范围可控,避免冲突。


二、未公开接口

01 账号管理(重要)

安全问题:Redis 只有一个超户,权限过大。


解决方案:权限最小化原则,增加配置项,角色区分超户,普通用户和只读用户三种。



普通用户不能进行的操作有:



02 Redis-cli 隐藏密码

安全问题:通过在 redis-cli 指定-a 参数,密码会被 ps 出来,属于敏感信息。


解决方案:修改 Redis 源码,在 main 进入后,立即隐藏掉密码,避免被 ps 出来。(可参考开源 Mysql 代码)


03 Redis-cli 工具使用说明

对于需在现网维护阶段使用的命令/参数、端口等接入方式(包括但不限于产品的生产、调测、维护用途),需通过产品资料等向客户或监管机构公开或受限公开。


04 禁止在脚本中通过 sudo 方式切换用户执行 redis-cli

安全问题: redis-cli 访问参数带密码敏感信息,会被 ps 出来,也容易被系统记录操作日志。


解决方案:改为通过 API 方式(Python 可以使用 redis-py)来安全访问,禁止通过 sudo 方式切换到 dbuser 账号使用 redis-cli。


重现条件:可以通过 iptables 禁掉 redis 端口来模拟重现。


三、访问通道控制

01 预共享秘钥认证(重要)

安全问题:Redis 原生认证存在重放攻击:只是简单的交互一次 auth xxx


解决方案:采用预共享秘钥(对称加密算法+随机数的双向认证),同时在方案设计上做到最大限度兼容,让客户端改造成本最小,目前平台配套目前支持客户端有:Java,Python,C,Lua。


方案设计如下:


1 Redis 认证协议变更,其中 auth 命令区分两种功能,通过首字母区分:


2 预共享秘钥认证时序图:


说明:Redis 为文本协议, 安全随机数长度固定为 32 字节的可显示字符串,连接 2 个随机数的分隔符为”@”。


主要认证流程:


1 客户端向服务端执行命令: auth < RAND_C


  1. 首字母<表示是认证第一阶段。(便于服务端从协议层区分)

  2. RAND_C 表示客户端生成安全随机数。


2 服务端产生响应错误回复


  1. 获取 RAND_C,并生成 RAND_S

  2. 产生 TokenBA=AES128(RAND_S@RAND_C)

  3. 响应错误回复:-ERR >TokenBA


说明:错误描述为服务端生成的安全随机数。


3 客户端验证

  1. 验证 TokenBA 是否合法

  2. 解密出 RAND_S@RAND_C,看看 RAND_C 是否是自己生成的随机数

  3. 客户端产生 TokenAB=AES128(RAND_C@RAND_S@dbname@ossdbuser@pwd)

  4. 调用认证接口: auth >TokenAB


4 服务端认证

  1. 验证 TokenAB 是否合法

  2. 解密出 RAND_C@RAND_S,看看 RAND_S 是否是自己生成的随机数

  3. 验证用户和密码合法性: dbname@ossdbuser@pwd


02 认证时加上库名

安全问题:Redis 没有库名,系统如果只通过用户名+密码,容易猜测和攻击。


解决方案:通过认证时带上库名, 因为每个服务的库名都配置不同,增加攻击复杂度, 认证格式以 dbname@dbuser@pwd 区分。


03 端口矩阵

安全问题:Redis 也是一种数据库服务,一般一个进程占用一个端口,集群还会额外多占用一个端口。


解决方案:在端口矩阵写明系统申请的 Redis 端口范围。


04 客户端认证超时时间

安全问题:原生 Redis 没有限制客户端认证超时时间,存在慢攻击。


解决方案:修改源码,限制在 60 秒内认证成功,否则服务器将主动断开连接。


说明:控制完成客户端认证的时间上限。这可以防止无效客户端长时间占用连接通道。


05 支持 SSL 通信

安全问题:增加 SSL 通信可以提高数据传输的安全。


解决方案:


1 不改动官方源码,通过在客户端和服务端部署 SSL Proxy,类似 stunnel。


2 支持 SSL 可配置,涉及开源代码修改。说明:因为 Redis 属于交互密集型,每秒处理几万次请求,支持 SSL 后性能会有比较大损失。


06 支持 ACL 控制

安全问题:目前 Redis 没有 ACL 控制。


解决方案:


1 目前基于平台共享秘钥,其中秘钥是随机生成,每套系统不一样,间接也做到了 IP 范围控制。


2 通过 iptables 控制进一步限制接入 IP 范围。


3 如果要具体控制到用户+IP 级别,类似 Mysql 认证。作者 antirez 已经意识到这个问题,有望在未来版本提供,链接如下:Multi users AUTH and ACLs for Redis(https://github.com/redis/redis-rcp/blob/master/RCP1.md)


07 Jedis 客户端相关

对于需在现网维护阶段使用的命令/参数、端口等接入方式(包括但不限于产品的生产、调测、维护用途),需通过产品资料等向客户或监管机构公开或受限公开。


08 集群认证相关

1 RedisCluster 多主多从,内部高度自制,因此 Redis 的认证 masterauth 需要加密保存到配置文件。


2 配置集群关系时,基于 Gossip 协议,Cluster meet 需要有认证保护。


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


原文链接:


https://mp.weixin.qq.com/s/Jqoi3JfJGJicFxR7aNYTZQ


2019 年 10 月 21 日 23:47410

评论

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

0 基础架构入门 - 5(微博评论的高性能高可用计算架构)

felix

架构实战营 0 基础架构入门

【Spring源码分析】带你正视一下Spring祖容器之BeanFactory的原理与功能分析(1)

浩宇天尚

spring 容器 spring源码 10月日更 BeanFactory

点击量破百万!阿里内产微服务进阶讲义,简直是Java开发者的福音

Java 编程 架构 面试 程序人生

不愧是阿里巴巴内部Spring Boot实战文档,这细节讲解,神了

Java spring 架构 面试 微服务

起飞!这份技术点拉满的ELk+Lucene笔记,可能价值百万

Java 架构 面试 程序人生 编程语言

架构实战营 - 模块九作业

Julian Chu

架构实战营

Netflix实用API设计(上)

俞凡

架构 netflix API 10月日更

Python代码阅读(第32篇):随机返回列表中的一个元素

Felix

Python 编程 Code Programing 阅读代码

阿里内部“SpringCloudAlibaba学习笔记”全彩第三版开源

云流

Java spring 架构 面试 微服务

架构实战营模块 8 作业指导

华仔

架构实战营

Jupyter Notebook从入门到精通,TensorFlow一个计算机视觉示例 易筋 ARTS 打卡 Week 68

John(易筋)

ARTS 打卡计划

008云原生之Serverless架构

穿过生命散发芬芳

云原生 10月日更

新技术|基于信号特征的语音编码器Lyra Android实践

轻口味

android 音视频 引航计划 10月日更

【Flutter 专题】37 图解 Flutter 基本动画 (二)

阿策小和尚

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

架构实战营 模块九(毕业设计) 作业

一雄

作业 架构实战营 毕业设计 模块九

代码要写注释了吗?

HelloWorld杰少

领航计划

全到哭!Github一夜爆火被各大厂要求直接下架的Java面试题库真香

程序员小毕

Java spring 程序员 架构 面试

【LeetCode】 第三大的数Java题解

HQ数字卡

算法 LeetCode 10月日更

《Go 开发指南》-快速安装 Go 环境

看山

Effective-go 10月日更

项目管理中常见的十个问题

石云升

项目管理 管理 引航计划 内容合集 10月日更

促进DeFi、CeFi融合的Pledge,或成为首个与上市企业合作的DeFi协议

股市老人币圈新

私有云部署系列之动态IP获取(前期准备)

稻草鸟人

Python 私有云

Netflix实用API设计(下)

俞凡

架构 netflix API 10月日更

架构实战营模块9作业

喻高咏        

架构实战营

美团大佬的Java性能调优实战手册,上线当天 下载量破百万!

Java 编程 架构 程序人生

阿里巴巴《Java权威面试指南(全彩版)》来袭,冲击“金九银十”有望了

云流

Java 程序员 架构 面试 后端

这篇阿里扫地僧所写关于SpringCloudAlibaba的笔记真香!

Java 面试 程序人生 编程语言 架构、

“区块链+政务”纵深发展 链上共识提升服务效能

CECBC区块链专委会

Web安全应急响应小记

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 应急响应

【Vuex 源码学习】第七篇 - Vuex 的模块安装

Brave

源码 vuex 10月日更

白月光与朱砂痣-Flannel略糙,Cilium太美

Lance

英特尔On技术创新峰会

英特尔On技术创新峰会

Redis缓存数据库安全加固指导(一)-InfoQ