守护 Redis 安全的几个策略,你了解过几个呢?
mhr18 2024-11-01 12:19 19 浏览 0 评论
Redis常规安全模式
Redis 被设计成仅有可信环境下的可信用户才可以访问。这意味着将 Redis 实例直接暴露在网络上或者让不可信用户可以直接访问 Redi s的 tcp 端口或 Unix 套接字,是不安全的。
正常情况下,使用Redis的web应用程序是将Redis作为数据库,缓存,消息系统,网站的前端用户将会查询Redis来生成页面,或者执行所请求的操作,或者被web应用程序用户所触发。这种情况下,web应用程序需要对不可信的用户(访问web应用程序的用户浏览器)访问Redis进行处理。这是个特殊的例子,但是,正常情况下,对 Redis 的非法访问需要通过实现 ACLs,验证用户输入和决定 Redis 实例上可以执行哪些操作这些方式来控制。
总而言之,Redis 并没有最大地去优化安全方面,而是尽最大可能去优化高性能和易用性。
网络安全
仅有可信的网络用户才可以访问 Redis 的端口,因此运行 Redis 的服务器应该只能被用 Redis 实现的应用程序的计算机直接访问。
一般情况下一台直接暴露在 Internet 的计算机,例如一个虚拟化 Linux 实例(Linode, EC2,…),防火墙应该防止外部用户访问它的redis端口。用户仍可以通过本地接口来访问 Redis。
记住在redis.conf 文件中增加下面这一行配置就可以把 Redis 绑定在单个接口上。
bind 127.0.0.1
不禁止外部访问 Redis 的话,将会产生非常严重的后果。比如,一个 FLUSHALL 操作就可以当做外部攻击来删除 Redis 上的所有数据。
认证的特性
虽然 Redis 没有尝试去实现访问控制,但是提供了一个轻量级的认证方式,可以编辑redis.conf 文件来启用。当认证授权方式启用后,Redis 将会拒绝来自没有认证的用户的任何查询。一个客户端可以通过发送 AUTH 命令并带上密码来给自己授权。
这个密码由系统管理员在redis.conf 文件里面用明文设置,它需要足够长以应对暴力攻击,这样子设置有以下两个原因:
redis.conf
但同时密码控制也会影响到从库复制,从库必须在配置文件里使用masterauth 指令配置相应的密码才可以进行复制操作。
masterauth yoursecurepasswordhereplease
认证层的目标是提供多一层的保护。假如防火墙或者其它任何系统防护攻击失败的话,外部客户端如果没有认证密码的话将依然无法访问 Redis 实例。AUTH 命令就像其它Redis命令一样,是通过非加密方式发送的,因此无法防止拥有足够的访问网络权限的攻击者进行窃听。
数据加密支持
Redis并不支持加密。为了实现在网络上或者其它非可信网络访问 Redis 实例,需要实现新增的保护层,例如 SSL 代理。
官方推荐的SSL 代理:spiped
禁用的特殊命令
在 Redis 中可以禁用命令或者将它们重命名成难以推测的名称,这样子普通用户就只能使用部分命令了。例如,一个虚拟化的服务器提供商可能提供管理Redis实例的服务。在这种情况下,普通用户可能不被允许调用 CONFIG 命令去修改实例的配置,但是能够提供删除实例的系统需要支持修改配置。
在这种情况下,你可以从命令表中重命名命令或者禁用命令。这个特性可以在redis.conf 文件中进行配置。例如:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
在上面这个例子中,CONFIG 命令被重命名成一个不好猜测的名称。把命令重命名成一个空字符串可以禁用掉该命令,例如下面这个例子:
rename-command CONFIG ""
外部客户端通过仔细构造的输入触发的攻击
即便没有外部访问权限,也有种攻击可以让攻击者从外部触发。例如一些攻击者有能力向 Redis 中插入数据,触发 Redis 内部数据结构中最差的算法复杂度,例如一个攻击者可以通过提交表单提交大量一样的字符串到哈希表里,使得 O(1) 的算法复杂度(平均时间)达到最差的O(N) ,Redis 将需要更多的CPU来处理,到最后会导致无法提供服务为了防范这类特殊的攻击,Redis 的哈希函数使用per-excution 的伪随机种子。
Redis 用qsort 算法来实现 SORT 命令。当前这个算法还不算随机的,所以通过有意构造输入可能引发最糟糕情况的算法复杂度。
字符串转义和NoSQL注入
Redis 的协议没有字符串转移的概念,因此一般情况下普通客户端无法实现注入的。该协议采用二进制安全的前缀长度字符串。通过 EVAL 和 EVALSHA 命令运行 Lua 脚本也是安全的。虽然这是个很奇怪的用法,应用程序应避免使用不明来源的字符串来写Lua 脚本。
代码安全
在传统架构的 Redis 中,客户端是可以使用全部命令的,但是访问 Redis 实例时是没有能力控制运行着 Redis 的系统的。本质上,Redis 使用一直的最好的编程方法来写安全的代码,防止出现缓存溢出,格式错误和其他内存损坏问题。但是,使用 CONFIG 命令修改服务器配置的能力使得用户可以改变程序的工作目录和备份文件的名字。这让用户可以将 RDB 文件写在任意路径,这个安全问题容易引起不受信任的代码在 Redis 上运行。
Redis 不需要 root 权限来运行,建议使用仅能运行 Redis 的用户运行。Redis 的作者正在调查给 Redis 增加一个新参数来防止 CONFIG SET/GET dir 和其它命令运行时配置指令的可能。这可以防止客户端强制要求服务器在任意位置写文件。
需要的Java架构师方面的资料可以关注之后私信哈,回复“资料”领取免费架构视频资料,记得要点赞转发噢!!!
相关推荐
- Java培训机构,你选对了吗?(java培训机构官网)
-
如今IT行业发展迅速,不仅是大学生,甚至有些在职的员工都想学习java开发,需求量的扩大,薪资必定增长,这也是更多人选择java开发的主要原因。不过对于没有基础的学员来说,java技术不是一两天就能...
- 产品经理MacBook软件清单-20个实用软件
-
三年前开始使用MacBookPro,从此再也不想用Windows电脑了,作为生产工具,MacBook可以说是非常胜任。作为产品经理,值得拥有一台MacBook。MacBook是工作平台,要发挥更大作...
- RAD Studio(Delphi) 本月隆重推出新的版本12.3
-
#在头条记录我的2025#自2024年9月,推出Delphi12.2版本后,本月隆重推出新的版本12.3,RADStudio12.3,包含了Delphi12.3和C++builder12.3最...
- 图解Java垃圾回收机制,写得非常好
-
什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用...
- Centos7 初始化硬盘分区、挂载(针对2T以上)添加磁盘到卷
-
1、通过命令fdisk-l查看硬盘信息:#fdisk-l,发现硬盘为/dev/sdb大小4T。2、如果此硬盘以前有过分区,则先对磁盘格式化。命令:mkfs.文件系统格式-f/dev/sdb...
- 半虚拟化如何提高服务器性能(虚拟化 半虚拟化)
-
半虚拟化是一种重新编译客户机操作系统(OS)将其安装在虚拟机(VM)上的一种虚拟化类型,并在主机操作系统(OS)运行的管理程序上运行。与传统的完全虚拟化相比,半虚拟化可以减少开销,并提高系统性能。虚...
- HashMap底层实现原理以及线程安全实现
-
HashMap底层实现原理数据结构:HashMap的底层实现原理主要依赖于数组+链表+红黑树的结构。1、数组:HashMap最底层是一个数组,称为table,它存放着键值对。2、链...
- long和double类型操作的非原子性探究
-
前言“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。其实这里的某些jvm是指...
- 数据库DELETE 语句,还保存原有的磁盘空间
-
MySQL和Oracle的DELETE语句与数据存储MySQL的DELETE操作当你在MySQL中执行DELETE语句时:逻辑删除:数据从表中标记为删除,不再可见于查询结果物理...
- 线程池—ThreadPoolExecutor详解(线程池实战)
-
一、ThreadPoolExecutor简介在juc-executors框架概述的章节中,我们已经简要介绍过ThreadPoolExecutor了,通过Executors工厂,用户可以创建自己需要的执...
- navicat如何使用orcale(详细步骤)
-
前言:看过我昨天文章的同鞋都知道最近接手另一个国企项目,数据库用的是orcale。实话实说,也有快三年没用过orcale数据库了。这期间问题不断,因为orcale日渐消沉,网上资料也是真真假假,难辨虚...
- 你的程序是不是慢吞吞?GraalVM来帮你飞起来性能提升秘籍大公开
-
各位IT圈内外的朋友们,大家好!我是你们的老朋友,头条上的IT技术博主。不知道你们有没有这样的经历:打开一个软件,半天没反应;点开一个网站,图片刷不出来;或者玩个游戏,卡顿得想砸电脑?是不是特别上火?...
- 大数据正当时,理解这几个术语很重要
-
目前,大数据的流行程度远超于我们的想象,无论是在云计算、物联网还是在人工智能领域都离不开大数据的支撑。那么大数据领域里有哪些基本概念或技术术语呢?今天我们就来聊聊那些避不开的大数据技术术语,梳理并...
- 秒懂列式数据库和行式数据库(列式数据库的特点)
-
行式数据库(Row-Based)数据按行存储,常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常见的列数据库有Hb...
- AMD发布ROCm 6.4更新:带来了多项底层改进,但仍不支持RDNA 4
-
AMD宣布,对ROCm软件栈进行了更新,推出了新的迭代版本ROCm6.4。这一新版本里,AMD带来了多项底层改进,包括更新改进了ROCm的用户空间库和AMDKFD内核驱动程序之间的兼容性,使其更容易...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)