百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

守护 Redis 安全的几个策略,你了解过几个呢?

mhr18 2024-11-01 12:19 13 浏览 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架构师方面的资料可以关注之后私信哈,回复“资料”领取免费架构视频资料,记得要点赞转发噢!!!

相关推荐

Docker集群管理之Docker Compose

前言:在上一篇《Docker集群管理之DockerMachine》中,我们通过源码分析了解了DockerMachine的工作原理,使用者可以通过DockerMachine的一条命令在任意支持的平...

使用Dockerfile build镜像

Docker映像可以看作是Docker容器的压缩包,包含了应用程序以及运行应用程序所需的依赖,容器是映像的运行时实例。一般构建镜像都是使用dockerfile进行构建而不是dockercommit,...

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册:Docker一键部署Immich,照片视频备份利器前言随着人们手机、PC、平板等电子产品多样,我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重...

docker容器的使用以及部署mysql

首先什么是docker官方:翻译:Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用Docker,您可以像管理应...

自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用
自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用

写在前面:流程十分简单,有手就行,还请耐心看完。本文的实例仅做演示用,不久后将会删除,有需要的各位请自行搭建。免费实例如果15分钟内未收到入站流量,Render会关闭实例的网络服务。Render会在下次收到处理请求时重新启动该服务。Ren...

2025-05-24 15:40 mhr18

用了8年的方式-用 Docker 瞬间搭建本地开发环境

有些时候我们需要在本地搭开发环境,比如平时学习新技术的时候。或者有时候公司的项目需要在本地建一套类似的,方便调试修改。开发环境可能包括MySQL、Redis、Nginx、MQ、Elasticsea...

使用dockerfile构建docker镜像

准备工作购买vps使用ssh工具连接上1、更新系统aptupdate-y2、一键安装Dockercurl-fsSLhttps://get.docker.com-oget-docker.sh...

快速搭建 SpringCloud 微服务开发环境的脚手架

本文适合有SpringBoot和SpringCloud基础知识的人群,跟着本文可使用和快速搭建SpringCloud项目。本文作者:HelloGitHub-秦人HelloGitHub推出...

Docker Hub最全详解(图文全面总结)

DockerHubDockerHub是一个由Docker公司负责维护的公共注册中心,它包含了超过15000多个可用来下载和构建容器的Docker镜像。DockerHub作用Docker好比一个代...

Docker 命令详解

dockerimages—查看本地镜像命令dockerimages说明列出本地已下载的所有镜像及其标签、ID、大小等信息。适用场景查看本地镜像资源、准备删除或管理镜像时。常见用法docker...

Kylin安装Dify

cd/mntgitclonehttps://github.com/langgenius/dify.gitcp/mnt/dify/docker/.env.example/mnt/dif...

kali下对Docker的详细安装

Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建、运行、测试以及部署应用程序。如,我们对一些漏洞进行本地复现时,可以使用Docker快速搭建漏洞环境,完成复现学习。注:本教程仅...

银河麒麟V10使用Docker方式部署应用

现在越来越多的企业级应用需要运行在国产化环境中,而银河麒麟V10是目前我碰到的最常用的服务器,在银河麒麟上部署应用有两种方式:使用二进制文件编译部署和使用Docker。关于使用二进制文件的方式...

Docker入门到精通超详细教程,Docker全家桶实战攻略

大家好,我是各位双生的武魂、随身老爷爷。从看到这篇内容开始,你就是被选定的天命骚年,将承担起学完docker教程的使命,本使命为单向契约,你可选择YES或者选择YES。正式学习之前,我先给大家做一下d...

【Docker 新手入门指南】第一章:前言

一、基本介绍Docker介绍Docker是基于Go语言开发的开源容器化平台,旨在实现“一次镜像,处处运行”。它通过将应用程序及其依赖环境(代码、运行时、系统工具、系统库等)打包成一个轻量级、可移...

取消回复欢迎 发表评论: