Redis数据库安全详解

目录
  • 前言
  • 开放最小化很重要
  • 认证不可少
  • 防止管理员误操作也很重要
  • 担心网络被监听? 开启TLS之旅吧
  • 总结

前言

本篇文章基于的Redis 的环境为: redis_version:7.0.5

文档内容均为学习Redis 官方文档心得.

Redis相信大家都或多或少都听说过吧,作为内存数据库的代表, 但是近些年Redis 被攻击的典范也是越来越多,我们将如何防护Redis 安全呢? 跟着我们的脚本,来看看这篇文章吧.

对于Redis而言,我们设置的方法大概有以下几种

  • 通过redis.conf 设置。
  • 在已经启动的Redis 中使用CONFIG SET 来设置。

如之前所述,安全方面归根结底,总结一句话就是:最好的安全设置就是最小化权限。

那我们来看下,Redis 有哪些安全设置呢?

开放最小化很重要

作为Redis 服务器而言, 应该仅允许受信任的客户端访问,其他访问都应该拒绝,因此也善用防火墙相当重要,当然这个防火墙不是在Redis 是做不了的,应该在Redis 所属的机器进行设置。

若该Redis 是自建于本地实体机中,那么应该考虑防火墙软件,例如: iptablesfirewalld 等。若是存在于各云厂商实例中(ECS ),那么应该善用云厂商提供的防火墙。

那我们Redis 在这一步就什么也不能做了么? 不是的,在Redis 配置中,有一个配置参数为bind ,该参数选项是将Redis对相应的网卡监听,若配置如下:

bind 127.0.0.1

则监听在本地的回环地址上,若该值为空,则监听所有的网卡(3.2版本提供的功能)。

若想监听在多个网卡上的话,ip 地址直接可以使用空格分开即可,例如:

bind 127.0.0.1 10.0.2.15

则该配置则是监听到127.0.0.1 以及 10.0.2.15 网卡上。

在已经启动的Redis 中,想查看Redis 监听到哪些网卡上,除了查看所属机器的网路状态外,还可以通过CONFIG GET bind 来获取。

除此之外,Redis还为我们提供了"保护模式",即配置: protected-mode ,默认为yes 。请不要关闭它,因为它能够检测到启动后的Redis 是否安全,其检测策略为:当Redis 没有设置密码的时候,从外部进行访问,这就会触发它的保护模式,即向访问用户提示信息:

Redis is running in protected mode because protected mode is enabled and no password is set for the default user.

当然网上很多博客提供的最快解决如上问题的方法是关闭其保护模式,请不要这么做.

认证不可少

接上一段落,若Redis 想从外部进行访问,除了关闭保护模式以外,还可以设置Redis 密码. 在Redis 中,通过配置requirepass 来设置密码,不过设置密码应当注意一下,Redis 密码不应该设置为若密码,建议设置为复杂密码.

原因如下:

  • 客户端在校验身份的时候,使用的是auth 命令,可以理解为是Redis 的普通命令,即能够被无限执行,换言之有被爆破的可能.
  • redis-cli可以通过加载客户端的redis.conf 文件来校验服务器, 不需要管理员记住密码.

如上所属,客户端在校验身份的时候,发送的是auth 命令,该命令可以理解为Redis 的普通命令,是没有被加密的, 若请求报文被监听了,也有泄密的可能. 所以尽可能的使用加密进行通信,即: SSL/TLS.

防止管理员误操作也很重要

Redis中有一些非常危险的命令,例如: FLUSHALL ,FLUSHDB ,该命令前者是清空所有的数据,后则是清空当前库的数据, 在日常工作中,如果误操作了,那后果不堪设想. 还有一些命令,运行后可能会导致系统阻塞,非常不建议使用,例如:KEYS ,HGETALL等.

基于上述情况,禁用某些命令来保证系统安全是非常有必要的, 好在Redis给我们提供了方法. 若想禁用某些命令,可以在其服务器redis.conf 配置文件中,使用rename-command 指令,例如:

rename-command FLUSHALL ""
rename-command FLUSHDB ""

若设置为空的话,则是禁止使用命令.修改配置,启动服务器后,若再使用这些命令,即会报错: ERR unknown command .

若并非想禁用命令,而是想重命名命令,那么将空字符串修改为重命名后的命令即可,例如:

rename-command KEYS FINDALL

设置后,即可使用FINDALL 来代替KEYS , 案例如下:

127.0.0.1:6379> set juejinNmae pdudo
OK
127.0.0.1:6379> FINDALL *
1) "juejinNmae"
127.0.0.1:6379>

担心网络被监听? 开启TLS之旅吧

开启ssl/tls 后势必会降低Redis 的吞吐量,所以是否采用该配置主要还是看业务情况,若业务想要避免被抓包等,适合开启该设置,若仅在某一内网使用,那就没必要的.

Redis 6.0 以后启用了SSL/TLS ,但是注意, 若想使用SSL/TLS 的话,在编译的时候需要指定make BUILD_TLS=yes , 这里需要注意的是, 客户端和服务器都需要编译才行.

这里简单举个例子如何启动Redis吧.

证书生成

openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

数据库启动

redis-server --tls-port 6379 --port 0  --tls-cert-file ca.crt --tls-key-file ca.key  --tls-ca-cert-file ca.crt

客户端连接

redis-cli --tls --cert ca.crt --key ca.key  --cacert ca.crt

在使用SSL/TLS 后,我们需要禁用非TLS 端口并且开启SSL/TLS 端口后,可以直接设置:

port 0
tls-port 6379

这样的话,通过6379 连接,默认情况下是走的SSL/TLS

总结

安全一直是大家比较关心的话题,在Redis 中,我们不仅仅要防外部入侵, 还要知道, 技术人员的误操作也许破坏的更为严重, 始终需要记住, 权限最小化.不仅对外,也需要对内.

以上就是Redis数据库安全详解的详细内容,更多关于Redis数据库安全的资料请关注我们其它相关文章!

(0)

相关推荐

  • redis缓存数据库中数据的方法

    本文实例为大家分享了redis缓存数据库中数据的具体代码,供大家参考,具体内容如下 将数据库的数据保存到redis缓存 当第一次查询时,缓存没有对应的数据,则会查询数据库,并将数据更新到缓存当缓存中有对应的数据时,则会直接访问缓存,则不查询数据库这样在性能优化上有很大的帮助 ProvinceServiceImpl public class ProvinceServiceImpl implements ProvinceService {     private ProvinceDao dao =

  • Redis 操作多个数据库的配置的方法实现

    目录 前言 一.添加pom 依赖 二.多数据源的配置和添加到spring容器中 三.使用方式 结语: 前言 redis 默认有 0-16 号数据库,一般我们操作redis时,用的是 0号数据库,但是有时我们的项目想同时操作多个数据库,又不想每次访问其它库数据时 select 切换数据库,这样太繁琐. 因此我们需要配置多个Jedis Client,但是jedis是容易阻塞,效率不太好,所以我这边采用了 Lettuce Client,它是 Reactive 的连接方式,效率比较高.但是怎么使用到 L

  • 手把手教你用Redis 实现点赞功能并且与数据库同步

    目录 一.Redis 缓存设计及实现 SpringBoot整合Redis 二.点赞数据在 Redis 中的存储格式 用 Redis 存储两种数据: 三.数据库设计 四.开启定时任务持久化存储到数据库 1. 添加依赖 2. 编写配置文件 3. 编写执行任务的类继承自 QuartzJobBean 五.注意事项 一.Redis 缓存设计及实现 Linux下安装Redis或者Docker下安装Redis并且启动(redis-server) SpringBoot整合Redis 1.在 pom.xml 中引

  • Redis数据库的安装和配置教程详解

    目录 1.Redis安装 1.1.Linux环境安装Redis 1.2.Windows环境安装Redis 2.2.安装Redis图形客户端 2.3.Redis持久化简述 3.Redis配置参数 1.Redis安装 1.1.Linux环境安装Redis step-1:下载Redis 进入官网找到下载地址https://redis.io/download wget https://github.com/redis/redis/archive/7.0.0.tar.gz step-2:解包 tar -z

  • Python操作Redis数据库的超详细教程

    目录 介绍 常用数据结构 安装 连接 String 字符串(键值对) List 列表 Hash 哈希 Set 集合 Zset 有序集合 Bitmap 位图 全局函数 总结 介绍 Redis是一个开源的基于内存也可持久化的Key-Value数据库,采用ANSI C语言编写.它拥有丰富的数据结构,拥有事务功能,保证命令的原子性.由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快.实时通讯.缓存等.但内存数据库通常要考虑机器的内存大小. Redis有16个逻辑数据库(db0

  • Go语言操作redis数据库的方法

    先上命令速查网站,菜鸟yydshttps://www.runoob.com/redis/redis-strings.html操作redis的包是go-redis/redis官方文档 https://redis.uptrace.dev/guide/github https://github.com/go-redis/redis 创建项目创建test文件夹创建 Redis_test.go 文件直接上代码,代码解释全写在注释里 package test import ( "context"

  • Redis数据库安全详解

    目录 前言 开放最小化很重要 认证不可少 防止管理员误操作也很重要 担心网络被监听? 开启TLS之旅吧 总结 前言 本篇文章基于的Redis 的环境为: redis_version:7.0.5 文档内容均为学习Redis 官方文档心得. Redis相信大家都或多或少都听说过吧,作为内存数据库的代表, 但是近些年Redis 被攻击的典范也是越来越多,我们将如何防护Redis 安全呢? 跟着我们的脚本,来看看这篇文章吧. 对于Redis而言,我们设置的方法大概有以下几种 通过redis.conf 设

  • spring集成redis cluster详解

    客户端采用最新的jedis 2.7 1.maven依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> 2.增加spring 配置 <bean name="genericObjectPoolConfig"

  • 最详细的docker中安装并配置redis(图文详解)

    一.找到一个合适的docker的redis的版本 可以去docker hub中去找一下 https://hub.docker.com/_/redis?tab=tags 二.使用docker安装redis sudo docker pull redis 安装好之后使用docker images即可查看 truedei@truedei:~$ truedei@truedei:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis

  • Redis中ServiceStack.Redis和StackExchange.Redis区别详解

    目前Redis已经更新到了6.0.2,那目前StackExchange.Redis 和 ServiceStack.Redis 两个客户端有什么区别呢? StackExchange.Redis 客户端是开源免费,而ServiceStack.Redis目前我测试了4.0以上版本就有每个小时6000的限制.性能方面,对比测试,ServiceStack比StackExchange性能上高将近50%. 以上分别是5000条和10w条数据写入读入比对,我这是将ServiceStack解除了每小时6000条数

  • SpringBoot中对应2.0.x版本的Redis配置详解

    properties格式: # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.po

  • Redis安全策略详解

    目录 缓存穿透 缓存击穿 缓存雪崩 布隆过滤器 基于布隆过滤器解决缓存穿透问题 缓存穿透 高并发情况下查询一个不存在的key 产生的背景(原因): 缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都要穿透到后端数据库查询,使得数据库的压力非常大,甚至导致数据库服务压死: 解决方案: 接口层实现api限流.用户授权.id检查等: 从缓存和数据库都取不到数据的话,一样将数据库空值放入缓存中,设置30s有效期避免使用同一个id对数据库攻击压力大: 布隆过滤器 缓存击穿

  • Golang分布式应用之Redis示例详解

    目录 正文 分布式锁 运行测试 分布式过滤器 运行测试 分布式限流器 运行测试 其他 正文 Redis作是一个高性能的内存数据库,常被应用于分布式系统中,除了作为分布式缓存或简单的内存数据库还有一些特殊的应用场景,本文结合Golang来编写对应的中间件. 本文所有代码见github.com/qingwave/go… 分布式锁 单机系统中我们可以使用sync.Mutex来保护临界资源,在分布式系统中同样有这样的需求,当多个主机抢占同一个资源,需要加对应的“分布式锁”. 在Redis中我们可以通过s

  • CentOS6.4 安装Redis 教程详解

    按照下面步骤依次执行 1.检查依赖,安装依赖 [root@ecs-3c46 ~]# whereis gcc gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz [root@ecs-3c46 ~]# whereis tc tc: /sbin/tc /usr/lib64/tc /usr/share/tc /usr/share/man/man8/tc.8.gz [root@ecs-3c46 ~]# w

  • linux 常见的标识与Redis数据库详解

    xxx@xxx:~$ : 第一个 xxx 只的是 用户名 第二个 xxx 代表的是 HOST主机 ~ : 当前用户的根, 根的位置在 /home/用户名 $ : 代表当前用户是一个普通用户 # : 代表当前用户是超级用户 查看当前命令所在的位置 pwd 文件夹/文件的常见命令 mkdir ls rmdir rm 创建文件夹mkdir mkdir test mkdir .test mkdir ~/test mkdir /home/xxx/test -- 递归的创建 test/a/b目录 mkdir

  • Redis配置文件详解

    如果认为Redis是一个key value存储, 可以使用它来代替MySQL:如果认为它是一个可以持久化的cache, 可能只是用它保存一些频繁访问的临时数据(代替Memcached):除此之外,还可以把Redis当做一个轻量级的消息队列使用,因为它内置就支持 list数据结构和PUB/SUB命令:还可以当做一个轻量级的分布式锁系统.Redis是REmote DIctionary Server的缩写,在Redis在官方网站的解释是: 复制代码 代码如下: Redis is an open sou

随机推荐